



  

<!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-5c4e9fc574bf49f3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0f910d8806d5761b.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-a7abd4d4c49ac593.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-5fc4c4a9cb41e596.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-ed0cee9214dedabd.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-78a2491d538dab5a.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-c26b63d7c532d0a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-a6f60cea68c08405.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-f66faf28b2ea18b6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6701f6218c53cf5b.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-7037fa46ae124d97.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-97df7784617ce1ea.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-9be9fe6313f476af.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-62747e27e61258dc.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-7a418ea859d1654d.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-72bd7d974b5ac1cc.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-4c5c0895f723f870.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","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_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","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_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_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","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_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_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_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_index_data_router","issues_lazy_load_comment_box_suggestions","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_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","milestone_show_data_router","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","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_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","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_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","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-b752d992928a526c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-81e2b8334c3d06e9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-2f08c823163591a8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-633ad94fa06c334b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-0fb4c544a797ec0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-7c872b58ac9f1b39.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-7e9817cf5c068979.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-55602924fdf21863.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.bef03fb24bb03be8.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-0417f617ad744a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-f1498fec45311acd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7aa1ff0a0e750f41.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-9697c1c8f5cbf523.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-e067f5c4473bffff.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-40ea91c5fde7f30c.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-524a06aa946df6fc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-b1ee53c2200b172a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-7bf7b9d689fe3d10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-ca3bc10b816bcc1f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-21ec1e439ee2d87c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-4c39f7195fc42cc8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb-53cfff089eaac51b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-4d9cf83cf08e1643.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-6991af5b3829ffe8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nfv-a6c14301d3ea6d67.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b5-a2fde30ce0c692b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sw-9d0489dbf9a9c942.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ttf-7d5abe1b447ced2c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sj-c7a44023ee90d468.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0pd-c46d8dfae89c2b64.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-c8ee397a71bcb700.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.255cab819a92f7e1.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-073e7d742fb703f1.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-8503588299651923.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-66e64888bc4615bb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a9404625ec30bbc7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-8f9f1d6be01d6a22.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-68d09e5e8a80cb94.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-0cb3f75cec297941.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-cd9039ad946274ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-00bd469c4017a543.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-2d03f5e6d4fdd54d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gru-2b0fac8887ff8c57.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a0-234e967e7c6d22ce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gz3-5bdfbfceac967bb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/15m-64f3034430471048.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1e-c15441bdb94d54ae.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-6ad9a0527a5d7afd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi-3a42b8714e06c4d0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tu1-37e16844272ddefa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-ac66ededed061993.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gmn-1e5497c041b66231.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-d1b2a63015b5eb6d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2-e85522be441acf73.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-baf0a4193779952e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-87dce99c82a27004.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zkm-116b01b8485bbe3f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-518d12c9e011601d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-947db365ea875cfa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/14-8c7b4ad3c845664c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-2e7d883cb843e9e6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-38012819307fd539.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-6607da3b8b579202.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-f43eb09c2be69457.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-107312645ac2b72d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-fa7cdc0f7656d876.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p0l-fe491d943adf7508.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v1e-d099d9fd21ad25e5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fn-7b298a45c55fb6fb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7cw-6e493a20eaaa04b5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ok-290e4b9465ba9c5b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6d-ca6d584a0fd6368c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y8-e2f18f5a24733f3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-3fd4a2e7dcbad8e2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vjg-2874f95f389c4d3f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-16afdcf183d11968.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.de2b1dde0494f261.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.85de0b1d47e09052.module.css" />


  <title>lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash · 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:95d5ebf8-f92b-0b21-5e53-acd3db5e0695">

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


  <meta name="request-id" content="A9F6:2E99D0:F8DECE:ECB3C2:6AC77B54" data-pjax-transient="true"/><meta name="html-safe-nonce" content="2e321f5e7c5b8e19f65e369d89aa46c6d2384cf23b2cb043171d50d5681cc3f4" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBOUY2OjJFOTlEMDpGOERFQ0U6RUNCM0MyOjZBQzc3QjU0IiwidmlzaXRvcl9pZCI6IjgyNjE4NjYwNDY2MjIyMzU0NzYiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="c462c595801b3e3a27660d9ebe754bbc1a09646caa88e9967faf6d15a22c9703" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1037831724" 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="AI coding agent and terminal. Write code with natural language from your shell. - lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash">

      <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/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/2546e56246b93e22422df8a741cd5daa2570c78677bbe002e26b8f9c04592801/lacymorrow/lash" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash" /><meta name="twitter:description" content="AI coding agent and terminal. Write code with natural language from your shell. - lacymorrow/lash" />
  <meta property="og:image" content="https://opengraph.githubassets.com/2546e56246b93e22422df8a741cd5daa2570c78677bbe002e26b8f9c04592801/lacymorrow/lash" /><meta property="og:image:alt" content="AI coding agent and terminal. Write code with natural language from your shell. - lacymorrow/lash" /><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="lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash" /><meta property="og:url" content="https://github.com/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md" /><meta property="og:description" content="AI coding agent and terminal. Write code with natural language from your shell. - lacymorrow/lash" />
  




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



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


  <meta http-equiv="x-pjax-version" content="f705e3cc2e7cb8ce0afdb7b21fc6ff6d7afede52aee40bf0eab14ca8b0d69dd6" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="1ff3f1d4e1abd61f6f135b47d3b815e2f7169f8dd418f0118c6b1cf4de6cbc86" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="1246934c1e1d4eb010e1cfa4ca517994cfab78ea050086b069045122415a52dd" 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/lacymorrow/lash git https://github.com/lacymorrow/lash.git">

  <meta name="octolytics-dimension-user_id" content="1311301" /><meta name="octolytics-dimension-user_login" content="lacymorrow" /><meta name="octolytics-dimension-repository_id" content="1037831724" /><meta name="octolytics-dimension-repository_nwo" content="lacymorrow/lash" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="true" /><meta name="octolytics-dimension-repository_parent_id" content="975734319" /><meta name="octolytics-dimension-repository_parent_nwo" content="anomalyco/opencode" /><meta name="octolytics-dimension-repository_network_root_id" content="975734319" /><meta name="octolytics-dimension-repository_network_root_nwo" content="anomalyco/opencode" />
  



    

    <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="3ea5e9da9090cfec2f1df3ba60c98d7d544d5137" 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/qc-1bbbe8787ea1cd4b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-10dbdab24559c7cd.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.4dd73a4e016c1ca2.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/app-install-banner-partial-0087e2c1d400f8c6.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.b50f287c48a7f94a.module.css" />

<react-partial
  partial-name="app-install-banner-partial"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-e468179ba7123a2e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rwd-069fc3d9814ff9fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz-e662bc3745e171e7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-3559ee48016881a2.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-7f22b36f29a9dd94.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-4998592d21eb16f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8i-756d611a52e5f265.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-3c37549fa4cc7814.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.05b219cdb8e80c43.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/8i.779dd52a6bc5b0b6.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%2Flacymorrow%2Flash%2Fblob%2Flash%2FUPSTREAM_SYNC.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=lacymorrow%2Flash","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/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md\",\"user_id\":null}}","auth_hydro_click_hmac":"8092f9a67e2478edc4c9b7ef8c5d5462680d531277d04f06d6871b3aab22d25e","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%2Flacymorrow%2Flash%2Fblob%2Flash%2FUPSTREAM_SYNC.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/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8092f9a67e2478edc4c9b7ef8c5d5462680d531277d04f06d6871b3aab22d25e"><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%2Flacymorrow%2Flash%2Fblob%2Flash%2FUPSTREAM_SYNC.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/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8092f9a67e2478edc4c9b7ef8c5d5462680d531277d04f06d6871b3aab22d25e"><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=lacymorrow%2Flash" 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/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8092f9a67e2478edc4c9b7ef8c5d5462680d531277d04f06d6871b3aab22d25e"><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-dc76c2f7-f00d-4b3f-b503-5ef97e8a4b1c" aria-labelledby="tooltip-09a6a117-9497-4fcd-9faa-ccc16efeb3f9" 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-09a6a117-9497-4fcd-9faa-ccc16efeb3f9" for="icon-button-dc76c2f7-f00d-4b3f-b503-5ef97e8a4b1c" 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" >
      
      








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-1a7ce813a378e1f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mn-bb458474353a279e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t5-26d19272bbf73ca3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2d5-9abb2f6ba5c935d0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24-b11e1c4108322883.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mrn-12afac2ecd2be980.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dgq-bbf7670f9cdba2e0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7w-740b4e942974ccba.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/we-c9f93392098ad6c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/775-5adcc74216a7c5ae.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bn-fcef0645a47703fc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xgw-6c6cb7b2ed77f52e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ge-ca1c0ba8656f9680.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9f-e543bc691db8262e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-c7f96cdc425f375d.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.1943548049515ee8.module.css" />

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"lacymorrow","is_root":false,"href":"/lacymorrow"},{"crumb_type":"repository","label":"lash","is_root":false,"octicon":"repo-forked","href":"/lacymorrow/lash"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/lacymorrow/lash","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"commandId":"repositories:go-to-code","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/lacymorrow/lash/pulls","selectedLinks":["repo_pulls","checks"],"count":1,"popoverTarget":false,"commandId":"repositories:go-to-pull-requests","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/lacymorrow/lash/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"commandId":"repositories:go-to-actions","reactNav":{"appTarget":"actions-workflows","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/lacymorrow/lash/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"popoverTarget":false,"commandId":"repositories:go-to-projects","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security-and-quality","icon":"shield","label":"Security and quality","href":"/lacymorrow/lash/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-security","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/lacymorrow/lash/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"commandId":"repositories:go-to-insights","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"localNavigationUpdateChannel":null,"selectedLink":"repo_source"},"owner":null,"headerLogo":{"href":"/","aria-label":"Homepage "},"notifications":{"indicatorMode":"disabled","websocketChannel":null,"fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":false},"issues":{"href":"/issues"},"pulls":{"href":"/pulls"},"contributedRepos":{"href":"/repos"},"copilot":{"show":false,"showAgentsButton":false,"showRelaunchAnnouncement":false,"copilotChatUrl":null,"copilotApiUrl":"https://api.githubcopilot.com"},"search":{"show":true,"showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"searchContext":{"scope":"repo:lacymorrow/lash","current_repo_name":"lash","current_repo_nwo":"lacymorrow/lash","user_id":"lacymorrow"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=6","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/lacymorrow" data-discover="true"><span class="">lacymorrow</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/lacymorrow/lash" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">lash</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-repo-forked styles-module__trailingIcon__sCKDh" viewBox="0 0 16 16" width="12" height="12" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><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></a></li></ol></nav></div><div data-testid="top-nav-right" data-component="Stack" class="styles-module__right__mlBQg styles-module__withLocalNavigation__rjTJ_ styles-module__rightWithResponsiveCreateButton__SKn2W prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj prc-UnderlineNav-UnderlineWrapper-GWONT LocalNavigation-module__LocalNavigation__b0Xc0" aria-label="Repository" data-variant="inset" data-overflow-mode="wrap" data-hide-icons-breakpoint="medium"><ul class="prc-UnderlineNav-ItemsList-oj8gN prc-components-UnderlineItemList-xKlKC" role="list"><li role="presentation" aria-hidden="true" class="prc-UnderlineNav-WrapSpacer--aLgz"></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a aria-current="page" data-tab-item="code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code" 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></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="pull-requests" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash/pulls" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><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-component="text" data-content="Pull requests">Pull requests</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">1</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->1<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="actions" data-react-nav="actions-workflows" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash/actions" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><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-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="projects" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash/projects" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-table" 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.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-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="security-and-quality" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash/security" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><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-component="text" data-content="Security and quality">Security and quality</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="insights" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/lacymorrow/lash/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><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-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktl_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" 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></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



<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="/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.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":"Upstream Sync Guide","anchor":"upstream-sync-guide","htmlText":"Upstream Sync Guide"},{"level":2,"text":"Overview","anchor":"overview","htmlText":"Overview"},{"level":2,"text":"Quick Sync (recurring)","anchor":"quick-sync-recurring","htmlText":"Quick Sync (recurring)"},{"level":2,"text":"Conflict Playbook","anchor":"conflict-playbook","htmlText":"Conflict Playbook"},{"level":3,"text":"1. Package version conflicts (packages/*/package.json, sdks/vscode/package.json)","anchor":"1-package-version-conflicts-packagespackagejson-sdksvscodepackagejson","htmlText":"1. Package version conflicts (packages/*/package.json, sdks/vscode/package.json)"},{"level":3,"text":"2. Root package.json — patchedDependencies","anchor":"2-root-packagejson--patcheddependencies","htmlText":"2. Root package.json — patchedDependencies"},{"level":3,"text":"3. packages/extensions/zed/extension.toml","anchor":"3-packagesextensionszedextensiontoml","htmlText":"3. packages/extensions/zed/extension.toml"},{"level":3,"text":"4. packages/sdk/js/src/v2/gen/types.gen.ts","anchor":"4-packagessdkjssrcv2gentypesgents","htmlText":"4. packages/sdk/js/src/v2/gen/types.gen.ts"},{"level":3,"text":"5. packages/opencode/src/server/server.ts","anchor":"5-packagesopencodesrcserverserverts","htmlText":"5. packages/opencode/src/server/server.ts"},{"level":3,"text":"6. packages/opencode/src/tool/bash.ts","anchor":"6-packagesopencodesrctoolbashts","htmlText":"6. packages/opencode/src/tool/bash.ts"},{"level":3,"text":"7. packages/opencode/src/session/prompt.ts (MAJOR)","anchor":"7-packagesopencodesrcsessionpromptts-major","htmlText":"7. packages/opencode/src/session/prompt.ts (MAJOR)"},{"level":3,"text":"8. packages/opencode/src/cli/cmd/tui/app.tsx","anchor":"8-packagesopencodesrcclicmdtuiapptsx","htmlText":"8. packages/opencode/src/cli/cmd/tui/app.tsx"},{"level":3,"text":"9. packages/opencode/src/cli/cmd/tui/routes/home.tsx","anchor":"9-packagesopencodesrcclicmdtuirouteshometsx","htmlText":"9. packages/opencode/src/cli/cmd/tui/routes/home.tsx"},{"level":3,"text":"10. packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx (MAJOR)","anchor":"10-packagesopencodesrcclicmdtuicomponentpromptindextsx-major","htmlText":"10. packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx (MAJOR)"},{"level":3,"text":"12. packages/opencode/src/config/keybinds.ts","anchor":"12-packagesopencodesrcconfigkeybindsts","htmlText":"12. packages/opencode/src/config/keybinds.ts"},{"level":3,"text":"13. bun.lock","anchor":"13-bunlock","htmlText":"13. bun.lock"},{"level":2,"text":"Post-Merge QA Checklist","anchor":"post-merge-qa-checklist","htmlText":"Post-Merge QA Checklist"},{"level":3,"text":"Prompt border","anchor":"prompt-border","htmlText":"Prompt border"},{"level":3,"text":"Keybinds","anchor":"keybinds","htmlText":"Keybinds"},{"level":3,"text":"Execution mode indicator","anchor":"execution-mode-indicator","htmlText":"Execution mode indicator"},{"level":3,"text":"Shell mode","anchor":"shell-mode","htmlText":"Shell mode"},{"level":3,"text":"Working directory","anchor":"working-directory","htmlText":"Working directory"},{"level":3,"text":"Typecheck","anchor":"typecheck","htmlText":"Typecheck"},{"level":2,"text":"What Lash Preserves (invariants)","anchor":"what-lash-preserves-invariants","htmlText":"What Lash Preserves (invariants)"},{"level":2,"text":"Automating the Sync (future)","anchor":"automating-the-sync-future","htmlText":"Automating the Sync (future)"},{"level":2,"text":"Sync History","anchor":"sync-history","htmlText":"Sync History"}]},"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\"\u003eUpstream Sync Guide\u003c/h1\u003e\u003ca id=\"user-content-upstream-sync-guide\" class=\"anchor\" aria-label=\"Permalink: Upstream Sync Guide\" href=\"#upstream-sync-guide\"\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\"\u003eLash is a fork of \u003ca href=\"https://github.com/anomalyco/opencode\"\u003eanomalyco/opencode\u003c/a\u003e. This document describes how to merge upstream changes into the \u003ccode\u003elash\u003c/code\u003e branch.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOverview\u003c/h2\u003e\u003ca id=\"user-content-overview\" class=\"anchor\" aria-label=\"Permalink: Overview\" href=\"#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\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eUpstream remote\u003c/strong\u003e: \u003ccode\u003eupstream\u003c/code\u003e → \u003ccode\u003ehttps://github.com/anomalyco/opencode.git\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTarget branch\u003c/strong\u003e: \u003ccode\u003elash\u003c/code\u003e — \u003cstrong\u003e\u003ccode\u003elash\u003c/code\u003e is the GitHub default and the working branch. Sync PRs, fixes, and releases target \u003ccode\u003elash\u003c/code\u003e, never \u003ccode\u003edev\u003c/code\u003e.\u003c/strong\u003e (\u003ccode\u003erelease-lash.ts\u003c/code\u003e only force-releases on \u003ccode\u003elash\u003c/code\u003e.) 2026-09-04: syncs through PR #43 had drifted onto \u003ccode\u003edev\u003c/code\u003e; \u003ccode\u003edev\u003c/code\u003e was merged back into \u003ccode\u003elash\u003c/code\u003e at \u003ccode\u003eaa19cdfb11\u003c/code\u003e and \u003ccode\u003edev\u003c/code\u003e is no longer a working branch.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMerge target\u003c/strong\u003e: \u003ccode\u003eupstream/dev\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\"\u003eQuick Sync (recurring)\u003c/h2\u003e\u003ca id=\"user-content-quick-sync-recurring\" class=\"anchor\" aria-label=\"Permalink: Quick Sync (recurring)\" href=\"#quick-sync-recurring\"\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=\"# 1. Fetch upstream\ngit fetch upstream\n\n# 2. Merge (no fast-forward, no auto-commit so conflicts can be resolved)\ngit merge upstream/dev --no-commit --no-ff\n\n# 3. Resolve conflicts (see \u0026quot;Conflict Playbook\u0026quot; below)\n# ... fix files ...\n\n# 4. Regenerate lockfile\nbun install\n\n# 5. Stage and commit\ngit add -A\ngit commit -m \u0026quot;merge: bring upstream dev into lash\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 1. Fetch upstream\u003c/span\u003e\ngit fetch upstream\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 2. Merge (no fast-forward, no auto-commit so conflicts can be resolved)\u003c/span\u003e\ngit merge upstream/dev --no-commit --no-ff\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 3. Resolve conflicts (see \"Conflict Playbook\" below)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e ... fix files ...\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 4. Regenerate lockfile\u003c/span\u003e\nbun install\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e 5. Stage and commit\u003c/span\u003e\ngit add -A\ngit commit -m \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003emerge: bring upstream dev into lash\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\"\u003eConflict Playbook\u003c/h2\u003e\u003ca id=\"user-content-conflict-playbook\" class=\"anchor\" aria-label=\"Permalink: Conflict Playbook\" href=\"#conflict-playbook\"\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\"\u003eEvery upstream merge tends to produce the same categories of conflicts. This section documents how to resolve each.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. Package version conflicts (\u003ccode\u003epackages/*/package.json\u003c/code\u003e, \u003ccode\u003esdks/vscode/package.json\u003c/code\u003e)\u003c/h3\u003e\u003ca id=\"user-content-1-package-version-conflicts-packagespackagejson-sdksvscodepackagejson\" class=\"anchor\" aria-label=\"Permalink: 1. Package version conflicts (packages/*/package.json, sdks/vscode/package.json)\" href=\"#1-package-version-conflicts-packagespackagejson-sdksvscodepackagejson\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: \u003ccode\u003eversion\u003c/code\u003e field differs between lash (\u003ccode\u003e1.7.x\u003c/code\u003e) and upstream (\u003ccode\u003e1.x.x\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Keep \u003cstrong\u003elash's version\u003c/strong\u003e (\u003ccode\u003e1.7.x\u003c/code\u003e). All packages are versioned together.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Automated fix — keep lash version:\nfor f in packages/*/package.json sdks/vscode/package.json; do\n  python3 -c \u0026quot;\nimport re, sys\ncontent = open('$f').read()\ncontent = re.sub(\n  r'\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; HEAD\\n  \\\u0026quot;version\\\u0026quot;: \\\u0026quot;(1\\.7\\.[^\\\u0026quot;]+)\\\u0026quot;,\\n.*?\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; upstream/dev\\n',\n  r'  \\\u0026quot;version\\\u0026quot;: \\\u0026quot;\\1\\\u0026quot;,\\n',\n  content, flags=re.DOTALL\n)\nopen('$f', 'w').write(content)\n\u0026quot;\ndone\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Automated fix — keep lash version:\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003efor\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ef\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e packages/\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e/package.json sdks/vscode/package.json\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edo\u003c/span\u003e\n  python3 -c \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eimport re, sys\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003econtent = open('\u003cspan class=\"pl-smi\"\u003e$f\u003c/span\u003e').read()\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003econtent = re.sub(\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e  r'\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; HEAD\\n  \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003eversion\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e: \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e(1\\.7\\.[^\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e]+)\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e,\\n.*?\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; upstream/dev\\n',\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e  r'  \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003eversion\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e: \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e\\1\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e,\\n',\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e  content, flags=re.DOTALL\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eopen('\u003cspan class=\"pl-smi\"\u003e$f\u003c/span\u003e', 'w').write(content)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003edone\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2. Root \u003ccode\u003epackage.json\u003c/code\u003e — patchedDependencies\u003c/h3\u003e\u003ca id=\"user-content-2-root-packagejson--patcheddependencies\" class=\"anchor\" aria-label=\"Permalink: 2. Root package.json — patchedDependencies\" href=\"#2-root-packagejson--patcheddependencies\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream replaces the \u003ccode\u003epatchedDependencies\u003c/code\u003e entries; lash adds a \u003ccode\u003efunding\u003c/code\u003e block.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Take \u003cstrong\u003eupstream's patches\u003c/strong\u003e + keep lash's \u003cstrong\u003e\u003ccode\u003efunding\u003c/code\u003e block\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3. \u003ccode\u003epackages/extensions/zed/extension.toml\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-3-packagesextensionszedextensiontoml\" class=\"anchor\" aria-label=\"Permalink: 3. packages/extensions/zed/extension.toml\" href=\"#3-packagesextensionszedextensiontoml\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Version + archive URLs differ.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Keep \u003cstrong\u003elash's version\u003c/strong\u003e (the archive URLs point to anomalyco/opencode — update them to \u003ccode\u003elacymorrow/lash\u003c/code\u003e when publishing to Zed marketplace).\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. \u003ccode\u003epackages/sdk/js/src/v2/gen/types.gen.ts\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-4-packagessdkjssrcv2gentypesgents\" class=\"anchor\" aria-label=\"Permalink: 4. packages/sdk/js/src/v2/gen/types.gen.ts\" href=\"#4-packagessdkjssrcv2gentypesgents\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream reorganizes generated types; lash adds \u003ccode\u003eEventCwdUpdated\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eTake the upstream's large block that reorganizes types (keep nothing from our HEAD section except \u003ccode\u003eEventCwdUpdated\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eEventCwdUpdated\u003c/code\u003e to the \u003ccode\u003eEvent\u003c/code\u003e union type after \u003ccode\u003eEventPermissionReplied\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Keep this type definition:\nexport type EventCwdUpdated = {\n  type: \u0026quot;cwd.updated\u0026quot;\n  properties: {\n    cwd: string\n  }\n}\n\n// In the Event union, add:\n  | EventCwdUpdated\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Keep this type definition:\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e \u003cspan class=\"pl-k\"\u003etype\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEventCwdUpdated\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n  \u003cspan class=\"pl-c1\"\u003etype\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\"cwd.updated\"\u003c/span\u003e\n  \u003cspan class=\"pl-c1\"\u003eproperties\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n    \u003cspan class=\"pl-c1\"\u003ecwd\u003c/span\u003e: \u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e\n  \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// In the Event union, add:\u003c/span\u003e\n  \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEventCwdUpdated\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e5. \u003ccode\u003epackages/opencode/src/server/server.ts\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-5-packagesopencodesrcserverserverts\" class=\"anchor\" aria-label=\"Permalink: 5. packages/opencode/src/server/server.ts\" href=\"#5-packagesopencodesrcserverserverts\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream reorganizes imports.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Take \u003cstrong\u003eupstream's empty section\u003c/strong\u003e (upstream moved imports to other files). Our old \u003ccode\u003egetCwd, CwdEvent\u003c/code\u003e import here was stale and unused.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e6. \u003ccode\u003epackages/opencode/src/tool/bash.ts\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-6-packagesopencodesrctoolbashts\" class=\"anchor\" aria-label=\"Permalink: 6. packages/opencode/src/tool/bash.ts\" href=\"#6-packagesopencodesrctoolbashts\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: The \u003ccode\u003ecwd\u003c/code\u003e variable in \u003ccode\u003eexecute()\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Combine both — use \u003ccode\u003egetCwd()\u003c/code\u003e and \u003ccode\u003eresolvePath()\u003c/code\u003e together:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// WRONG (upstream only):\nconst cwd = params.workdir ? await resolvePath(params.workdir, Instance.directory, shell) : Instance.directory\n\n// WRONG (lash only):\nconst cwd = params.workdir || getCwd()\n\n// CORRECT (combined):\nconst cwd = params.workdir ? await resolvePath(params.workdir, getCwd(), shell) : getCwd()\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// WRONG (upstream only):\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecwd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparams\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eworkdir\u003c/span\u003e ? \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eresolvePath\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eparams\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eworkdir\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-v\"\u003eInstance\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edirectory\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eshell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e : \u003cspan class=\"pl-v\"\u003eInstance\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edirectory\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// WRONG (lash only):\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecwd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparams\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eworkdir\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-en\"\u003egetCwd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// CORRECT (combined):\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecwd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparams\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eworkdir\u003c/span\u003e ? \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eresolvePath\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eparams\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eworkdir\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-en\"\u003egetCwd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eshell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e : \u003cspan class=\"pl-en\"\u003egetCwd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7. \u003ccode\u003epackages/opencode/src/session/prompt.ts\u003c/code\u003e (MAJOR)\u003c/h3\u003e\u003ca id=\"user-content-7-packagesopencodesrcsessionpromptts-major\" class=\"anchor\" aria-label=\"Permalink: 7. packages/opencode/src/session/prompt.ts (MAJOR)\" href=\"#7-packagesopencodesrcsessionpromptts-major\"\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\"\u003eUpstream completely rewrites this file using Effect patterns (1907 lines vs the old ~2500 line async/await version).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Take \u003cstrong\u003eupstream's entire version\u003c/strong\u003e (\u003ccode\u003egit checkout --theirs\u003c/code\u003e), then apply lash changes:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git checkout --theirs packages/opencode/src/session/prompt.ts\"\u003e\u003cpre\u003egit checkout --theirs packages/opencode/src/session/prompt.ts\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen manually add:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ea) Import (after \u003ccode\u003eimport { Shell } from \"@/shell/shell\"\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import { getCwd, setCwd, detectNaturalLanguage } from \u0026quot;@shell-mode\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003egetCwd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetCwd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edetectNaturalLanguage\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003efrom\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"@shell-mode\"\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eb) Replace \u003ccode\u003ectx.directory\u003c/code\u003e with \u003ccode\u003egetCwd()\u003c/code\u003e in all path objects:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"python3 -c \u0026quot;\ncontent = open('packages/opencode/src/session/prompt.ts').read()\ncontent = content.replace('path: { cwd: ctx.directory, root: ctx.worktree }', 'path: { cwd: getCwd(), root: ctx.worktree }')\nopen('packages/opencode/src/session/prompt.ts', 'w').write(content)\n\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-s1\"\u003epython3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ec\u003c/span\u003e \"\n\u003cspan class=\"pl-s1\"\u003econtent\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eopen\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'packages/opencode/src/session/prompt.ts'\u003c/span\u003e).\u003cspan class=\"pl-c1\"\u003eread\u003c/span\u003e()\n\u003cspan class=\"pl-s1\"\u003econtent\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econtent\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003ereplace\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'path: { cwd: ctx.directory, root: ctx.worktree }'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'path: { cwd: getCwd(), root: ctx.worktree }'\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eopen\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'packages/opencode/src/session/prompt.ts'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'w'\u003c/span\u003e).\u003cspan class=\"pl-c1\"\u003ewrite\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econtent\u003c/span\u003e)\n\"\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ec) In the bash execution function, change \u003ccode\u003econst cwd = ctx.directory\u003c/code\u003e to \u003ccode\u003econst cwd = getCwd()\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ed) Replace the simple bash invocations with sentinel-wrapped versions\u003c/strong\u003e that output the new cwd after each command, then parse and call \u003ccode\u003esetCwd(newCwd)\u003c/code\u003e in the \u003ccode\u003efinish\u003c/code\u003e Effect.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ee) Add \u003ccode\u003edetectNaturalLanguage()\u003c/code\u003e call in the finish Effect\u003c/strong\u003e after parsing the sentinel.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee commit \u003ccode\u003ee95356aec\u003c/code\u003e for the full diff of these changes.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8. \u003ccode\u003epackages/opencode/src/cli/cmd/tui/app.tsx\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-8-packagesopencodesrcclicmdtuiapptsx\" class=\"anchor\" aria-label=\"Permalink: 8. packages/opencode/src/cli/cmd/tui/app.tsx\" href=\"#8-packagesopencodesrcclicmdtuiapptsx\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream adds \u003ccode\u003ecreateCliRenderer\u003c/code\u003e, \u003ccode\u003eTuiPluginRuntime\u003c/code\u003e, plugin system.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eTake \u003cstrong\u003eboth\u003c/strong\u003e imports (lash's \u003ccode\u003eExecutionModeProvider, WorkingDirProvider\u003c/code\u003e AND upstream's \u003ccode\u003ecreateTuiApi, TuiPluginRuntime\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eTake \u003cstrong\u003eupstream's render tree\u003c/strong\u003e but add our providers around \u003ccode\u003e\u0026lt;App /\u0026gt;\u003c/code\u003e:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight highlight-source-tsx notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;PromptRefProvider\u0026gt;\n  \u0026lt;ExecutionModeProvider\u0026gt;    {/* lash addition */}\n    \u0026lt;WorkingDirProvider\u0026gt;     {/* lash addition */}\n      \u0026lt;App onSnapshot={input.onSnapshot} /\u0026gt;\n    \u0026lt;/WorkingDirProvider\u0026gt;\n  \u0026lt;/ExecutionModeProvider\u0026gt;\n\u0026lt;/PromptRefProvider\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-v\"\u003ePromptRefProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n  \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-v\"\u003eExecutionModeProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e    \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c\"\u003e/* lash addition */\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n    \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-v\"\u003eWorkingDirProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e     \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c\"\u003e/* lash addition */\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-v\"\u003eApp\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eonSnapshot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003einput\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eonSnapshot\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e/\u0026gt;\u003c/span\u003e\n    \u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-v\"\u003eWorkingDirProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n  \u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-v\"\u003eExecutionModeProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-v\"\u003ePromptRefProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e9. \u003ccode\u003epackages/opencode/src/cli/cmd/tui/routes/home.tsx\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-9-packagesopencodesrcclicmdtuirouteshometsx\" class=\"anchor\" aria-label=\"Permalink: 9. packages/opencode/src/cli/cmd/tui/routes/home.tsx\" href=\"#9-packagesopencodesrcclicmdtuirouteshometsx\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream adds \u003ccode\u003eTuiPluginRuntime.Slot\u003c/code\u003e wrappers for extensibility.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Take \u003cstrong\u003eupstream's structure\u003c/strong\u003e (with plugin slots and \u003ccode\u003eplaceholders\u003c/code\u003e prop) and add \u003ccode\u003eshowWorkingDirectory={false}\u003c/code\u003e to the Prompt in the \u003ccode\u003ehome_prompt\u003c/code\u003e slot.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e10. \u003ccode\u003epackages/opencode/src/cli/cmd/tui/component/prompt/index.tsx\u003c/code\u003e (MAJOR)\u003c/h3\u003e\u003ca id=\"user-content-10-packagesopencodesrcclicmdtuicomponentpromptindextsx-major\" class=\"anchor\" aria-label=\"Permalink: 10. packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx (MAJOR)\" href=\"#10-packagesopencodesrcclicmdtuicomponentpromptindextsx-major\"\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\u003cstrong\u003eResolution\u003c/strong\u003e: Take \u003cstrong\u003eupstream's version\u003c/strong\u003e (\u003ccode\u003egit checkout --theirs\u003c/code\u003e), then add:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eRGBA\u003c/code\u003e to opentui/core imports\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDialogExecutionMode\u003c/code\u003e import\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e@tui-integration\u003c/code\u003e imports (\u003ccode\u003euseExecutionMode\u003c/code\u003e, \u003ccode\u003ehandleModeToggleKey\u003c/code\u003e, \u003ccode\u003edetermineRouting\u003c/code\u003e, shell completion hooks)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eExecutionMode\u003c/code\u003e from \u003ccode\u003e@shell-mode\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eshowWorkingDirectory?: boolean\u003c/code\u003e prop\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecompletionCycle: CompletionCycleState | null\u003c/code\u003e in store type + init\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eexecutionMode = useExecutionMode()\u003c/code\u003e context in function body\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eshortenedWorkingDir\u003c/code\u003e computed memo\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodePrefixColor\u003c/code\u003e computed memo\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edetermineRouting()\u003c/code\u003e in submit function (replaces \u003ccode\u003estore.mode === \"shell\"\u003c/code\u003e check)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehandleModeToggleKey()\u003c/code\u003e in \u003ccode\u003eonKeyDown\u003c/code\u003e handler\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDialogExecutionMode\u003c/code\u003e in command registry\u003c/li\u003e\n\u003cli\u003eWorking directory display in footer fallback\u003c/li\u003e\n\u003cli\u003eMode toggle hint in footer hints area\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDouble left border\u003c/strong\u003e — upstream only has a single border. Add the execution mode inner border using a \u003cstrong\u003erow layout\u003c/strong\u003e (not nested borders — see below):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-tsx notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;box border={[\u0026quot;left\u0026quot;]} borderColor={borderHighlight()} customBorderChars={{...SplitBorder.customBorderChars, bottomLeft: \u0026quot;╹\u0026quot;}}\u0026gt;\n  \u0026lt;box flexDirection=\u0026quot;row\u0026quot;\u0026gt;\n    \u0026lt;box\n      width={1}\n      alignSelf=\u0026quot;stretch\u0026quot;\n      border={[\u0026quot;left\u0026quot;]}\n      borderColor={modePrefixColor()}\n      customBorderChars={{ ...SplitBorder.customBorderChars }}\n    /\u0026gt;\n    \u0026lt;box paddingLeft={2} paddingRight={2} paddingTop={1} flexShrink={0} backgroundColor={theme.backgroundElement} flexGrow={1}\u0026gt;\n      {/* textarea + footer */}\n    \u0026lt;/box\u0026gt;\n  \u0026lt;/box\u0026gt;\n\u0026lt;/box\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eborder\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"left\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eborderColor\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eborderHighlight\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ecustomBorderChars\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e...\u003cspan class=\"pl-v\"\u003eSplitBorder\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ecustomBorderChars\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ebottomLeft\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\"╹\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n  \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eflexDirection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"row\"\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n    \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003ewidth\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003ealignSelf\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"stretch\"\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003eborder\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"left\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003eborderColor\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-en\"\u003emodePrefixColor\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n      \u003cspan class=\"pl-c1\"\u003ecustomBorderChars\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e ...\u003cspan class=\"pl-v\"\u003eSplitBorder\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ecustomBorderChars\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n    \u003cspan class=\"pl-kos\"\u003e/\u0026gt;\u003c/span\u003e\n    \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003epaddingLeft\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003epaddingRight\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003epaddingTop\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eflexShrink\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ebackgroundColor\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003etheme\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ebackgroundElement\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eflexGrow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n      \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c\"\u003e/* textarea + footer */\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n    \u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n  \u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ebox\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhy row layout?\u003c/strong\u003e Nesting \u003ccode\u003eborder={[\"left\"]}\u003c/code\u003e boxes causes the inner border to appear 1–2 rows shorter than the outer because Yoga sizes each box independently. Using \u003ccode\u003ewidth={1}\u003c/code\u003e + \u003ccode\u003ealignSelf=\"stretch\"\u003c/code\u003e in a row container guarantees both bars span identical rows.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e12. \u003ccode\u003epackages/opencode/src/config/keybinds.ts\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-12-packagesopencodesrcconfigkeybindsts\" class=\"anchor\" aria-label=\"Permalink: 12. packages/opencode/src/config/keybinds.ts\" href=\"#12-packagesopencodesrcconfigkeybindsts\"\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\u003cstrong\u003ePattern\u003c/strong\u003e: Upstream may reassign \u003ccode\u003eagent_cycle\u003c/code\u003e to \u003ccode\u003etab\u003c/code\u003e. Lash remaps Tab to shell autocomplete.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eResolution\u003c/strong\u003e: Ensure \u003ccode\u003eagent_cycle\u003c/code\u003e is on \u003ccode\u003eshift+tab\u003c/code\u003e, NOT \u003ccode\u003etab\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"agent_cycle: keybind(\u0026quot;shift+tab\u0026quot;, \u0026quot;Next agent\u0026quot;),\nagent_cycle_reverse: keybind(\u0026quot;none\u0026quot;, \u0026quot;Previous agent\u0026quot;),\"\u003e\u003cpre\u003e\u003cspan class=\"pl-s1\"\u003eagent_cycle\u003c/span\u003e: \u003cspan class=\"pl-en\"\u003ekeybind\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"shift+tab\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"Next agent\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eagent_cycle_reverse\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ekeybind\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"none\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"Previous agent\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTab is handled in \u003ccode\u003eonKeyDown\u003c/code\u003e in \u003ccode\u003eprompt/index.tsx\u003c/code\u003e via \u003ccode\u003ehandleShellTabCompletion()\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e13. \u003ccode\u003ebun.lock\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-13-bunlock\" class=\"anchor\" aria-label=\"Permalink: 13. bun.lock\" href=\"#13-bunlock\"\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\u003cstrong\u003eResolution\u003c/strong\u003e: Do NOT run \u003ccode\u003ebun install\u003c/code\u003e while the lockfile still contains conflict markers — bun silently re-resolves every \u003ccode\u003e^\u003c/code\u003e-ranged dependency, floating packages far past what either side pinned. (2026-07-20: this floated \u003ccode\u003estorybook-solidjs-vite\u003c/code\u003e 10.1.1 → 10.6.0, whose new Solid-version detection broke the storybook CI build and OOM'd local builds.)\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstead, restore a clean base lockfile first, then install:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git checkout HEAD -- bun.lock   # pre-merge lash lockfile (or upstream/dev -- bun.lock if theirs is closer)\nbun install                      # only resolves the actual package.json deltas\ngit add bun.lock\"\u003e\u003cpre\u003egit checkout HEAD -- bun.lock   \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e pre-merge lash lockfile (or upstream/dev -- bun.lock if theirs is closer)\u003c/span\u003e\nbun install                      \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e only resolves the actual package.json deltas\u003c/span\u003e\ngit add bun.lock\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen verify nothing unexpected floated:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git diff --cached bun.lock | grep -E '^[+-]' | grep -vE 'workspace:|1\\.7\\.' | head -50\"\u003e\u003cpre\u003egit diff --cached bun.lock \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e grep -E \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e^[+-]\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e grep -vE \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eworkspace:|1\\.7\\.\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e head -50\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePost-Merge QA Checklist\u003c/h2\u003e\u003ca id=\"user-content-post-merge-qa-checklist\" class=\"anchor\" aria-label=\"Permalink: Post-Merge QA Checklist\" href=\"#post-merge-qa-checklist\"\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\"\u003eRun through this visually after every merge commit, before closing the sync issue.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrompt border\u003c/h3\u003e\u003ca id=\"user-content-prompt-border\" class=\"anchor\" aria-label=\"Permalink: Prompt border\" href=\"#prompt-border\"\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 class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Two left border bars visible: outer bar = agent color, inner bar = execution mode color\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Both bars are the \u003cstrong\u003esame height\u003c/strong\u003e — no gap at top or bottom of the inner bar\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Outer bar shows a \u003ccode\u003e╹\u003c/code\u003e connector at the bottom join\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKeybinds\u003c/h3\u003e\u003ca id=\"user-content-keybinds\" class=\"anchor\" aria-label=\"Permalink: Keybinds\" href=\"#keybinds\"\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 class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e \u003cstrong\u003eTab\u003c/strong\u003e → triggers shell autocomplete (shows completions or cycles them)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e \u003cstrong\u003eShift+Tab\u003c/strong\u003e → cycles agents (Build → Plan → …)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e \u003cstrong\u003eCtrl+Space\u003c/strong\u003e → cycles execution modes (agent → shell → auto)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e \u003cstrong\u003eEnter\u003c/strong\u003e → submits prompt; \u003cstrong\u003eShift+Enter\u003c/strong\u003e → inserts newline\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExecution mode indicator\u003c/h3\u003e\u003ca id=\"user-content-execution-mode-indicator\" class=\"anchor\" aria-label=\"Permalink: Execution mode indicator\" href=\"#execution-mode-indicator\"\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 class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Footer shows mode name in execution mode color (e.g. \u003ccode\u003ectrl+space agent\u003c/code\u003e)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Switching modes updates both the inner border color and the footer label\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eShell mode\u003c/h3\u003e\u003ca id=\"user-content-shell-mode\" class=\"anchor\" aria-label=\"Permalink: Shell mode\" href=\"#shell-mode\"\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 class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Typing \u003ccode\u003e!\u003c/code\u003e at start of prompt switches to shell mode (blue border)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Pressing Escape from shell mode returns to normal mode\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Running a command in shell mode updates the working directory in the footer\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWorking directory\u003c/h3\u003e\u003ca id=\"user-content-working-directory\" class=\"anchor\" aria-label=\"Permalink: Working directory\" href=\"#working-directory\"\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 class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Footer left side shows shortened cwd (e.g. \u003ccode\u003e~/repo/lash\u003c/code\u003e)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Running \u003ccode\u003ecd \u0026lt;dir\u0026gt;\u003c/code\u003e in shell mode updates the displayed cwd\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTypecheck\u003c/h3\u003e\u003ca id=\"user-content-typecheck\" class=\"anchor\" aria-label=\"Permalink: Typecheck\" href=\"#typecheck\"\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=\"cd packages/opencode \u0026amp;\u0026amp; bun run typecheck\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e packages/opencode \u003cspan class=\"pl-k\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e bun run typecheck\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eZero errors required before closing the sync issue.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat Lash Preserves (invariants)\u003c/h2\u003e\u003ca id=\"user-content-what-lash-preserves-invariants\" class=\"anchor\" aria-label=\"Permalink: What Lash Preserves (invariants)\" href=\"#what-lash-preserves-invariants\"\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\"\u003eThese features must always be preserved through upstream merges:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003eFiles\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egetCwd()\u003c/code\u003e / \u003ccode\u003esetCwd()\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/shell-mode/cwd.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShell cwd tracking\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edetectNaturalLanguage()\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/shell-mode/natural-language.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNL detection\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eExecutionMode\u003c/code\u003e (shell/agent/auto)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/shell-mode/mode.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMode switching\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eExecutionModeProvider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/tui-integration/execution-mode-provider.tsx\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTUI context\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eWorkingDirProvider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/tui-integration/working-dir-provider.tsx\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTUI cwd display\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehandleModeToggleKey()\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/tui-integration/hooks.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ectrl+space handler\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edetermineRouting()\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplugin/tui-integration/hooks.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShell vs agent routing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecwd sentinel\u003c/code\u003e in bash\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esrc/session/prompt.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCwd tracking after cd\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ectrl+space mode toggle\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epackages/tui/src/component/prompt/index.tsx\u003c/code\u003e (\u003ccode\u003eprompt.mode.toggle\u003c/code\u003e binding)\u003c/td\u003e\n\u003ctd\u003ereplaced \u003ccode\u003emode_toggle\u003c/code\u003e keybind after 2026-07-07 TUI move\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eagent_cycle\u003c/code\u003e keybind\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epackages/tui/src/config/keybind.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eshift+tab (NOT tab)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDouble left border\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epackages/tui/src/component/prompt/index.tsx\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRow layout, not nested\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEventCwdUpdated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esdk/js/src/v2/gen/types.gen.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSDK type for cwd event\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecwd in \u003ccode\u003epath.*\u003c/code\u003e field\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esrc/session/prompt.ts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShows cwd in messages\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\"\u003eAutomating the Sync (future)\u003c/h2\u003e\u003ca id=\"user-content-automating-the-sync-future\" class=\"anchor\" aria-label=\"Permalink: Automating the Sync (future)\" href=\"#automating-the-sync-future\"\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\"\u003eTo automate weekly syncs, add a GitHub Action:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# .github/workflows/upstream-sync.yml\nname: Upstream Sync\non:\n  schedule:\n    - cron: '0 6 * * 1'  # Every Monday 6am UTC\n  workflow_dispatch:\n\njobs:\n  sync:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n          fetch-depth: 0\n      - run: git remote add upstream https://github.com/anomalyco/opencode.git\n      - run: git fetch upstream\n      - run: git config user.email \u0026quot;lacy@example.com\u0026quot;\n      - run: git config user.name \u0026quot;Lacy Bot\u0026quot;\n      - run: |\n          git merge upstream/dev --no-commit --no-ff || true\n          # Check if there are conflicts\n          if git diff --name-only --diff-filter=U | grep -q .; then\n            echo \u0026quot;CONFLICTS=true\u0026quot; \u0026gt;\u0026gt; $GITHUB_ENV\n          fi\n      - name: Open PR if merge succeeds\n        if: env.CONFLICTS != 'true'\n        run: |\n          git commit -m \u0026quot;chore: merge upstream dev\u0026quot;\n          git push origin HEAD:upstream-sync-$(date +%Y%m%d)\n          gh pr create --title \u0026quot;Upstream sync $(date +%Y-%m-%d)\u0026quot; ...\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e .github/workflows/upstream-sync.yml\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003ename\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eUpstream Sync\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003eon\u003c/span\u003e:\n  \u003cspan class=\"pl-ent\"\u003eschedule\u003c/span\u003e:\n    - \u003cspan class=\"pl-ent\"\u003ecron\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e0 6 * * 1\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Every Monday 6am UTC\u003c/span\u003e\n  \u003cspan class=\"pl-ent\"\u003eworkflow_dispatch\u003c/span\u003e:\n\n\u003cspan class=\"pl-ent\"\u003ejobs\u003c/span\u003e:\n  \u003cspan class=\"pl-ent\"\u003esync\u003c/span\u003e:\n    \u003cspan class=\"pl-ent\"\u003eruns-on\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eubuntu-latest\u003c/span\u003e\n    \u003cspan class=\"pl-ent\"\u003esteps\u003c/span\u003e:\n      - \u003cspan class=\"pl-ent\"\u003euses\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eactions/checkout@v4\u003c/span\u003e\n        \u003cspan class=\"pl-ent\"\u003ewith\u003c/span\u003e:\n          \u003cspan class=\"pl-ent\"\u003etoken\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\n          \u003cspan class=\"pl-ent\"\u003efetch-depth\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\n      - \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003egit remote add upstream https://github.com/anomalyco/opencode.git\u003c/span\u003e\n      - \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003egit fetch upstream\u003c/span\u003e\n      - \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003egit config user.email \"lacy@example.com\"\u003c/span\u003e\n      - \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003egit config user.name \"Lacy Bot\"\u003c/span\u003e\n      - \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e|\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          git merge upstream/dev --no-commit --no-ff || \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          # Check if there are conflicts\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          if git diff --name-only --diff-filter=U | grep -q .; then\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e            echo \"CONFLICTS=true\" \u0026gt;\u0026gt; $GITHUB_ENV\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          fi\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e      - \u003cspan class=\"pl-ent\"\u003ename\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eOpen PR if merge succeeds\u003c/span\u003e\n        \u003cspan class=\"pl-ent\"\u003eif\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eenv.CONFLICTS != 'true'\u003c/span\u003e\n        \u003cspan class=\"pl-ent\"\u003erun\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e|\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          git commit -m \"chore: merge upstream dev\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          git push origin HEAD:upstream-sync-$(date +%Y%m%d)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e          gh pr create --title \"Upstream sync $(date +%Y-%m-%d)\" ...\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor conflict-free or simple merges, this can be fully automated. Conflicted merges (like \u003ccode\u003eprompt.ts\u003c/code\u003e refactors) require manual resolution — create a PR instead and resolve manually.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSync History\u003c/h2\u003e\u003ca id=\"user-content-sync-history\" class=\"anchor\" aria-label=\"Permalink: Sync History\" href=\"#sync-history\"\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\u003eDate\u003c/th\u003e\n\u003cth\u003eUpstream commits merged\u003c/th\u003e\n\u003cth\u003eConflicts\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-04-02\u003c/td\u003e\n\u003ctd\u003e673 (cf7ca9b2f → 92e820fdc)\u003c/td\u003e\n\u003ctd\u003e28 files\u003c/td\u003e\n\u003ctd\u003eMajor Effect rewrite of prompt.ts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-04-28\u003c/td\u003e\n\u003ctd\u003e(QA only — no new merge)\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003eLAC-163: found 3 regressions post-merge: missing double border, wrong Tab keybind, border height mismatch. Fixed in commits bde00fa30, 85faf49fc, 9d7ac27c1. Added this QA checklist.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-06-26\u003c/td\u003e\n\u003ctd\u003e629 (catch-up)\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003ePR #31 merged.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-06-30\u003c/td\u003e\n\u003ctd\u003e68\u003c/td\u003e\n\u003ctd\u003eescalated → LAC-2496\u003c/td\u003e\n\u003ctd\u003ePR #32 opened; later superseded by PR #39.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-07-07\u003c/td\u003e\n\u003ctd\u003e195 (→ v1.17.15)\u003c/td\u003e\n\u003ctd\u003eprompt/index.tsx re-architecture\u003c/td\u003e\n\u003ctd\u003eLAC-2556: merge completed on-branch; run died in API outage before PR. mode_toggle/handleModeToggleKey replaced by direct ctrl+space \u003ccode\u003eprompt.mode.toggle\u003c/code\u003e binding; TUI moved to \u003ccode\u003epackages/tui/\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-07-13\u003c/td\u003e\n\u003ctd\u003e90 (→ v1.17.18)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, TEAM_MEMBERS, 1 hunk in prompt/index.tsx\u003c/td\u003e\n\u003ctd\u003eLAC-2739: consolidated PR #39 (06-30 + 07-07 + 07-13). Kept lash \u003ccode\u003eshortenedWorkingDir\u003c/code\u003e footer over upstream's session-directory display. Typecheck 30/30.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-07-20\u003c/td\u003e\n\u003ctd\u003e153 (→ v1.18.3)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-2865: merged into PR #39 branch (dev still awaiting PR #39 merge). Also merged origin/dev (PR #40 Windows deflake). No complex conflicts; invariants verified.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-07-27\u003c/td\u003e\n\u003ctd\u003e167 (→ v1.18.7)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-3102: built on LAC-2739 branch (PR #39 still open). Version conflicts auto-resolved (kept lash 1.7.x). Typecheck gate: 0 errors. No changes to prompt.ts/keybinds.ts/types.gen.ts. agent_cycle=shift+tab verified.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-08-04\u003c/td\u003e\n\u003ctd\u003e132 (→ v1.18.13)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-3206: continued on LAC-3102 branch (PR #42), which fully contains PR #39 → #39 superseded/closable. All conflicts standard (kept lash 1.7.13; bun.lock regenerated). Flagged complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. agent_cycle=shift+tab verified. \u003cstrong\u003eBacklog risk: sync PRs (#39→#42) have not landed on dev since 07-13; escalate merge decision.\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-08-10\u003c/td\u003e\n\u003ctd\u003e59 (→ v1.18.16)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-3264: continued on LAC-3102 branch (PR #42, still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from clean base — delta was internal versions + upstream's new @ai-sdk/openai-compatible@2.0.41 patch entry). Complex files: prompt.ts got 1 upstream fix hunk (orphan detection via parentID), prompt/index.tsx got cursor-style config (#32295); keybind.ts/app.tsx/types.gen.ts untouched. All invariants verified; agent_cycle=shift+tab. Typecheck 30/30. \u003cstrong\u003eBacklog risk persists: PR #42 unmerged since 07-13 lineage.\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-09-04\u003c/td\u003e\n\u003ctd\u003e(audit — no new upstream merge)\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003eMerged PR #41 + PR #43 into \u003ccode\u003edev\u003c/code\u003e, then \u003ccode\u003edev\u003c/code\u003e → \u003ccode\u003elash\u003c/code\u003e (\u003ccode\u003eaa19cdfb11\u003c/code\u003e, clean). Added \u003ccode\u003elash\u003c/code\u003e to test/typecheck/nix-eval workflow branch filters. Routine repointed to target \u003ccode\u003elash\u003c/code\u003e. Open: LAC-3268 visual QA, LAC-2396 release 1.7.14, LAC-3732 cwd-footer defect.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-08-17\u003c/td\u003e\n\u003ctd\u003e62 (→ v1.18.18)\u003c/td\u003e\n\u003ctd\u003eversion bumps, bun.lock, beta.yml\u003c/td\u003e\n\u003ctd\u003eLAC-3333: fresh branch from dev (PR #42 merged 2026-08-10). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). Complex files: all 5 (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. EventCwdUpdated in types.gen.ts ✓, agent_cycle=shift+tab ✓, getCwd() in prompt.ts ✓. Typecheck 30/30. PR #43.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-08-24\u003c/td\u003e\n\u003ctd\u003e113 (→ v1.18.21)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-3413: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). \u003cstrong\u003eGotcha caught: \u003ccode\u003egit checkout --ours\u003c/code\u003e on packages/opencode/package.json dropped upstream's @ai-sdk/amazon-bedrock 4.0.158 + google-vertex 4.0.181 pin bumps — re-applied manually. When verifying version-only conflicts, diff merge-base→upstream per file; files reverted to ours vanish from \u003ccode\u003egit diff --cached\u003c/code\u003e.\u003c/strong\u003e Complex files: prompt.ts got 1 fix hunk (continue unknown finish responses #43892), types.gen.ts 2 lines (upgrade endpoint #44686) — both auto-merged clean, no escalation. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd() ✓. Typecheck 30/30.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2026-08-31\u003c/td\u003e\n\u003ctd\u003e62 (→ v1.18.25)\u003c/td\u003e\n\u003ctd\u003e15 version bumps, bun.lock\u003c/td\u003e\n\u003ctd\u003eLAC-3587: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only — each package.json had a single version-line hunk (resolved in-place keeping lash 1.7.13, upstream dep changes auto-merged outside the hunk; no \u003ccode\u003echeckout --ours\u003c/code\u003e, so no pin-drop gotcha). bun.lock regenerated from upstream base; float check clean (only upstream's own 1.18.25 bumps + number-flow add / d3-geo removals). Complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybind.ts) untouched by upstream this week. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd(ctx.directory) ✓, detectNaturalLanguage ✓. Typecheck 30/30. \u003cstrong\u003eBacklog note: PR #43 now carries 3 weeks (08-17/08-24/08-31) awaiting merge by Lacy.\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Upstream Sync Guide","fully_qualified_name":"Upstream Sync Guide","kind":"section_1","ident_start":2,"ident_end":21,"extent_start":0,"extent_end":18131,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":21}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":379,"utf16_col":0}}},{"name":"Overview","fully_qualified_name":"Overview","kind":"section_2","ident_start":184,"ident_end":192,"extent_start":181,"extent_end":658,"ident_utf16":{"start":{"line_number":4,"utf16_col":3},"end":{"line_number":4,"utf16_col":11}},"extent_utf16":{"start":{"line_number":4,"utf16_col":0},"end":{"line_number":10,"utf16_col":0}}},{"name":"Quick Sync (recurring)","fully_qualified_name":"Quick Sync (recurring)","kind":"section_2","ident_start":661,"ident_end":683,"extent_start":658,"extent_end":1055,"ident_utf16":{"start":{"line_number":10,"utf16_col":3},"end":{"line_number":10,"utf16_col":25}},"extent_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":30,"utf16_col":0}}},{"name":"Conflict Playbook","fully_qualified_name":"Conflict Playbook","kind":"section_2","ident_start":1058,"ident_end":1075,"extent_start":1055,"extent_end":9007,"ident_utf16":{"start":{"line_number":30,"utf16_col":3},"end":{"line_number":30,"utf16_col":20}},"extent_utf16":{"start":{"line_number":30,"utf16_col":0},"end":{"line_number":265,"utf16_col":0}}},{"name":"1. Package version conflicts (`packages/*/package.json`, `sdks/vscode/package.json`)","fully_qualified_name":"1. Package version conflicts (`packages/*/package.json`, `sdks/vscode/package.json`)","kind":"section_3","ident_start":1203,"ident_end":1287,"extent_start":1199,"extent_end":1838,"ident_utf16":{"start":{"line_number":36,"utf16_col":4},"end":{"line_number":36,"utf16_col":88}},"extent_utf16":{"start":{"line_number":36,"utf16_col":0},"end":{"line_number":60,"utf16_col":0}}},{"name":"2. Root `package.json` — patchedDependencies","fully_qualified_name":"2. Root `package.json` — patchedDependencies","kind":"section_3","ident_start":1842,"ident_end":1888,"extent_start":1838,"extent_end":2071,"ident_utf16":{"start":{"line_number":60,"utf16_col":4},"end":{"line_number":60,"utf16_col":48}},"extent_utf16":{"start":{"line_number":60,"utf16_col":0},"end":{"line_number":68,"utf16_col":0}}},{"name":"3. `packages/extensions/zed/extension.toml`","fully_qualified_name":"3. `packages/extensions/zed/extension.toml`","kind":"section_3","ident_start":2075,"ident_end":2118,"extent_start":2071,"extent_end":2331,"ident_utf16":{"start":{"line_number":68,"utf16_col":4},"end":{"line_number":68,"utf16_col":47}},"extent_utf16":{"start":{"line_number":68,"utf16_col":0},"end":{"line_number":76,"utf16_col":0}}},{"name":"4. `packages/sdk/js/src/v2/gen/types.gen.ts`","fully_qualified_name":"4. `packages/sdk/js/src/v2/gen/types.gen.ts`","kind":"section_3","ident_start":2335,"ident_end":2379,"extent_start":2331,"extent_end":2876,"ident_utf16":{"start":{"line_number":76,"utf16_col":4},"end":{"line_number":76,"utf16_col":48}},"extent_utf16":{"start":{"line_number":76,"utf16_col":0},"end":{"line_number":99,"utf16_col":0}}},{"name":"5. `packages/opencode/src/server/server.ts`","fully_qualified_name":"5. `packages/opencode/src/server/server.ts`","kind":"section_3","ident_start":2880,"ident_end":2923,"extent_start":2876,"extent_end":3127,"ident_utf16":{"start":{"line_number":99,"utf16_col":4},"end":{"line_number":99,"utf16_col":47}},"extent_utf16":{"start":{"line_number":99,"utf16_col":0},"end":{"line_number":107,"utf16_col":0}}},{"name":"6. `packages/opencode/src/tool/bash.ts`","fully_qualified_name":"6. `packages/opencode/src/tool/bash.ts`","kind":"section_3","ident_start":3131,"ident_end":3170,"extent_start":3127,"extent_end":3638,"ident_utf16":{"start":{"line_number":107,"utf16_col":4},"end":{"line_number":107,"utf16_col":43}},"extent_utf16":{"start":{"line_number":107,"utf16_col":0},"end":{"line_number":126,"utf16_col":0}}},{"name":"7. `packages/opencode/src/session/prompt.ts` (MAJOR)","fully_qualified_name":"7. `packages/opencode/src/session/prompt.ts` (MAJOR)","kind":"section_3","ident_start":3642,"ident_end":3694,"extent_start":3638,"extent_end":4957,"ident_utf16":{"start":{"line_number":126,"utf16_col":4},"end":{"line_number":126,"utf16_col":56}},"extent_utf16":{"start":{"line_number":126,"utf16_col":0},"end":{"line_number":162,"utf16_col":0}}},{"name":"8. `packages/opencode/src/cli/cmd/tui/app.tsx`","fully_qualified_name":"8. `packages/opencode/src/cli/cmd/tui/app.tsx`","kind":"section_3","ident_start":4961,"ident_end":5007,"extent_start":4957,"extent_end":5568,"ident_utf16":{"start":{"line_number":162,"utf16_col":4},"end":{"line_number":162,"utf16_col":50}},"extent_utf16":{"start":{"line_number":162,"utf16_col":0},"end":{"line_number":182,"utf16_col":0}}},{"name":"9. `packages/opencode/src/cli/cmd/tui/routes/home.tsx`","fully_qualified_name":"9. `packages/opencode/src/cli/cmd/tui/routes/home.tsx`","kind":"section_3","ident_start":5572,"ident_end":5626,"extent_start":5568,"extent_end":5884,"ident_utf16":{"start":{"line_number":182,"utf16_col":4},"end":{"line_number":182,"utf16_col":58}},"extent_utf16":{"start":{"line_number":182,"utf16_col":0},"end":{"line_number":190,"utf16_col":0}}},{"name":"10. `packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx` (MAJOR)","fully_qualified_name":"10. `packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx` (MAJOR)","kind":"section_3","ident_start":5888,"ident_end":5962,"extent_start":5884,"extent_end":7768,"ident_utf16":{"start":{"line_number":190,"utf16_col":4},"end":{"line_number":190,"utf16_col":78}},"extent_utf16":{"start":{"line_number":190,"utf16_col":0},"end":{"line_number":232,"utf16_col":0}}},{"name":"12. `packages/opencode/src/config/keybinds.ts`","fully_qualified_name":"12. `packages/opencode/src/config/keybinds.ts`","kind":"section_3","ident_start":7772,"ident_end":7818,"extent_start":7768,"extent_end":8203,"ident_utf16":{"start":{"line_number":232,"utf16_col":4},"end":{"line_number":232,"utf16_col":50}},"extent_utf16":{"start":{"line_number":232,"utf16_col":0},"end":{"line_number":247,"utf16_col":0}}},{"name":"13. `bun.lock`","fully_qualified_name":"13. `bun.lock`","kind":"section_3","ident_start":8207,"ident_end":8221,"extent_start":8203,"extent_end":9007,"ident_utf16":{"start":{"line_number":247,"utf16_col":4},"end":{"line_number":247,"utf16_col":18}},"extent_utf16":{"start":{"line_number":247,"utf16_col":0},"end":{"line_number":265,"utf16_col":0}}},{"name":"Post-Merge QA Checklist","fully_qualified_name":"Post-Merge QA Checklist","kind":"section_2","ident_start":9010,"ident_end":9033,"extent_start":9007,"extent_end":10379,"ident_utf16":{"start":{"line_number":265,"utf16_col":3},"end":{"line_number":265,"utf16_col":26}},"extent_utf16":{"start":{"line_number":265,"utf16_col":0},"end":{"line_number":301,"utf16_col":0}}},{"name":"Prompt border","fully_qualified_name":"Prompt border","kind":"section_3","ident_start":9123,"ident_end":9136,"extent_start":9119,"extent_end":9376,"ident_utf16":{"start":{"line_number":269,"utf16_col":4},"end":{"line_number":269,"utf16_col":17}},"extent_utf16":{"start":{"line_number":269,"utf16_col":0},"end":{"line_number":274,"utf16_col":0}}},{"name":"Keybinds","fully_qualified_name":"Keybinds","kind":"section_3","ident_start":9380,"ident_end":9388,"extent_start":9376,"extent_end":9681,"ident_utf16":{"start":{"line_number":274,"utf16_col":4},"end":{"line_number":274,"utf16_col":12}},"extent_utf16":{"start":{"line_number":274,"utf16_col":0},"end":{"line_number":280,"utf16_col":0}}},{"name":"Execution mode indicator","fully_qualified_name":"Execution mode indicator","kind":"section_3","ident_start":9685,"ident_end":9709,"extent_start":9681,"extent_end":9869,"ident_utf16":{"start":{"line_number":280,"utf16_col":4},"end":{"line_number":280,"utf16_col":28}},"extent_utf16":{"start":{"line_number":280,"utf16_col":0},"end":{"line_number":284,"utf16_col":0}}},{"name":"Shell mode","fully_qualified_name":"Shell mode","kind":"section_3","ident_start":9873,"ident_end":9883,"extent_start":9869,"extent_end":10101,"ident_utf16":{"start":{"line_number":284,"utf16_col":4},"end":{"line_number":284,"utf16_col":14}},"extent_utf16":{"start":{"line_number":284,"utf16_col":0},"end":{"line_number":289,"utf16_col":0}}},{"name":"Working directory","fully_qualified_name":"Working directory","kind":"section_3","ident_start":10105,"ident_end":10122,"extent_start":10101,"extent_end":10253,"ident_utf16":{"start":{"line_number":289,"utf16_col":4},"end":{"line_number":289,"utf16_col":21}},"extent_utf16":{"start":{"line_number":289,"utf16_col":0},"end":{"line_number":293,"utf16_col":0}}},{"name":"Typecheck","fully_qualified_name":"Typecheck","kind":"section_3","ident_start":10257,"ident_end":10266,"extent_start":10253,"extent_end":10379,"ident_utf16":{"start":{"line_number":293,"utf16_col":4},"end":{"line_number":293,"utf16_col":13}},"extent_utf16":{"start":{"line_number":293,"utf16_col":0},"end":{"line_number":301,"utf16_col":0}}},{"name":"What Lash Preserves (invariants)","fully_qualified_name":"What Lash Preserves (invariants)","kind":"section_2","ident_start":10382,"ident_end":10414,"extent_start":10379,"extent_end":11740,"ident_utf16":{"start":{"line_number":301,"utf16_col":3},"end":{"line_number":301,"utf16_col":35}},"extent_utf16":{"start":{"line_number":301,"utf16_col":0},"end":{"line_number":321,"utf16_col":0}}},{"name":"Automating the Sync (future)","fully_qualified_name":"Automating the Sync (future)","kind":"section_2","ident_start":11743,"ident_end":11771,"extent_start":11740,"extent_end":13063,"ident_utf16":{"start":{"line_number":321,"utf16_col":3},"end":{"line_number":321,"utf16_col":31}},"extent_utf16":{"start":{"line_number":321,"utf16_col":0},"end":{"line_number":361,"utf16_col":0}}},{"name":"Sync History","fully_qualified_name":"Sync History","kind":"section_2","ident_start":13066,"ident_end":13078,"extent_start":13063,"extent_end":18131,"ident_utf16":{"start":{"line_number":361,"utf16_col":3},"end":{"line_number":361,"utf16_col":15}},"extent_utf16":{"start":{"line_number":361,"utf16_col":0},"end":{"line_number":379,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1037831724,"defaultBranch":"lash","name":"lash","ownerLogin":"lacymorrow","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2025-08-14T07:29:56.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1311301?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"JMb_Pl2dcgEY8631_6KujKnV5SpnzmifnIDokCjxkjbF36JZ7vOUYiH1FKnpLlGWMpKYbrQFU49cHyaqABUhQQ","allShortcutsEnabled":false,"treeExpanded":true,"path":"UPSTREAM_SYNC.md","symbolsExpanded":false,"refInfo":{"name":"lash","listCacheKey":"v0:1789688540.0","canEdit":false,"currentOid":"16e3ca300bee363f587e0a22fb98c48d7985449b"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".claude","path":".claude","contentType":"directory"},{"name":".github","path":".github","contentType":"directory"},{"name":".husky","path":".husky","contentType":"directory"},{"name":".opencode","path":".opencode","contentType":"directory"},{"name":".vscode","path":".vscode","contentType":"directory"},{"name":".zed","path":".zed","contentType":"directory"},{"name":"artifacts","path":"artifacts","contentType":"directory"},{"name":"github","path":"github","contentType":"directory"},{"name":"infra","path":"infra","contentType":"directory"},{"name":"nix","path":"nix","contentType":"directory"},{"name":"packages","path":"packages","contentType":"directory"},{"name":"patches","path":"patches","contentType":"directory"},{"name":"perf","path":"perf","contentType":"directory"},{"name":"script","path":"script","contentType":"directory"},{"name":"sdks","path":"sdks","contentType":"directory"},{"name":"specs","path":"specs","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".editorconfig","path":".editorconfig","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitleaksignore","path":".gitleaksignore","contentType":"file"},{"name":".oxlintrc.json","path":".oxlintrc.json","contentType":"file"},{"name":".prettierignore","path":".prettierignore","contentType":"file"},{"name":"AGENTS.md","path":"AGENTS.md","contentType":"file"},{"name":"CONTEXT.md","path":"CONTEXT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"LASH_RELEASE.md","path":"LASH_RELEASE.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.ar.md","path":"README.ar.md","contentType":"file"},{"name":"README.bn.md","path":"README.bn.md","contentType":"file"},{"name":"README.br.md","path":"README.br.md","contentType":"file"},{"name":"README.bs.md","path":"README.bs.md","contentType":"file"},{"name":"README.da.md","path":"README.da.md","contentType":"file"},{"name":"README.de.md","path":"README.de.md","contentType":"file"},{"name":"README.es.md","path":"README.es.md","contentType":"file"},{"name":"README.fr.md","path":"README.fr.md","contentType":"file"},{"name":"README.gr.md","path":"README.gr.md","contentType":"file"},{"name":"README.it.md","path":"README.it.md","contentType":"file"},{"name":"README.ja.md","path":"README.ja.md","contentType":"file"},{"name":"README.ko.md","path":"README.ko.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"README.no.md","path":"README.no.md","contentType":"file"},{"name":"README.pl.md","path":"README.pl.md","contentType":"file"},{"name":"README.ru.md","path":"README.ru.md","contentType":"file"},{"name":"README.th.md","path":"README.th.md","contentType":"file"},{"name":"README.tr.md","path":"README.tr.md","contentType":"file"},{"name":"README.uk.md","path":"README.uk.md","contentType":"file"},{"name":"README.vi.md","path":"README.vi.md","contentType":"file"},{"name":"README.zh.md","path":"README.zh.md","contentType":"file"},{"name":"README.zht.md","path":"README.zht.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"SHELL_MODE_PLUGIN_SPEC.md","path":"SHELL_MODE_PLUGIN_SPEC.md","contentType":"file"},{"name":"SHELL_MODE_SPEC.md","path":"SHELL_MODE_SPEC.md","contentType":"file"},{"name":"STATS.md","path":"STATS.md","contentType":"file"},{"name":"UPSTREAM_SYNC.md","path":"UPSTREAM_SYNC.md","contentType":"file"},{"name":"bun.lock","path":"bun.lock","contentType":"file"},{"name":"bunfig.toml","path":"bunfig.toml","contentType":"file"},{"name":"flake.lock","path":"flake.lock","contentType":"file"},{"name":"flake.nix","path":"flake.nix","contentType":"file"},{"name":"install","path":"install","contentType":"file"},{"name":"package.json","path":"package.json","contentType":"file"},{"name":"screenshot-uk.png","path":"screenshot-uk.png","contentType":"file"},{"name":"shipx.config.ts","path":"shipx.config.ts","contentType":"file"},{"name":"sst-env.d.ts","path":"sst-env.d.ts","contentType":"file"},{"name":"sst.config.ts","path":"sst.config.ts","contentType":"file"},{"name":"tsconfig.json","path":"tsconfig.json","contentType":"file"},{"name":"turbo.json","path":"turbo.json","contentType":"file"}],"totalCount":67}},"fileTreeProcessingTime":21.538866,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"lash","listCacheKey":"v0:1789688540.0","canEdit":false,"refType":"branch","currentOid":"16e3ca300bee363f587e0a22fb98c48d7985449b","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"UPSTREAM_SYNC.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/lacymorrow/lash/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"UPSTREAM_SYNC.md","displayUrl":"https://github.com/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md?raw=true","headerInfo":{"blobSize":"17.7 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":"ee0084e","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Flacymorrow%2Flash%2Fblob%2Flash%2FUPSTREAM_SYNC.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"379","truncatedSloc":"279"},"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":"/lacymorrow/lash/blob/lash/UPSTREAM_SYNC.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/lacymorrow/lash/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/lacymorrow/lash/raw/refs/heads/lash/UPSTREAM_SYNC.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":"/lacymorrow/.github/blob/b8183024f7b7e621ab4e4e311f9f902c19655a41/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":["# Upstream Sync Guide","","Lash is a fork of [anomalyco/opencode](https://github.com/anomalyco/opencode). This document describes how to merge upstream changes into the `lash` branch.","","## Overview","","- **Upstream remote**: `upstream` → `https://github.com/anomalyco/opencode.git`","- **Target branch**: `lash` — **`lash` is the GitHub default and the working branch. Sync PRs, fixes, and releases target `lash`, never `dev`.** (`release-lash.ts` only force-releases on `lash`.) 2026-09-04: syncs through PR #43 had drifted onto `dev`; `dev` was merged back into `lash` at `aa19cdfb11` and `dev` is no longer a working branch.","- **Merge target**: `upstream/dev`","","## Quick Sync (recurring)","","```bash","# 1. Fetch upstream","git fetch upstream","","# 2. Merge (no fast-forward, no auto-commit so conflicts can be resolved)","git merge upstream/dev --no-commit --no-ff","","# 3. Resolve conflicts (see \"Conflict Playbook\" below)","# ... fix files ...","","# 4. Regenerate lockfile","bun install","","# 5. Stage and commit","git add -A","git commit -m \"merge: bring upstream dev into lash\"","```","","## Conflict Playbook","","Every upstream merge tends to produce the same categories of conflicts. This section documents how to resolve each.","","---","","### 1. Package version conflicts (`packages/*/package.json`, `sdks/vscode/package.json`)","","**Pattern**: `version` field differs between lash (`1.7.x`) and upstream (`1.x.x`).","","**Resolution**: Keep **lash's version** (`1.7.x`). All packages are versioned together.","","```bash","# Automated fix — keep lash version:","for f in packages/*/package.json sdks/vscode/package.json; do","  python3 -c \"","import re, sys","content = open('$f').read()","content = re.sub(","  r'\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD\\n  \\\"version\\\": \\\"(1\\.7\\.[^\\\"]+)\\\",\\n.*?\u003e\u003e\u003e\u003e\u003e\u003e\u003e upstream/dev\\n',","  r'  \\\"version\\\": \\\"\\1\\\",\\n',","  content, flags=re.DOTALL",")","open('$f', 'w').write(content)","\"","done","```","","---","","### 2. Root `package.json` — patchedDependencies","","**Pattern**: Upstream replaces the `patchedDependencies` entries; lash adds a `funding` block.","","**Resolution**: Take **upstream's patches** + keep lash's **`funding` block**.","","---","","### 3. `packages/extensions/zed/extension.toml`","","**Pattern**: Version + archive URLs differ.","","**Resolution**: Keep **lash's version** (the archive URLs point to anomalyco/opencode — update them to `lacymorrow/lash` when publishing to Zed marketplace).","","---","","### 4. `packages/sdk/js/src/v2/gen/types.gen.ts`","","**Pattern**: Upstream reorganizes generated types; lash adds `EventCwdUpdated`.","","**Resolution**:","1. Take the upstream's large block that reorganizes types (keep nothing from our HEAD section except `EventCwdUpdated`)","2. Add `EventCwdUpdated` to the `Event` union type after `EventPermissionReplied`","","```typescript","// Keep this type definition:","export type EventCwdUpdated = {","  type: \"cwd.updated\"","  properties: {","    cwd: string","  }","}","","// In the Event union, add:","  | EventCwdUpdated","```","","---","","### 5. `packages/opencode/src/server/server.ts`","","**Pattern**: Upstream reorganizes imports.","","**Resolution**: Take **upstream's empty section** (upstream moved imports to other files). Our old `getCwd, CwdEvent` import here was stale and unused.","","---","","### 6. `packages/opencode/src/tool/bash.ts`","","**Pattern**: The `cwd` variable in `execute()`.","","**Resolution**: Combine both — use `getCwd()` and `resolvePath()` together:","","```typescript","// WRONG (upstream only):","const cwd = params.workdir ? await resolvePath(params.workdir, Instance.directory, shell) : Instance.directory","","// WRONG (lash only):","const cwd = params.workdir || getCwd()","","// CORRECT (combined):","const cwd = params.workdir ? await resolvePath(params.workdir, getCwd(), shell) : getCwd()","```","","---","","### 7. `packages/opencode/src/session/prompt.ts` (MAJOR)","","Upstream completely rewrites this file using Effect patterns (1907 lines vs the old ~2500 line async/await version).","","**Resolution**: Take **upstream's entire version** (`git checkout --theirs`), then apply lash changes:","","```bash","git checkout --theirs packages/opencode/src/session/prompt.ts","```","","Then manually add:","","**a) Import (after `import { Shell } from \"@/shell/shell\"`):**","```typescript","import { getCwd, setCwd, detectNaturalLanguage } from \"@shell-mode\"","```","","**b) Replace `ctx.directory` with `getCwd()` in all path objects:**","```python","python3 -c \"","content = open('packages/opencode/src/session/prompt.ts').read()","content = content.replace('path: { cwd: ctx.directory, root: ctx.worktree }', 'path: { cwd: getCwd(), root: ctx.worktree }')","open('packages/opencode/src/session/prompt.ts', 'w').write(content)","\"","```","","**c) In the bash execution function, change `const cwd = ctx.directory` to `const cwd = getCwd()`**","","**d) Replace the simple bash invocations with sentinel-wrapped versions** that output the new cwd after each command, then parse and call `setCwd(newCwd)` in the `finish` Effect.","","**e) Add `detectNaturalLanguage()` call in the finish Effect** after parsing the sentinel.","","See commit `e95356aec` for the full diff of these changes.","","---","","### 8. `packages/opencode/src/cli/cmd/tui/app.tsx`","","**Pattern**: Upstream adds `createCliRenderer`, `TuiPluginRuntime`, plugin system.","","**Resolution**:","1. Take **both** imports (lash's `ExecutionModeProvider, WorkingDirProvider` AND upstream's `createTuiApi, TuiPluginRuntime`)","2. Take **upstream's render tree** but add our providers around `\u003cApp /\u003e`:","","```tsx","\u003cPromptRefProvider\u003e","  \u003cExecutionModeProvider\u003e    {/* lash addition */}","    \u003cWorkingDirProvider\u003e     {/* lash addition */}","      \u003cApp onSnapshot={input.onSnapshot} /\u003e","    \u003c/WorkingDirProvider\u003e","  \u003c/ExecutionModeProvider\u003e","\u003c/PromptRefProvider\u003e","```","","---","","### 9. `packages/opencode/src/cli/cmd/tui/routes/home.tsx`","","**Pattern**: Upstream adds `TuiPluginRuntime.Slot` wrappers for extensibility.","","**Resolution**: Take **upstream's structure** (with plugin slots and `placeholders` prop) and add `showWorkingDirectory={false}` to the Prompt in the `home_prompt` slot.","","---","","### 10. `packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx` (MAJOR)","","**Resolution**: Take **upstream's version** (`git checkout --theirs`), then add:","","1. `RGBA` to opentui/core imports","2. `DialogExecutionMode` import","3. `@tui-integration` imports (`useExecutionMode`, `handleModeToggleKey`, `determineRouting`, shell completion hooks)","4. `ExecutionMode` from `@shell-mode`","5. `showWorkingDirectory?: boolean` prop","6. `completionCycle: CompletionCycleState | null` in store type + init","7. `executionMode = useExecutionMode()` context in function body","8. `shortenedWorkingDir` computed memo","9. `modePrefixColor` computed memo","10. `determineRouting()` in submit function (replaces `store.mode === \"shell\"` check)","11. `handleModeToggleKey()` in `onKeyDown` handler","12. `DialogExecutionMode` in command registry","13. Working directory display in footer fallback","14. Mode toggle hint in footer hints area","","**Double left border** — upstream only has a single border. Add the execution mode inner border using a **row layout** (not nested borders — see below):","","```tsx","\u003cbox border={[\"left\"]} borderColor={borderHighlight()} customBorderChars={{...SplitBorder.customBorderChars, bottomLeft: \"╹\"}}\u003e","  \u003cbox flexDirection=\"row\"\u003e","    \u003cbox","      width={1}","      alignSelf=\"stretch\"","      border={[\"left\"]}","      borderColor={modePrefixColor()}","      customBorderChars={{ ...SplitBorder.customBorderChars }}","    /\u003e","    \u003cbox paddingLeft={2} paddingRight={2} paddingTop={1} flexShrink={0} backgroundColor={theme.backgroundElement} flexGrow={1}\u003e","      {/* textarea + footer */}","    \u003c/box\u003e","  \u003c/box\u003e","\u003c/box\u003e","```","","\u003e **Why row layout?** Nesting `border={[\"left\"]}` boxes causes the inner border to appear 1–2 rows shorter than the outer because Yoga sizes each box independently. Using `width={1}` + `alignSelf=\"stretch\"` in a row container guarantees both bars span identical rows.","","---","","### 12. `packages/opencode/src/config/keybinds.ts`","","**Pattern**: Upstream may reassign `agent_cycle` to `tab`. Lash remaps Tab to shell autocomplete.","","**Resolution**: Ensure `agent_cycle` is on `shift+tab`, NOT `tab`:","","```typescript","agent_cycle: keybind(\"shift+tab\", \"Next agent\"),","agent_cycle_reverse: keybind(\"none\", \"Previous agent\"),","```","","Tab is handled in `onKeyDown` in `prompt/index.tsx` via `handleShellTabCompletion()`.","","---","","### 13. `bun.lock`","","**Resolution**: Do NOT run `bun install` while the lockfile still contains conflict markers — bun silently re-resolves every `^`-ranged dependency, floating packages far past what either side pinned. (2026-07-20: this floated `storybook-solidjs-vite` 10.1.1 → 10.6.0, whose new Solid-version detection broke the storybook CI build and OOM'd local builds.)","","Instead, restore a clean base lockfile first, then install:","```bash","git checkout HEAD -- bun.lock   # pre-merge lash lockfile (or upstream/dev -- bun.lock if theirs is closer)","bun install                      # only resolves the actual package.json deltas","git add bun.lock","```","","Then verify nothing unexpected floated:","```bash","git diff --cached bun.lock | grep -E '^[+-]' | grep -vE 'workspace:|1\\.7\\.' | head -50","```","","---","","## Post-Merge QA Checklist","","Run through this visually after every merge commit, before closing the sync issue.","","### Prompt border","- [ ] Two left border bars visible: outer bar = agent color, inner bar = execution mode color","- [ ] Both bars are the **same height** — no gap at top or bottom of the inner bar","- [ ] Outer bar shows a `╹` connector at the bottom join","","### Keybinds","- [ ] **Tab** → triggers shell autocomplete (shows completions or cycles them)","- [ ] **Shift+Tab** → cycles agents (Build → Plan → …)","- [ ] **Ctrl+Space** → cycles execution modes (agent → shell → auto)","- [ ] **Enter** → submits prompt; **Shift+Enter** → inserts newline","","### Execution mode indicator","- [ ] Footer shows mode name in execution mode color (e.g. `ctrl+space agent`)","- [ ] Switching modes updates both the inner border color and the footer label","","### Shell mode","- [ ] Typing `!` at start of prompt switches to shell mode (blue border)","- [ ] Pressing Escape from shell mode returns to normal mode","- [ ] Running a command in shell mode updates the working directory in the footer","","### Working directory","- [ ] Footer left side shows shortened cwd (e.g. `~/repo/lash`)","- [ ] Running `cd \u003cdir\u003e` in shell mode updates the displayed cwd","","### Typecheck","```bash","cd packages/opencode \u0026\u0026 bun run typecheck","```","Zero errors required before closing the sync issue.","","---","","## What Lash Preserves (invariants)","","These features must always be preserved through upstream merges:","","| Feature | Files | Purpose |","|---------|-------|---------|","| `getCwd()` / `setCwd()` | `plugin/shell-mode/cwd.ts` | Shell cwd tracking |","| `detectNaturalLanguage()` | `plugin/shell-mode/natural-language.ts` | NL detection |","| `ExecutionMode` (shell/agent/auto) | `plugin/shell-mode/mode.ts` | Mode switching |","| `ExecutionModeProvider` | `plugin/tui-integration/execution-mode-provider.tsx` | TUI context |","| `WorkingDirProvider` | `plugin/tui-integration/working-dir-provider.tsx` | TUI cwd display |","| `handleModeToggleKey()` | `plugin/tui-integration/hooks.ts` | ctrl+space handler |","| `determineRouting()` | `plugin/tui-integration/hooks.ts` | Shell vs agent routing |","| `cwd sentinel` in bash | `src/session/prompt.ts` | Cwd tracking after cd |","| ctrl+space mode toggle | `packages/tui/src/component/prompt/index.tsx` (`prompt.mode.toggle` binding) | replaced `mode_toggle` keybind after 2026-07-07 TUI move |","| `agent_cycle` keybind | `packages/tui/src/config/keybind.ts` | shift+tab (NOT tab) |","| Double left border | `packages/tui/src/component/prompt/index.tsx` | Row layout, not nested |","| `EventCwdUpdated` | `sdk/js/src/v2/gen/types.gen.ts` | SDK type for cwd event |","| cwd in `path.*` field | `src/session/prompt.ts` | Shows cwd in messages |","","## Automating the Sync (future)","","To automate weekly syncs, add a GitHub Action:","","```yaml","# .github/workflows/upstream-sync.yml","name: Upstream Sync","on:","  schedule:","    - cron: '0 6 * * 1'  # Every Monday 6am UTC","  workflow_dispatch:","","jobs:","  sync:","    runs-on: ubuntu-latest","    steps:","      - uses: actions/checkout@v4","        with:","          token: ${{ secrets.GITHUB_TOKEN }}","          fetch-depth: 0","      - run: git remote add upstream https://github.com/anomalyco/opencode.git","      - run: git fetch upstream","      - run: git config user.email \"lacy@example.com\"","      - run: git config user.name \"Lacy Bot\"","      - run: |","          git merge upstream/dev --no-commit --no-ff || true","          # Check if there are conflicts","          if git diff --name-only --diff-filter=U | grep -q .; then","            echo \"CONFLICTS=true\" \u003e\u003e $GITHUB_ENV","          fi","      - name: Open PR if merge succeeds","        if: env.CONFLICTS != 'true'","        run: |","          git commit -m \"chore: merge upstream dev\"","          git push origin HEAD:upstream-sync-$(date +%Y%m%d)","          gh pr create --title \"Upstream sync $(date +%Y-%m-%d)\" ...","```","","For conflict-free or simple merges, this can be fully automated. Conflicted merges (like `prompt.ts` refactors) require manual resolution — create a PR instead and resolve manually.","","## Sync History","","| Date | Upstream commits merged | Conflicts | Notes |","|------|------------------------|-----------|-------|","| 2026-04-02 | 673 (cf7ca9b2f → 92e820fdc) | 28 files | Major Effect rewrite of prompt.ts |","| 2026-04-28 | (QA only — no new merge) | — | LAC-163: found 3 regressions post-merge: missing double border, wrong Tab keybind, border height mismatch. Fixed in commits bde00fa30, 85faf49fc, 9d7ac27c1. Added this QA checklist. |","| 2026-06-26 | 629 (catch-up) | — | PR #31 merged. |","| 2026-06-30 | 68 | escalated → LAC-2496 | PR #32 opened; later superseded by PR #39. |","| 2026-07-07 | 195 (→ v1.17.15) | prompt/index.tsx re-architecture | LAC-2556: merge completed on-branch; run died in API outage before PR. mode_toggle/handleModeToggleKey replaced by direct ctrl+space `prompt.mode.toggle` binding; TUI moved to `packages/tui/`. |","| 2026-07-13 | 90 (→ v1.17.18) | 15 version bumps, TEAM_MEMBERS, 1 hunk in prompt/index.tsx | LAC-2739: consolidated PR #39 (06-30 + 07-07 + 07-13). Kept lash `shortenedWorkingDir` footer over upstream's session-directory display. Typecheck 30/30. |","| 2026-07-20 | 153 (→ v1.18.3) | 15 version bumps, bun.lock | LAC-2865: merged into PR #39 branch (dev still awaiting PR #39 merge). Also merged origin/dev (PR #40 Windows deflake). No complex conflicts; invariants verified. |","| 2026-07-27 | 167 (→ v1.18.7) | 15 version bumps, bun.lock | LAC-3102: built on LAC-2739 branch (PR #39 still open). Version conflicts auto-resolved (kept lash 1.7.x). Typecheck gate: 0 errors. No changes to prompt.ts/keybinds.ts/types.gen.ts. agent_cycle=shift+tab verified. |","| 2026-08-04 | 132 (→ v1.18.13) | 15 version bumps, bun.lock | LAC-3206: continued on LAC-3102 branch (PR #42), which fully contains PR #39 → #39 superseded/closable. All conflicts standard (kept lash 1.7.13; bun.lock regenerated). Flagged complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. agent_cycle=shift+tab verified. **Backlog risk: sync PRs (#39→#42) have not landed on dev since 07-13; escalate merge decision.** |","| 2026-08-10 | 59 (→ v1.18.16) | 15 version bumps, bun.lock | LAC-3264: continued on LAC-3102 branch (PR #42, still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from clean base — delta was internal versions + upstream's new @ai-sdk/openai-compatible@2.0.41 patch entry). Complex files: prompt.ts got 1 upstream fix hunk (orphan detection via parentID), prompt/index.tsx got cursor-style config (#32295); keybind.ts/app.tsx/types.gen.ts untouched. All invariants verified; agent_cycle=shift+tab. Typecheck 30/30. **Backlog risk persists: PR #42 unmerged since 07-13 lineage.** |","| 2026-09-04 | (audit — no new upstream merge) | — | Merged PR #41 + PR #43 into `dev`, then `dev` → `lash` (`aa19cdfb11`, clean). Added `lash` to test/typecheck/nix-eval workflow branch filters. Routine repointed to target `lash`. Open: LAC-3268 visual QA, LAC-2396 release 1.7.14, LAC-3732 cwd-footer defect. |","| 2026-08-17 | 62 (→ v1.18.18) | version bumps, bun.lock, beta.yml | LAC-3333: fresh branch from dev (PR #42 merged 2026-08-10). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). Complex files: all 5 (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. EventCwdUpdated in types.gen.ts ✓, agent_cycle=shift+tab ✓, getCwd() in prompt.ts ✓. Typecheck 30/30. PR #43. |","| 2026-08-24 | 113 (→ v1.18.21) | 15 version bumps, bun.lock | LAC-3413: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). **Gotcha caught: `git checkout --ours` on packages/opencode/package.json dropped upstream's @ai-sdk/amazon-bedrock 4.0.158 + google-vertex 4.0.181 pin bumps — re-applied manually. When verifying version-only conflicts, diff merge-base→upstream per file; files reverted to ours vanish from `git diff --cached`.** Complex files: prompt.ts got 1 fix hunk (continue unknown finish responses #43892), types.gen.ts 2 lines (upgrade endpoint #44686) — both auto-merged clean, no escalation. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd() ✓. Typecheck 30/30. |","| 2026-08-31 | 62 (→ v1.18.25) | 15 version bumps, bun.lock | LAC-3587: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only — each package.json had a single version-line hunk (resolved in-place keeping lash 1.7.13, upstream dep changes auto-merged outside the hunk; no `checkout --ours`, so no pin-drop gotcha). bun.lock regenerated from upstream base; float check clean (only upstream's own 1.18.25 bumps + number-flow add / d3-geo removals). Complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybind.ts) untouched by upstream this week. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd(ctx.directory) ✓, detectNaturalLanguage ✓. Typecheck 30/30. **Backlog note: PR #43 now carries 3 weeks (08-17/08-24/08-31) awaiting merge by Lacy.** |"],"stylingDirectives":[[[0,21,"pl-mh"],[2,21,"pl-en"]],[],[[18,19,"pl-s"],[37,38,"pl-s"],[38,39,"pl-s"],[39,76,"pl-corl"],[76,77,"pl-s"],[142,143,"pl-s"],[143,147,"pl-c1"],[147,148,"pl-s"]],[],[[0,11,"pl-mh"],[3,11,"pl-en"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[19,21,"pl-s"],[23,24,"pl-s"],[24,32,"pl-c1"],[32,33,"pl-s"],[36,37,"pl-s"],[37,78,"pl-c1"],[78,79,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[17,19,"pl-s"],[21,22,"pl-s"],[22,26,"pl-c1"],[26,27,"pl-s"],[30,32,"pl-s"],[32,33,"pl-s"],[33,37,"pl-c1"],[37,38,"pl-s"],[122,123,"pl-s"],[123,127,"pl-c1"],[127,128,"pl-s"],[136,137,"pl-s"],[137,140,"pl-c1"],[140,141,"pl-s"],[142,144,"pl-s"],[146,147,"pl-s"],[147,162,"pl-c1"],[162,163,"pl-s"],[187,188,"pl-s"],[188,192,"pl-c1"],[192,193,"pl-s"],[225,228,"pl-s"],[226,228,"pl-corl"],[246,247,"pl-s"],[247,250,"pl-c1"],[250,251,"pl-s"],[253,254,"pl-s"],[254,257,"pl-c1"],[257,258,"pl-s"],[280,281,"pl-s"],[281,285,"pl-c1"],[285,286,"pl-s"],[290,291,"pl-s"],[291,301,"pl-c1"],[301,302,"pl-s"],[307,308,"pl-s"],[308,311,"pl-c1"],[311,312,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[16,18,"pl-s"],[20,21,"pl-s"],[21,33,"pl-c1"],[33,34,"pl-s"]],[],[[0,25,"pl-mh"],[3,25,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,19,"pl-c"],[0,1,"pl-c"]],[],[],[[0,73,"pl-c"],[0,1,"pl-c"]],[],[],[[0,54,"pl-c"],[0,1,"pl-c"]],[[0,19,"pl-c"],[0,1,"pl-c"]],[],[[0,24,"pl-c"],[0,1,"pl-c"]],[],[],[[0,21,"pl-c"],[0,1,"pl-c"]],[],[[14,51,"pl-s"],[14,15,"pl-pds"],[50,51,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,20,"pl-mh"],[3,20,"pl-en"]],[],[],[],[[0,3,"pl-ms"]],[],[[0,88,"pl-mh"],[4,88,"pl-en"],[34,35,"pl-s"],[35,58,"pl-c1"],[58,59,"pl-s"],[61,62,"pl-s"],[62,86,"pl-c1"],[86,87,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"],[13,14,"pl-s"],[14,21,"pl-c1"],[21,22,"pl-s"],[51,52,"pl-s"],[52,57,"pl-c1"],[57,58,"pl-s"],[74,75,"pl-s"],[75,80,"pl-c1"],[80,81,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[21,23,"pl-s"],[37,39,"pl-s"],[41,42,"pl-s"],[42,47,"pl-c1"],[47,48,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,36,"pl-c"],[0,1,"pl-c"]],[[0,3,"pl-k"],[4,5,"pl-smi"],[6,8,"pl-k"],[18,19,"pl-k"],[57,58,"pl-k"],[59,61,"pl-k"]],[[13,14,"pl-s"],[13,14,"pl-pds"]],[[0,14,"pl-s"]],[[0,27,"pl-s"],[16,18,"pl-smi"]],[[0,17,"pl-s"]],[[0,81,"pl-s"],[20,22,"pl-cce"],[29,31,"pl-cce"],[33,35,"pl-cce"],[44,46,"pl-cce"],[49,51,"pl-cce"]],[[0,30,"pl-s"],[6,8,"pl-cce"],[15,17,"pl-cce"],[19,21,"pl-cce"],[23,25,"pl-cce"]],[[0,26,"pl-s"]],[[0,1,"pl-s"]],[[0,30,"pl-s"],[6,8,"pl-smi"]],[[0,1,"pl-s"],[0,1,"pl-pds"]],[[0,4,"pl-k"]],[[0,3,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,48,"pl-mh"],[4,48,"pl-en"],[12,13,"pl-s"],[13,25,"pl-c1"],[25,26,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"],[35,36,"pl-s"],[36,55,"pl-c1"],[55,56,"pl-s"],[78,79,"pl-s"],[79,86,"pl-c1"],[86,87,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[21,23,"pl-s"],[41,43,"pl-s"],[58,60,"pl-s"],[60,61,"pl-s"],[61,68,"pl-c1"],[68,69,"pl-s"],[75,77,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,47,"pl-mh"],[4,47,"pl-en"],[7,8,"pl-s"],[8,46,"pl-c1"],[46,47,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[21,23,"pl-s"],[37,39,"pl-s"],[103,104,"pl-s"],[104,119,"pl-c1"],[119,120,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,48,"pl-mh"],[4,48,"pl-en"],[7,8,"pl-s"],[8,47,"pl-c1"],[47,48,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"],[61,62,"pl-s"],[62,77,"pl-c1"],[77,78,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[101,102,"pl-s"],[102,117,"pl-c1"],[117,118,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[7,8,"pl-s"],[8,23,"pl-c1"],[23,24,"pl-s"],[32,33,"pl-s"],[33,38,"pl-c1"],[38,39,"pl-s"],[57,58,"pl-s"],[58,80,"pl-c1"],[80,81,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"]],[[0,29,"pl-c"],[0,2,"pl-c"]],[[0,6,"pl-k"],[7,11,"pl-k"],[12,27,"pl-en"],[28,29,"pl-k"]],[[6,7,"pl-k"],[8,21,"pl-s"],[8,9,"pl-pds"],[20,21,"pl-pds"]],[[12,13,"pl-k"]],[[7,8,"pl-k"],[9,15,"pl-c1"]],[],[],[],[[0,27,"pl-c"],[0,2,"pl-c"]],[[2,3,"pl-k"],[4,19,"pl-smi"]],[[0,3,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,47,"pl-mh"],[4,47,"pl-en"],[7,8,"pl-s"],[8,46,"pl-c1"],[46,47,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[21,23,"pl-s"],[47,49,"pl-s"],[99,100,"pl-s"],[100,116,"pl-c1"],[116,117,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,43,"pl-mh"],[4,43,"pl-en"],[7,8,"pl-s"],[8,42,"pl-c1"],[42,43,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"],[17,18,"pl-s"],[18,21,"pl-c1"],[21,22,"pl-s"],[35,36,"pl-s"],[36,45,"pl-c1"],[45,46,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[35,36,"pl-s"],[36,44,"pl-c1"],[44,45,"pl-s"],[50,51,"pl-s"],[51,64,"pl-c1"],[64,65,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"]],[[0,25,"pl-c"],[0,2,"pl-c"]],[[0,5,"pl-k"],[0,5,"pl-k"],[10,11,"pl-k"],[12,18,"pl-smi"],[19,26,"pl-smi"],[27,28,"pl-k"],[29,34,"pl-k"],[35,46,"pl-en"],[47,53,"pl-smi"],[54,61,"pl-smi"],[63,71,"pl-smi"],[72,81,"pl-smi"],[83,88,"pl-smi"],[90,91,"pl-k"],[92,100,"pl-smi"],[101,110,"pl-smi"]],[],[[0,21,"pl-c"],[0,2,"pl-c"]],[[0,5,"pl-k"],[0,5,"pl-k"],[10,11,"pl-k"],[12,18,"pl-smi"],[19,26,"pl-smi"],[27,29,"pl-k"],[30,36,"pl-en"]],[],[[0,22,"pl-c"],[0,2,"pl-c"]],[[0,5,"pl-k"],[0,5,"pl-k"],[10,11,"pl-k"],[12,18,"pl-smi"],[19,26,"pl-smi"],[27,28,"pl-k"],[29,34,"pl-k"],[35,46,"pl-en"],[47,53,"pl-smi"],[54,61,"pl-smi"],[63,69,"pl-en"],[73,78,"pl-smi"],[80,81,"pl-k"],[82,88,"pl-en"]],[[0,3,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,56,"pl-mh"],[4,56,"pl-en"],[7,8,"pl-s"],[8,47,"pl-c1"],[47,48,"pl-s"]],[],[[84,85,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[21,23,"pl-s"],[48,50,"pl-s"],[52,53,"pl-s"],[53,74,"pl-c1"],[74,75,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[],[[0,2,"pl-s"],[19,20,"pl-s"],[20,57,"pl-c1"],[57,58,"pl-s"],[60,62,"pl-s"]],[[0,3,"pl-s"],[3,13,"pl-en"]],[[0,6,"pl-k"],[9,15,"pl-smi"],[17,23,"pl-smi"],[25,46,"pl-smi"],[49,53,"pl-k"],[54,67,"pl-s"],[54,55,"pl-pds"],[66,67,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[13,14,"pl-s"],[14,27,"pl-c1"],[27,28,"pl-s"],[34,35,"pl-s"],[35,43,"pl-c1"],[43,44,"pl-s"],[65,67,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[8,9,"pl-k"],[11,12,"pl-s"],[11,12,"pl-pds"],[12,12,"pl-ii"]],[[8,9,"pl-k"],[10,14,"pl-c1"],[15,56,"pl-s"],[15,16,"pl-pds"],[55,56,"pl-pds"]],[[8,9,"pl-k"],[26,76,"pl-s"],[26,27,"pl-pds"],[75,76,"pl-pds"],[78,123,"pl-s"],[78,79,"pl-pds"],[122,123,"pl-pds"]],[[0,4,"pl-c1"],[5,46,"pl-s"],[5,6,"pl-pds"],[45,46,"pl-pds"],[48,51,"pl-s"],[48,49,"pl-pds"],[50,51,"pl-pds"]],[[0,1,"pl-s"],[0,1,"pl-pds"],[1,1,"pl-ii"]],[[0,3,"pl-bu"]],[],[[0,2,"pl-k"],[44,71,"pl-bu"],[75,97,"pl-bu"],[97,99,"pl-k"]],[],[[0,2,"pl-k"],[41,45,"pl-k"],[54,55,"pl-k"],[71,73,"pl-k"],[129,132,"pl-k"],[138,154,"pl-bu"],[155,157,"pl-k"],[162,170,"pl-bu"]],[],[[0,2,"pl-k"],[9,34,"pl-bu"],[40,42,"pl-k"],[60,62,"pl-k"]],[],[[11,22,"pl-bu"],[23,26,"pl-k"]],[],[[0,2,"pl-ii"],[2,3,"pl-k"]],[],[[0,50,"pl-c"],[0,1,"pl-c"]],[],[[0,2,"pl-k"],[9,11,"pl-k"],[27,46,"pl-bu"],[48,66,"pl-bu"]],[],[[0,2,"pl-k"],[12,14,"pl-k"]],[[0,1,"pl-c1"],[8,10,"pl-k"],[14,16,"pl-k"],[30,90,"pl-s"],[30,31,"pl-pds"],[89,90,"pl-pds"],[92,124,"pl-bu"]],[[0,1,"pl-c1"],[8,10,"pl-k"],[18,74,"pl-s"],[18,19,"pl-pds"],[74,74,"pl-ii"]],[],[[0,6,"pl-bu"]],[[0,1,"pl-k"],[18,19,"pl-k"]],[[2,3,"pl-k"],[24,25,"pl-k"],[30,32,"pl-k"],[47,49,"pl-k"]],[[4,5,"pl-k"],[23,24,"pl-k"],[30,32,"pl-k"],[47,49,"pl-k"]],[[6,7,"pl-k"],[23,28,"pl-c1"],[41,42,"pl-k"],[42,43,"pl-k"]],[[4,5,"pl-k"],[5,6,"pl-k"],[24,25,"pl-k"]],[[2,3,"pl-k"],[3,4,"pl-k"],[25,26,"pl-k"]],[[0,1,"pl-k"],[1,2,"pl-k"],[19,20,"pl-k"]],[[0,3,"pl-bu"]],[],[[0,2,"pl-ii"],[2,3,"pl-k"]],[],[[0,58,"pl-c"],[0,1,"pl-c"]],[],[[0,2,"pl-k"],[9,11,"pl-k"],[27,50,"pl-bu"],[60,63,"pl-k"]],[],[[0,2,"pl-k"],[12,14,"pl-k"],[21,23,"pl-k"],[31,169,"pl-s"],[31,32,"pl-pds"],[120,127,"pl-c1"],[169,169,"pl-ii"]],[],[[0,2,"pl-ii"],[2,3,"pl-k"]],[],[[0,78,"pl-c"],[0,1,"pl-c"]],[],[[0,2,"pl-k"],[12,14,"pl-k"],[21,23,"pl-k"],[31,80,"pl-s"],[31,32,"pl-pds"],[80,80,"pl-ii"]],[],[[0,1,"pl-c1"],[3,9,"pl-bu"],[4,8,"pl-c1"],[20,21,"pl-k"]],[[0,1,"pl-c1"],[3,24,"pl-bu"],[25,31,"pl-k"]],[[0,1,"pl-c1"],[3,21,"pl-bu"],[4,5,"pl-k"],[8,9,"pl-k"],[31,49,"pl-bu"],[51,72,"pl-bu"],[74,92,"pl-bu"]],[[0,1,"pl-c1"],[3,18,"pl-bu"],[19,23,"pl-k"],[24,37,"pl-bu"],[25,26,"pl-k"],[31,32,"pl-k"]],[[0,1,"pl-c1"],[3,35,"pl-bu"],[24,25,"pl-ii"]],[[0,1,"pl-c1"],[3,49,"pl-bu"],[42,43,"pl-k"],[50,52,"pl-k"],[59,63,"pl-c1"],[64,65,"pl-k"]],[[0,1,"pl-c1"],[3,39,"pl-bu"],[48,50,"pl-k"]],[[0,1,"pl-c1"],[3,24,"pl-bu"]],[[0,1,"pl-c1"],[3,20,"pl-bu"]],[[0,2,"pl-c1"],[4,24,"pl-bu"],[25,27,"pl-k"],[54,78,"pl-bu"],[66,68,"pl-k"],[70,77,"pl-s"],[70,71,"pl-pds"],[76,77,"pl-pds"]],[[0,2,"pl-c1"],[4,27,"pl-bu"],[28,30,"pl-k"],[31,42,"pl-bu"]],[[0,2,"pl-c1"],[4,25,"pl-bu"],[26,28,"pl-k"]],[[0,2,"pl-c1"],[30,32,"pl-k"]],[[0,2,"pl-c1"],[21,23,"pl-k"]],[],[[0,2,"pl-k"],[20,22,"pl-k"],[104,106,"pl-k"],[116,118,"pl-k"],[120,123,"pl-k"]],[],[[0,6,"pl-bu"]],[[0,1,"pl-k"],[11,12,"pl-k"],[14,20,"pl-s"],[14,15,"pl-pds"],[19,20,"pl-pds"],[34,35,"pl-k"],[72,73,"pl-k"],[75,78,"pl-c1"],[121,124,"pl-s"],[121,122,"pl-pds"],[123,124,"pl-pds"],[126,127,"pl-k"]],[[2,3,"pl-k"],[20,21,"pl-k"],[21,26,"pl-s"],[21,22,"pl-pds"],[25,26,"pl-pds"],[26,27,"pl-k"]],[[4,5,"pl-k"]],[[11,12,"pl-k"],[13,14,"pl-c1"]],[[15,16,"pl-k"],[16,25,"pl-s"],[16,17,"pl-pds"],[24,25,"pl-pds"]],[[12,13,"pl-k"],[15,21,"pl-s"],[15,16,"pl-pds"],[20,21,"pl-pds"]],[[17,18,"pl-k"]],[[23,24,"pl-k"],[27,30,"pl-c1"]],[[4,5,"pl-k"],[5,6,"pl-k"]],[[4,5,"pl-k"],[20,21,"pl-k"],[22,23,"pl-c1"],[37,38,"pl-k"],[39,40,"pl-c1"],[52,53,"pl-k"],[54,55,"pl-c1"],[67,68,"pl-k"],[69,70,"pl-c1"],[87,88,"pl-k"],[122,123,"pl-k"],[124,125,"pl-c1"],[126,127,"pl-k"]],[[7,9,"pl-k"],[19,20,"pl-k"],[28,30,"pl-k"]],[[4,5,"pl-k"],[5,6,"pl-k"],[9,10,"pl-k"]],[[2,3,"pl-k"],[3,4,"pl-k"],[7,8,"pl-k"]],[[0,1,"pl-k"],[1,2,"pl-k"],[5,6,"pl-k"]],[[0,3,"pl-s"]],[],[[0,267,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[19,21,"pl-s"],[30,31,"pl-s"],[31,48,"pl-c1"],[48,49,"pl-s"],[171,172,"pl-s"],[172,181,"pl-c1"],[181,182,"pl-s"],[185,186,"pl-s"],[186,205,"pl-c1"],[205,206,"pl-s"]],[[0,0,"pl-ent"]],[[0,3,"pl-ms"]],[],[[0,50,"pl-mh"],[4,50,"pl-en"],[8,9,"pl-s"],[9,49,"pl-c1"],[49,50,"pl-s"]],[],[[0,2,"pl-s"],[9,11,"pl-s"],[35,36,"pl-s"],[36,47,"pl-c1"],[47,48,"pl-s"],[52,53,"pl-s"],[53,56,"pl-c1"],[56,57,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[23,24,"pl-s"],[24,35,"pl-c1"],[35,36,"pl-s"],[43,44,"pl-s"],[44,53,"pl-c1"],[53,54,"pl-s"],[60,61,"pl-s"],[61,64,"pl-c1"],[64,65,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"]],[[0,11,"pl-en"],[13,20,"pl-en"],[21,32,"pl-s"],[21,22,"pl-pds"],[31,32,"pl-pds"],[34,46,"pl-s"],[34,35,"pl-pds"],[45,46,"pl-pds"]],[[0,19,"pl-en"],[21,28,"pl-en"],[29,35,"pl-s"],[29,30,"pl-pds"],[34,35,"pl-pds"],[37,53,"pl-s"],[37,38,"pl-pds"],[52,53,"pl-pds"]],[[0,3,"pl-s"]],[],[[18,19,"pl-s"],[19,28,"pl-c1"],[28,29,"pl-s"],[33,34,"pl-s"],[34,50,"pl-c1"],[50,51,"pl-s"],[56,57,"pl-s"],[57,83,"pl-c1"],[83,84,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,18,"pl-mh"],[4,18,"pl-en"],[8,9,"pl-s"],[9,17,"pl-c1"],[17,18,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[27,28,"pl-s"],[28,39,"pl-c1"],[39,40,"pl-s"],[125,126,"pl-s"],[126,127,"pl-c1"],[127,128,"pl-s"],[226,227,"pl-s"],[227,249,"pl-c1"],[249,250,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[32,107,"pl-c"],[32,33,"pl-c"]],[[33,79,"pl-c"],[33,34,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[27,28,"pl-k"],[37,44,"pl-s"],[37,38,"pl-pds"],[43,44,"pl-pds"],[45,46,"pl-k"],[56,75,"pl-s"],[56,57,"pl-pds"],[74,75,"pl-pds"],[76,77,"pl-k"]],[[0,3,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,26,"pl-mh"],[3,26,"pl-en"]],[],[],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[[0,1,"pl-v"],[2,5,"pl-k"]],[[0,1,"pl-v"],[2,5,"pl-k"],[24,26,"pl-s"],[37,39,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[24,25,"pl-s"],[25,26,"pl-c1"],[26,27,"pl-s"]],[],[[0,12,"pl-mh"],[4,12,"pl-en"]],[[0,1,"pl-v"],[2,5,"pl-k"],[6,8,"pl-s"],[11,13,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[6,8,"pl-s"],[17,19,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[6,8,"pl-s"],[18,20,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[6,8,"pl-s"],[13,15,"pl-s"],[34,36,"pl-s"],[47,49,"pl-s"]],[],[[0,28,"pl-mh"],[4,28,"pl-en"]],[[0,1,"pl-v"],[2,5,"pl-k"],[59,60,"pl-s"],[60,76,"pl-c1"],[76,77,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"]],[],[[0,14,"pl-mh"],[4,14,"pl-en"]],[[0,1,"pl-v"],[2,5,"pl-k"],[13,14,"pl-s"],[14,15,"pl-c1"],[15,16,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"]],[[0,1,"pl-v"],[2,5,"pl-k"]],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[[0,1,"pl-v"],[2,5,"pl-k"],[49,50,"pl-s"],[50,61,"pl-c1"],[61,62,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[14,15,"pl-s"],[15,23,"pl-c1"],[23,24,"pl-s"]],[],[[0,13,"pl-mh"],[4,13,"pl-en"]],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,2,"pl-c1"],[21,23,"pl-k"]],[[0,3,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,35,"pl-mh"],[3,35,"pl-en"]],[],[],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[18,19,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-ml"],[18,19,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[15,16,"pl-s"],[16,24,"pl-c1"],[24,25,"pl-s"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,53,"pl-c1"],[53,54,"pl-s"],[55,56,"pl-ml"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[28,29,"pl-ml"],[30,31,"pl-s"],[31,68,"pl-c1"],[68,69,"pl-s"],[70,71,"pl-ml"],[85,86,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,65,"pl-c1"],[65,66,"pl-s"],[67,68,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,79,"pl-c1"],[79,80,"pl-s"],[81,82,"pl-ml"],[95,96,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,73,"pl-c1"],[73,74,"pl-s"],[75,76,"pl-ml"],[93,94,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,60,"pl-c1"],[60,61,"pl-s"],[62,63,"pl-ml"],[83,84,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,57,"pl-c1"],[57,58,"pl-s"],[59,60,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,49,"pl-c1"],[49,50,"pl-s"],[51,52,"pl-ml"],[75,76,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,71,"pl-c1"],[71,72,"pl-s"],[74,75,"pl-s"],[75,93,"pl-c1"],[93,94,"pl-s"],[104,105,"pl-ml"],[115,116,"pl-s"],[116,127,"pl-c1"],[127,128,"pl-s"],[163,164,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,61,"pl-c1"],[61,62,"pl-s"],[63,64,"pl-ml"],[85,86,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,67,"pl-c1"],[67,68,"pl-s"],[69,70,"pl-ml"],[94,95,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-ml"],[22,23,"pl-s"],[23,53,"pl-c1"],[53,54,"pl-s"],[55,56,"pl-ml"],[80,81,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-s"],[10,16,"pl-c1"],[16,17,"pl-s"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,48,"pl-c1"],[48,49,"pl-s"],[50,51,"pl-ml"],[74,75,"pl-ml"]],[],[[0,31,"pl-mh"],[3,31,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,37,"pl-c"],[0,1,"pl-c"]],[[0,4,"pl-ent"],[6,19,"pl-s"]],[[0,2,"pl-ent"]],[[2,10,"pl-ent"]],[[6,10,"pl-ent"],[12,23,"pl-s"],[12,13,"pl-pds"],[22,23,"pl-pds"],[25,47,"pl-c"],[25,26,"pl-c"]],[[2,19,"pl-ent"]],[],[[0,4,"pl-ent"]],[[2,6,"pl-ent"]],[[4,11,"pl-ent"],[13,26,"pl-s"]],[[4,9,"pl-ent"]],[[8,12,"pl-ent"],[14,33,"pl-s"]],[[8,12,"pl-ent"]],[[10,15,"pl-ent"],[17,44,"pl-s"]],[[10,21,"pl-ent"],[23,24,"pl-c1"]],[[8,11,"pl-ent"],[13,78,"pl-s"]],[[8,11,"pl-ent"],[13,31,"pl-s"]],[[8,11,"pl-ent"],[13,53,"pl-s"]],[[8,11,"pl-ent"],[13,44,"pl-s"]],[[8,11,"pl-ent"],[13,14,"pl-s"]],[[0,60,"pl-s"],[56,60,"pl-c1"]],[[0,40,"pl-s"]],[[0,67,"pl-s"]],[[0,48,"pl-s"]],[[0,12,"pl-s"]],[[0,0,"pl-s"],[8,12,"pl-ent"],[14,39,"pl-s"]],[[8,10,"pl-ent"],[12,35,"pl-s"]],[[8,11,"pl-ent"],[13,14,"pl-s"]],[[0,51,"pl-s"]],[[0,60,"pl-s"]],[[0,68,"pl-s"]],[[0,0,"pl-s"],[0,3,"pl-s"],[0,1,"pl-pds"],[1,2,"pl-pds"],[2,3,"pl-pds"]],[[0,0,"pl-s"]],[[0,90,"pl-s"],[89,90,"pl-pds"],[90,181,"pl-s"]],[],[[0,15,"pl-c"],[0,1,"pl-c"]],[],[[0,54,"pl-s"]],[[0,53,"pl-s"]],[[0,91,"pl-s"]],[[0,53,"pl-ent"],[55,229,"pl-s"]],[[0,39,"pl-s"],[39,52,"pl-c"],[39,40,"pl-c"]],[[0,46,"pl-s"],[46,87,"pl-c"],[46,47,"pl-c"]],[[0,77,"pl-ent"],[79,263,"pl-s"]],[[0,102,"pl-ent"],[104,120,"pl-s"],[120,249,"pl-c"],[120,121,"pl-c"]],[[0,70,"pl-ent"],[72,87,"pl-s"],[87,226,"pl-c"],[87,88,"pl-c"]],[[0,70,"pl-ent"],[72,101,"pl-s"],[101,278,"pl-c"],[101,102,"pl-c"]],[[0,71,"pl-ent"],[73,106,"pl-s"],[106,482,"pl-c"],[106,107,"pl-c"]],[[0,70,"pl-ent"],[72,105,"pl-s"],[105,603,"pl-c"],[105,106,"pl-c"]],[[0,63,"pl-s"],[63,312,"pl-c"],[63,64,"pl-c"]],[[0,77,"pl-ent"],[79,105,"pl-s"],[105,443,"pl-c"],[105,106,"pl-c"]],[[0,71,"pl-ent"],[73,106,"pl-s"],[106,766,"pl-c"],[106,107,"pl-c"]],[[0,70,"pl-ent"],[72,105,"pl-s"],[105,775,"pl-c"],[105,106,"pl-c"]]],"colorizedLines":null}},"title":"lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash","appPayload":{},"meta":{"title":"lash/UPSTREAM_SYNC.md at lash · lacymorrow/lash"}}</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="/lacymorrow/lash" 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="lash 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">lash</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="/lacymorrow/lash/tree/lash" data-discover="true">lash</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">UPSTREAM_SYNC.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_1cpla9lik5_" 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_1cpla9lik5_ _R_1cpla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_1cpla9lik5H1_" 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_7p9la9lik5_" id="_R_99la9lik5_"><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_7p9la9lik5_">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_7pdla9lik5_" id="_R_9dla9lik5_"><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_7pdla9lik5_">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="/lacymorrow/lash/commits/lash/UPSTREAM_SYNC.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="/lacymorrow/lash/commits/lash/UPSTREAM_SYNC.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.7 KB" style="--truncate-max-width:100%"><span>379 lines (279 loc) · 17.7 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="lash 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">lash</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="/lacymorrow/lash/tree/lash" data-discover="true">lash</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">UPSTREAM_SYNC.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.7 KB" style="--truncate-max-width:100%"><span>379 lines (279 loc) · 17.7 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/lacymorrow/lash/raw/refs/heads/lash/UPSTREAM_SYNC.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">Upstream Sync Guide</h1><a id="user-content-upstream-sync-guide" class="anchor" aria-label="Permalink: Upstream Sync Guide" href="#upstream-sync-guide"><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">Lash is a fork of <a href="https://github.com/anomalyco/opencode">anomalyco/opencode</a>. This document describes how to merge upstream changes into the <code>lash</code> branch.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Overview</h2><a id="user-content-overview" class="anchor" aria-label="Permalink: Overview" href="#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>
<ul dir="auto">
<li><strong>Upstream remote</strong>: <code>upstream</code> → <code>https://github.com/anomalyco/opencode.git</code></li>
<li><strong>Target branch</strong>: <code>lash</code> — <strong><code>lash</code> is the GitHub default and the working branch. Sync PRs, fixes, and releases target <code>lash</code>, never <code>dev</code>.</strong> (<code>release-lash.ts</code> only force-releases on <code>lash</code>.) 2026-09-04: syncs through PR #43 had drifted onto <code>dev</code>; <code>dev</code> was merged back into <code>lash</code> at <code>aa19cdfb11</code> and <code>dev</code> is no longer a working branch.</li>
<li><strong>Merge target</strong>: <code>upstream/dev</code></li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Quick Sync (recurring)</h2><a id="user-content-quick-sync-recurring" class="anchor" aria-label="Permalink: Quick Sync (recurring)" href="#quick-sync-recurring"><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="# 1. Fetch upstream
git fetch upstream

# 2. Merge (no fast-forward, no auto-commit so conflicts can be resolved)
git merge upstream/dev --no-commit --no-ff

# 3. Resolve conflicts (see &quot;Conflict Playbook&quot; below)
# ... fix files ...

# 4. Regenerate lockfile
bun install

# 5. Stage and commit
git add -A
git commit -m &quot;merge: bring upstream dev into lash&quot;"><pre><span class="pl-c"><span class="pl-c">#</span> 1. Fetch upstream</span>
git fetch upstream

<span class="pl-c"><span class="pl-c">#</span> 2. Merge (no fast-forward, no auto-commit so conflicts can be resolved)</span>
git merge upstream/dev --no-commit --no-ff

<span class="pl-c"><span class="pl-c">#</span> 3. Resolve conflicts (see "Conflict Playbook" below)</span>
<span class="pl-c"><span class="pl-c">#</span> ... fix files ...</span>

<span class="pl-c"><span class="pl-c">#</span> 4. Regenerate lockfile</span>
bun install

<span class="pl-c"><span class="pl-c">#</span> 5. Stage and commit</span>
git add -A
git commit -m <span class="pl-s"><span class="pl-pds">"</span>merge: bring upstream dev into lash<span class="pl-pds">"</span></span></pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Conflict Playbook</h2><a id="user-content-conflict-playbook" class="anchor" aria-label="Permalink: Conflict Playbook" href="#conflict-playbook"><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">Every upstream merge tends to produce the same categories of conflicts. This section documents how to resolve each.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">1. Package version conflicts (<code>packages/*/package.json</code>, <code>sdks/vscode/package.json</code>)</h3><a id="user-content-1-package-version-conflicts-packagespackagejson-sdksvscodepackagejson" class="anchor" aria-label="Permalink: 1. Package version conflicts (packages/*/package.json, sdks/vscode/package.json)" href="#1-package-version-conflicts-packagespackagejson-sdksvscodepackagejson"><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"><strong>Pattern</strong>: <code>version</code> field differs between lash (<code>1.7.x</code>) and upstream (<code>1.x.x</code>).</p>
<p dir="auto"><strong>Resolution</strong>: Keep <strong>lash's version</strong> (<code>1.7.x</code>). All packages are versioned together.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Automated fix — keep lash version:
for f in packages/*/package.json sdks/vscode/package.json; do
  python3 -c &quot;
import re, sys
content = open('$f').read()
content = re.sub(
  r'&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\n  \&quot;version\&quot;: \&quot;(1\.7\.[^\&quot;]+)\&quot;,\n.*?&gt;&gt;&gt;&gt;&gt;&gt;&gt; upstream/dev\n',
  r'  \&quot;version\&quot;: \&quot;\1\&quot;,\n',
  content, flags=re.DOTALL
)
open('$f', 'w').write(content)
&quot;
done"><pre><span class="pl-c"><span class="pl-c">#</span> Automated fix — keep lash version:</span>
<span class="pl-k">for</span> <span class="pl-smi">f</span> <span class="pl-k">in</span> packages/<span class="pl-k">*</span>/package.json sdks/vscode/package.json<span class="pl-k">;</span> <span class="pl-k">do</span>
  python3 -c <span class="pl-s"><span class="pl-pds">"</span></span>
<span class="pl-s">import re, sys</span>
<span class="pl-s">content = open('<span class="pl-smi">$f</span>').read()</span>
<span class="pl-s">content = re.sub(</span>
<span class="pl-s">  r'&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\n  <span class="pl-cce">\"</span>version<span class="pl-cce">\"</span>: <span class="pl-cce">\"</span>(1\.7\.[^<span class="pl-cce">\"</span>]+)<span class="pl-cce">\"</span>,\n.*?&gt;&gt;&gt;&gt;&gt;&gt;&gt; upstream/dev\n',</span>
<span class="pl-s">  r'  <span class="pl-cce">\"</span>version<span class="pl-cce">\"</span>: <span class="pl-cce">\"</span>\1<span class="pl-cce">\"</span>,\n',</span>
<span class="pl-s">  content, flags=re.DOTALL</span>
<span class="pl-s">)</span>
<span class="pl-s">open('<span class="pl-smi">$f</span>', 'w').write(content)</span>
<span class="pl-s"><span class="pl-pds">"</span></span>
<span class="pl-k">done</span></pre></div>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">2. Root <code>package.json</code> — patchedDependencies</h3><a id="user-content-2-root-packagejson--patcheddependencies" class="anchor" aria-label="Permalink: 2. Root package.json — patchedDependencies" href="#2-root-packagejson--patcheddependencies"><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"><strong>Pattern</strong>: Upstream replaces the <code>patchedDependencies</code> entries; lash adds a <code>funding</code> block.</p>
<p dir="auto"><strong>Resolution</strong>: Take <strong>upstream's patches</strong> + keep lash's <strong><code>funding</code> block</strong>.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">3. <code>packages/extensions/zed/extension.toml</code></h3><a id="user-content-3-packagesextensionszedextensiontoml" class="anchor" aria-label="Permalink: 3. packages/extensions/zed/extension.toml" href="#3-packagesextensionszedextensiontoml"><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"><strong>Pattern</strong>: Version + archive URLs differ.</p>
<p dir="auto"><strong>Resolution</strong>: Keep <strong>lash's version</strong> (the archive URLs point to anomalyco/opencode — update them to <code>lacymorrow/lash</code> when publishing to Zed marketplace).</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">4. <code>packages/sdk/js/src/v2/gen/types.gen.ts</code></h3><a id="user-content-4-packagessdkjssrcv2gentypesgents" class="anchor" aria-label="Permalink: 4. packages/sdk/js/src/v2/gen/types.gen.ts" href="#4-packagessdkjssrcv2gentypesgents"><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"><strong>Pattern</strong>: Upstream reorganizes generated types; lash adds <code>EventCwdUpdated</code>.</p>
<p dir="auto"><strong>Resolution</strong>:</p>
<ol dir="auto">
<li>Take the upstream's large block that reorganizes types (keep nothing from our HEAD section except <code>EventCwdUpdated</code>)</li>
<li>Add <code>EventCwdUpdated</code> to the <code>Event</code> union type after <code>EventPermissionReplied</code></li>
</ol>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Keep this type definition:
export type EventCwdUpdated = {
  type: &quot;cwd.updated&quot;
  properties: {
    cwd: string
  }
}

// In the Event union, add:
  | EventCwdUpdated"><pre><span class="pl-c">// Keep this type definition:</span>
<span class="pl-k">export</span> <span class="pl-k">type</span> <span class="pl-smi">EventCwdUpdated</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
  <span class="pl-c1">type</span>: <span class="pl-s">"cwd.updated"</span>
  <span class="pl-c1">properties</span>: <span class="pl-kos">{</span>
    <span class="pl-c1">cwd</span>: <span class="pl-smi">string</span>
  <span class="pl-kos">}</span>
<span class="pl-kos">}</span>

<span class="pl-c">// In the Event union, add:</span>
  <span class="pl-c1">|</span> <span class="pl-smi">EventCwdUpdated</span></pre></div>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">5. <code>packages/opencode/src/server/server.ts</code></h3><a id="user-content-5-packagesopencodesrcserverserverts" class="anchor" aria-label="Permalink: 5. packages/opencode/src/server/server.ts" href="#5-packagesopencodesrcserverserverts"><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"><strong>Pattern</strong>: Upstream reorganizes imports.</p>
<p dir="auto"><strong>Resolution</strong>: Take <strong>upstream's empty section</strong> (upstream moved imports to other files). Our old <code>getCwd, CwdEvent</code> import here was stale and unused.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">6. <code>packages/opencode/src/tool/bash.ts</code></h3><a id="user-content-6-packagesopencodesrctoolbashts" class="anchor" aria-label="Permalink: 6. packages/opencode/src/tool/bash.ts" href="#6-packagesopencodesrctoolbashts"><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"><strong>Pattern</strong>: The <code>cwd</code> variable in <code>execute()</code>.</p>
<p dir="auto"><strong>Resolution</strong>: Combine both — use <code>getCwd()</code> and <code>resolvePath()</code> together:</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// WRONG (upstream only):
const cwd = params.workdir ? await resolvePath(params.workdir, Instance.directory, shell) : Instance.directory

// WRONG (lash only):
const cwd = params.workdir || getCwd()

// CORRECT (combined):
const cwd = params.workdir ? await resolvePath(params.workdir, getCwd(), shell) : getCwd()"><pre><span class="pl-c">// WRONG (upstream only):</span>
<span class="pl-k">const</span> <span class="pl-s1">cwd</span> <span class="pl-c1">=</span> <span class="pl-s1">params</span><span class="pl-kos">.</span><span class="pl-c1">workdir</span> ? <span class="pl-k">await</span> <span class="pl-en">resolvePath</span><span class="pl-kos">(</span><span class="pl-s1">params</span><span class="pl-kos">.</span><span class="pl-c1">workdir</span><span class="pl-kos">,</span> <span class="pl-v">Instance</span><span class="pl-kos">.</span><span class="pl-c1">directory</span><span class="pl-kos">,</span> <span class="pl-s1">shell</span><span class="pl-kos">)</span> : <span class="pl-v">Instance</span><span class="pl-kos">.</span><span class="pl-c1">directory</span>

<span class="pl-c">// WRONG (lash only):</span>
<span class="pl-k">const</span> <span class="pl-s1">cwd</span> <span class="pl-c1">=</span> <span class="pl-s1">params</span><span class="pl-kos">.</span><span class="pl-c1">workdir</span> <span class="pl-c1">||</span> <span class="pl-en">getCwd</span><span class="pl-kos">(</span><span class="pl-kos">)</span>

<span class="pl-c">// CORRECT (combined):</span>
<span class="pl-k">const</span> <span class="pl-s1">cwd</span> <span class="pl-c1">=</span> <span class="pl-s1">params</span><span class="pl-kos">.</span><span class="pl-c1">workdir</span> ? <span class="pl-k">await</span> <span class="pl-en">resolvePath</span><span class="pl-kos">(</span><span class="pl-s1">params</span><span class="pl-kos">.</span><span class="pl-c1">workdir</span><span class="pl-kos">,</span> <span class="pl-en">getCwd</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s1">shell</span><span class="pl-kos">)</span> : <span class="pl-en">getCwd</span><span class="pl-kos">(</span><span class="pl-kos">)</span></pre></div>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">7. <code>packages/opencode/src/session/prompt.ts</code> (MAJOR)</h3><a id="user-content-7-packagesopencodesrcsessionpromptts-major" class="anchor" aria-label="Permalink: 7. packages/opencode/src/session/prompt.ts (MAJOR)" href="#7-packagesopencodesrcsessionpromptts-major"><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">Upstream completely rewrites this file using Effect patterns (1907 lines vs the old ~2500 line async/await version).</p>
<p dir="auto"><strong>Resolution</strong>: Take <strong>upstream's entire version</strong> (<code>git checkout --theirs</code>), then apply lash changes:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git checkout --theirs packages/opencode/src/session/prompt.ts"><pre>git checkout --theirs packages/opencode/src/session/prompt.ts</pre></div>
<p dir="auto">Then manually add:</p>
<p dir="auto"><strong>a) Import (after <code>import { Shell } from "@/shell/shell"</code>):</strong></p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import { getCwd, setCwd, detectNaturalLanguage } from &quot;@shell-mode&quot;"><pre><span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">getCwd</span><span class="pl-kos">,</span> <span class="pl-s1">setCwd</span><span class="pl-kos">,</span> <span class="pl-s1">detectNaturalLanguage</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">"@shell-mode"</span></pre></div>
<p dir="auto"><strong>b) Replace <code>ctx.directory</code> with <code>getCwd()</code> in all path objects:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="python3 -c &quot;
content = open('packages/opencode/src/session/prompt.ts').read()
content = content.replace('path: { cwd: ctx.directory, root: ctx.worktree }', 'path: { cwd: getCwd(), root: ctx.worktree }')
open('packages/opencode/src/session/prompt.ts', 'w').write(content)
&quot;"><pre><span class="pl-s1">python3</span> <span class="pl-c1">-</span><span class="pl-s1">c</span> "
<span class="pl-s1">content</span> <span class="pl-c1">=</span> <span class="pl-en">open</span>(<span class="pl-s">'packages/opencode/src/session/prompt.ts'</span>).<span class="pl-c1">read</span>()
<span class="pl-s1">content</span> <span class="pl-c1">=</span> <span class="pl-s1">content</span>.<span class="pl-c1">replace</span>(<span class="pl-s">'path: { cwd: ctx.directory, root: ctx.worktree }'</span>, <span class="pl-s">'path: { cwd: getCwd(), root: ctx.worktree }'</span>)
<span class="pl-en">open</span>(<span class="pl-s">'packages/opencode/src/session/prompt.ts'</span>, <span class="pl-s">'w'</span>).<span class="pl-c1">write</span>(<span class="pl-s1">content</span>)
"</pre></div>
<p dir="auto"><strong>c) In the bash execution function, change <code>const cwd = ctx.directory</code> to <code>const cwd = getCwd()</code></strong></p>
<p dir="auto"><strong>d) Replace the simple bash invocations with sentinel-wrapped versions</strong> that output the new cwd after each command, then parse and call <code>setCwd(newCwd)</code> in the <code>finish</code> Effect.</p>
<p dir="auto"><strong>e) Add <code>detectNaturalLanguage()</code> call in the finish Effect</strong> after parsing the sentinel.</p>
<p dir="auto">See commit <code>e95356aec</code> for the full diff of these changes.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">8. <code>packages/opencode/src/cli/cmd/tui/app.tsx</code></h3><a id="user-content-8-packagesopencodesrcclicmdtuiapptsx" class="anchor" aria-label="Permalink: 8. packages/opencode/src/cli/cmd/tui/app.tsx" href="#8-packagesopencodesrcclicmdtuiapptsx"><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"><strong>Pattern</strong>: Upstream adds <code>createCliRenderer</code>, <code>TuiPluginRuntime</code>, plugin system.</p>
<p dir="auto"><strong>Resolution</strong>:</p>
<ol dir="auto">
<li>Take <strong>both</strong> imports (lash's <code>ExecutionModeProvider, WorkingDirProvider</code> AND upstream's <code>createTuiApi, TuiPluginRuntime</code>)</li>
<li>Take <strong>upstream's render tree</strong> but add our providers around <code>&lt;App /&gt;</code>:</li>
</ol>
<div class="highlight highlight-source-tsx notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="&lt;PromptRefProvider&gt;
  &lt;ExecutionModeProvider&gt;    {/* lash addition */}
    &lt;WorkingDirProvider&gt;     {/* lash addition */}
      &lt;App onSnapshot={input.onSnapshot} /&gt;
    &lt;/WorkingDirProvider&gt;
  &lt;/ExecutionModeProvider&gt;
&lt;/PromptRefProvider&gt;"><pre><span class="pl-c1">&lt;</span><span class="pl-v">PromptRefProvider</span><span class="pl-c1">&gt;</span>
  <span class="pl-c1">&lt;</span><span class="pl-v">ExecutionModeProvider</span><span class="pl-c1">&gt;</span>    <span class="pl-kos">{</span><span class="pl-c">/* lash addition */</span><span class="pl-kos">}</span>
    <span class="pl-c1">&lt;</span><span class="pl-v">WorkingDirProvider</span><span class="pl-c1">&gt;</span>     <span class="pl-kos">{</span><span class="pl-c">/* lash addition */</span><span class="pl-kos">}</span>
      <span class="pl-c1">&lt;</span><span class="pl-v">App</span> <span class="pl-c1">onSnapshot</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-s1">input</span><span class="pl-kos">.</span><span class="pl-c1">onSnapshot</span><span class="pl-kos">}</span> <span class="pl-kos">/&gt;</span>
    <span class="pl-kos">&lt;/</span><span class="pl-v">WorkingDirProvider</span><span class="pl-c1">&gt;</span>
  <span class="pl-kos">&lt;/</span><span class="pl-v">ExecutionModeProvider</span><span class="pl-c1">&gt;</span>
<span class="pl-kos">&lt;/</span><span class="pl-v">PromptRefProvider</span><span class="pl-c1">&gt;</span></pre></div>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">9. <code>packages/opencode/src/cli/cmd/tui/routes/home.tsx</code></h3><a id="user-content-9-packagesopencodesrcclicmdtuirouteshometsx" class="anchor" aria-label="Permalink: 9. packages/opencode/src/cli/cmd/tui/routes/home.tsx" href="#9-packagesopencodesrcclicmdtuirouteshometsx"><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"><strong>Pattern</strong>: Upstream adds <code>TuiPluginRuntime.Slot</code> wrappers for extensibility.</p>
<p dir="auto"><strong>Resolution</strong>: Take <strong>upstream's structure</strong> (with plugin slots and <code>placeholders</code> prop) and add <code>showWorkingDirectory={false}</code> to the Prompt in the <code>home_prompt</code> slot.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">10. <code>packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx</code> (MAJOR)</h3><a id="user-content-10-packagesopencodesrcclicmdtuicomponentpromptindextsx-major" class="anchor" aria-label="Permalink: 10. packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx (MAJOR)" href="#10-packagesopencodesrcclicmdtuicomponentpromptindextsx-major"><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"><strong>Resolution</strong>: Take <strong>upstream's version</strong> (<code>git checkout --theirs</code>), then add:</p>
<ol dir="auto">
<li><code>RGBA</code> to opentui/core imports</li>
<li><code>DialogExecutionMode</code> import</li>
<li><code>@tui-integration</code> imports (<code>useExecutionMode</code>, <code>handleModeToggleKey</code>, <code>determineRouting</code>, shell completion hooks)</li>
<li><code>ExecutionMode</code> from <code>@shell-mode</code></li>
<li><code>showWorkingDirectory?: boolean</code> prop</li>
<li><code>completionCycle: CompletionCycleState | null</code> in store type + init</li>
<li><code>executionMode = useExecutionMode()</code> context in function body</li>
<li><code>shortenedWorkingDir</code> computed memo</li>
<li><code>modePrefixColor</code> computed memo</li>
<li><code>determineRouting()</code> in submit function (replaces <code>store.mode === "shell"</code> check)</li>
<li><code>handleModeToggleKey()</code> in <code>onKeyDown</code> handler</li>
<li><code>DialogExecutionMode</code> in command registry</li>
<li>Working directory display in footer fallback</li>
<li>Mode toggle hint in footer hints area</li>
</ol>
<p dir="auto"><strong>Double left border</strong> — upstream only has a single border. Add the execution mode inner border using a <strong>row layout</strong> (not nested borders — see below):</p>
<div class="highlight highlight-source-tsx notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="&lt;box border={[&quot;left&quot;]} borderColor={borderHighlight()} customBorderChars={{...SplitBorder.customBorderChars, bottomLeft: &quot;╹&quot;}}&gt;
  &lt;box flexDirection=&quot;row&quot;&gt;
    &lt;box
      width={1}
      alignSelf=&quot;stretch&quot;
      border={[&quot;left&quot;]}
      borderColor={modePrefixColor()}
      customBorderChars={{ ...SplitBorder.customBorderChars }}
    /&gt;
    &lt;box paddingLeft={2} paddingRight={2} paddingTop={1} flexShrink={0} backgroundColor={theme.backgroundElement} flexGrow={1}&gt;
      {/* textarea + footer */}
    &lt;/box&gt;
  &lt;/box&gt;
&lt;/box&gt;"><pre><span class="pl-c1">&lt;</span><span class="pl-s1">box</span> <span class="pl-c1">border</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-kos">[</span><span class="pl-s">"left"</span><span class="pl-kos">]</span><span class="pl-kos">}</span> <span class="pl-c1">borderColor</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-en">borderHighlight</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">}</span> <span class="pl-c1">customBorderChars</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-kos">{</span>...<span class="pl-v">SplitBorder</span><span class="pl-kos">.</span><span class="pl-c1">customBorderChars</span><span class="pl-kos">,</span> <span class="pl-c1">bottomLeft</span>: <span class="pl-s">"╹"</span><span class="pl-kos">}</span><span class="pl-kos">}</span><span class="pl-c1">&gt;</span>
  <span class="pl-c1">&lt;</span><span class="pl-s1">box</span> <span class="pl-c1">flexDirection</span><span class="pl-c1">=</span><span class="pl-s">"row"</span><span class="pl-c1">&gt;</span>
    <span class="pl-c1">&lt;</span><span class="pl-s1">box</span>
      <span class="pl-c1">width</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">1</span><span class="pl-kos">}</span>
      <span class="pl-c1">alignSelf</span><span class="pl-c1">=</span><span class="pl-s">"stretch"</span>
      <span class="pl-c1">border</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-kos">[</span><span class="pl-s">"left"</span><span class="pl-kos">]</span><span class="pl-kos">}</span>
      <span class="pl-c1">borderColor</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-en">modePrefixColor</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">}</span>
      <span class="pl-c1">customBorderChars</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-kos">{</span> ...<span class="pl-v">SplitBorder</span><span class="pl-kos">.</span><span class="pl-c1">customBorderChars</span> <span class="pl-kos">}</span><span class="pl-kos">}</span>
    <span class="pl-kos">/&gt;</span>
    <span class="pl-c1">&lt;</span><span class="pl-s1">box</span> <span class="pl-c1">paddingLeft</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">2</span><span class="pl-kos">}</span> <span class="pl-c1">paddingRight</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">2</span><span class="pl-kos">}</span> <span class="pl-c1">paddingTop</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">1</span><span class="pl-kos">}</span> <span class="pl-c1">flexShrink</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">0</span><span class="pl-kos">}</span> <span class="pl-c1">backgroundColor</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-s1">theme</span><span class="pl-kos">.</span><span class="pl-c1">backgroundElement</span><span class="pl-kos">}</span> <span class="pl-c1">flexGrow</span><span class="pl-c1">=</span><span class="pl-kos">{</span><span class="pl-c1">1</span><span class="pl-kos">}</span><span class="pl-c1">&gt;</span>
      <span class="pl-kos">{</span><span class="pl-c">/* textarea + footer */</span><span class="pl-kos">}</span>
    <span class="pl-kos">&lt;/</span><span class="pl-s1">box</span><span class="pl-c1">&gt;</span>
  <span class="pl-kos">&lt;/</span><span class="pl-s1">box</span><span class="pl-c1">&gt;</span>
<span class="pl-kos">&lt;/</span><span class="pl-s1">box</span><span class="pl-c1">&gt;</span></pre></div>
<blockquote>
<p dir="auto"><strong>Why row layout?</strong> Nesting <code>border={["left"]}</code> boxes causes the inner border to appear 1–2 rows shorter than the outer because Yoga sizes each box independently. Using <code>width={1}</code> + <code>alignSelf="stretch"</code> in a row container guarantees both bars span identical rows.</p>
</blockquote>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">12. <code>packages/opencode/src/config/keybinds.ts</code></h3><a id="user-content-12-packagesopencodesrcconfigkeybindsts" class="anchor" aria-label="Permalink: 12. packages/opencode/src/config/keybinds.ts" href="#12-packagesopencodesrcconfigkeybindsts"><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"><strong>Pattern</strong>: Upstream may reassign <code>agent_cycle</code> to <code>tab</code>. Lash remaps Tab to shell autocomplete.</p>
<p dir="auto"><strong>Resolution</strong>: Ensure <code>agent_cycle</code> is on <code>shift+tab</code>, NOT <code>tab</code>:</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="agent_cycle: keybind(&quot;shift+tab&quot;, &quot;Next agent&quot;),
agent_cycle_reverse: keybind(&quot;none&quot;, &quot;Previous agent&quot;),"><pre><span class="pl-s1">agent_cycle</span>: <span class="pl-en">keybind</span><span class="pl-kos">(</span><span class="pl-s">"shift+tab"</span><span class="pl-kos">,</span> <span class="pl-s">"Next agent"</span><span class="pl-kos">)</span><span class="pl-kos">,</span>
<span class="pl-en">agent_cycle_reverse</span>: <span class="pl-s1">keybind</span><span class="pl-kos">(</span><span class="pl-s">"none"</span><span class="pl-kos">,</span> <span class="pl-s">"Previous agent"</span><span class="pl-kos">)</span><span class="pl-kos">,</span></pre></div>
<p dir="auto">Tab is handled in <code>onKeyDown</code> in <code>prompt/index.tsx</code> via <code>handleShellTabCompletion()</code>.</p>
<hr>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">13. <code>bun.lock</code></h3><a id="user-content-13-bunlock" class="anchor" aria-label="Permalink: 13. bun.lock" href="#13-bunlock"><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"><strong>Resolution</strong>: Do NOT run <code>bun install</code> while the lockfile still contains conflict markers — bun silently re-resolves every <code>^</code>-ranged dependency, floating packages far past what either side pinned. (2026-07-20: this floated <code>storybook-solidjs-vite</code> 10.1.1 → 10.6.0, whose new Solid-version detection broke the storybook CI build and OOM'd local builds.)</p>
<p dir="auto">Instead, restore a clean base lockfile first, then install:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git checkout HEAD -- bun.lock   # pre-merge lash lockfile (or upstream/dev -- bun.lock if theirs is closer)
bun install                      # only resolves the actual package.json deltas
git add bun.lock"><pre>git checkout HEAD -- bun.lock   <span class="pl-c"><span class="pl-c">#</span> pre-merge lash lockfile (or upstream/dev -- bun.lock if theirs is closer)</span>
bun install                      <span class="pl-c"><span class="pl-c">#</span> only resolves the actual package.json deltas</span>
git add bun.lock</pre></div>
<p dir="auto">Then verify nothing unexpected floated:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git diff --cached bun.lock | grep -E '^[+-]' | grep -vE 'workspace:|1\.7\.' | head -50"><pre>git diff --cached bun.lock <span class="pl-k">|</span> grep -E <span class="pl-s"><span class="pl-pds">'</span>^[+-]<span class="pl-pds">'</span></span> <span class="pl-k">|</span> grep -vE <span class="pl-s"><span class="pl-pds">'</span>workspace:|1\.7\.<span class="pl-pds">'</span></span> <span class="pl-k">|</span> head -50</pre></div>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Post-Merge QA Checklist</h2><a id="user-content-post-merge-qa-checklist" class="anchor" aria-label="Permalink: Post-Merge QA Checklist" href="#post-merge-qa-checklist"><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">Run through this visually after every merge commit, before closing the sync issue.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Prompt border</h3><a id="user-content-prompt-border" class="anchor" aria-label="Permalink: Prompt border" href="#prompt-border"><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 class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Two left border bars visible: outer bar = agent color, inner bar = execution mode color</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Both bars are the <strong>same height</strong> — no gap at top or bottom of the inner bar</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Outer bar shows a <code>╹</code> connector at the bottom join</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Keybinds</h3><a id="user-content-keybinds" class="anchor" aria-label="Permalink: Keybinds" href="#keybinds"><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 class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> <strong>Tab</strong> → triggers shell autocomplete (shows completions or cycles them)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> <strong>Shift+Tab</strong> → cycles agents (Build → Plan → …)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> <strong>Ctrl+Space</strong> → cycles execution modes (agent → shell → auto)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> <strong>Enter</strong> → submits prompt; <strong>Shift+Enter</strong> → inserts newline</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Execution mode indicator</h3><a id="user-content-execution-mode-indicator" class="anchor" aria-label="Permalink: Execution mode indicator" href="#execution-mode-indicator"><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 class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Footer shows mode name in execution mode color (e.g. <code>ctrl+space agent</code>)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Switching modes updates both the inner border color and the footer label</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Shell mode</h3><a id="user-content-shell-mode" class="anchor" aria-label="Permalink: Shell mode" href="#shell-mode"><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 class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Typing <code>!</code> at start of prompt switches to shell mode (blue border)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Pressing Escape from shell mode returns to normal mode</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Running a command in shell mode updates the working directory in the footer</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Working directory</h3><a id="user-content-working-directory" class="anchor" aria-label="Permalink: Working directory" href="#working-directory"><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 class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Footer left side shows shortened cwd (e.g. <code>~/repo/lash</code>)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Running <code>cd &lt;dir&gt;</code> in shell mode updates the displayed cwd</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Typecheck</h3><a id="user-content-typecheck" class="anchor" aria-label="Permalink: Typecheck" href="#typecheck"><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="cd packages/opencode &amp;&amp; bun run typecheck"><pre><span class="pl-c1">cd</span> packages/opencode <span class="pl-k">&amp;&amp;</span> bun run typecheck</pre></div>
<p dir="auto">Zero errors required before closing the sync issue.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">What Lash Preserves (invariants)</h2><a id="user-content-what-lash-preserves-invariants" class="anchor" aria-label="Permalink: What Lash Preserves (invariants)" href="#what-lash-preserves-invariants"><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">These features must always be preserved through upstream merges:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Feature</th>
<th>Files</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>getCwd()</code> / <code>setCwd()</code></td>
<td><code>plugin/shell-mode/cwd.ts</code></td>
<td>Shell cwd tracking</td>
</tr>
<tr>
<td><code>detectNaturalLanguage()</code></td>
<td><code>plugin/shell-mode/natural-language.ts</code></td>
<td>NL detection</td>
</tr>
<tr>
<td><code>ExecutionMode</code> (shell/agent/auto)</td>
<td><code>plugin/shell-mode/mode.ts</code></td>
<td>Mode switching</td>
</tr>
<tr>
<td><code>ExecutionModeProvider</code></td>
<td><code>plugin/tui-integration/execution-mode-provider.tsx</code></td>
<td>TUI context</td>
</tr>
<tr>
<td><code>WorkingDirProvider</code></td>
<td><code>plugin/tui-integration/working-dir-provider.tsx</code></td>
<td>TUI cwd display</td>
</tr>
<tr>
<td><code>handleModeToggleKey()</code></td>
<td><code>plugin/tui-integration/hooks.ts</code></td>
<td>ctrl+space handler</td>
</tr>
<tr>
<td><code>determineRouting()</code></td>
<td><code>plugin/tui-integration/hooks.ts</code></td>
<td>Shell vs agent routing</td>
</tr>
<tr>
<td><code>cwd sentinel</code> in bash</td>
<td><code>src/session/prompt.ts</code></td>
<td>Cwd tracking after cd</td>
</tr>
<tr>
<td>ctrl+space mode toggle</td>
<td><code>packages/tui/src/component/prompt/index.tsx</code> (<code>prompt.mode.toggle</code> binding)</td>
<td>replaced <code>mode_toggle</code> keybind after 2026-07-07 TUI move</td>
</tr>
<tr>
<td><code>agent_cycle</code> keybind</td>
<td><code>packages/tui/src/config/keybind.ts</code></td>
<td>shift+tab (NOT tab)</td>
</tr>
<tr>
<td>Double left border</td>
<td><code>packages/tui/src/component/prompt/index.tsx</code></td>
<td>Row layout, not nested</td>
</tr>
<tr>
<td><code>EventCwdUpdated</code></td>
<td><code>sdk/js/src/v2/gen/types.gen.ts</code></td>
<td>SDK type for cwd event</td>
</tr>
<tr>
<td>cwd in <code>path.*</code> field</td>
<td><code>src/session/prompt.ts</code></td>
<td>Shows cwd in messages</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Automating the Sync (future)</h2><a id="user-content-automating-the-sync-future" class="anchor" aria-label="Permalink: Automating the Sync (future)" href="#automating-the-sync-future"><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">To automate weekly syncs, add a GitHub Action:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# .github/workflows/upstream-sync.yml
name: Upstream Sync
on:
  schedule:
    - cron: '0 6 * * 1'  # Every Monday 6am UTC
  workflow_dispatch:

jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          fetch-depth: 0
      - run: git remote add upstream https://github.com/anomalyco/opencode.git
      - run: git fetch upstream
      - run: git config user.email &quot;lacy@example.com&quot;
      - run: git config user.name &quot;Lacy Bot&quot;
      - run: |
          git merge upstream/dev --no-commit --no-ff || true
          # Check if there are conflicts
          if git diff --name-only --diff-filter=U | grep -q .; then
            echo &quot;CONFLICTS=true&quot; &gt;&gt; $GITHUB_ENV
          fi
      - name: Open PR if merge succeeds
        if: env.CONFLICTS != 'true'
        run: |
          git commit -m &quot;chore: merge upstream dev&quot;
          git push origin HEAD:upstream-sync-$(date +%Y%m%d)
          gh pr create --title &quot;Upstream sync $(date +%Y-%m-%d)&quot; ..."><pre><span class="pl-c"><span class="pl-c">#</span> .github/workflows/upstream-sync.yml</span>
<span class="pl-ent">name</span>: <span class="pl-s">Upstream Sync</span>
<span class="pl-ent">on</span>:
  <span class="pl-ent">schedule</span>:
    - <span class="pl-ent">cron</span>: <span class="pl-s"><span class="pl-pds">'</span>0 6 * * 1<span class="pl-pds">'</span></span>  <span class="pl-c"><span class="pl-c">#</span> Every Monday 6am UTC</span>
  <span class="pl-ent">workflow_dispatch</span>:

<span class="pl-ent">jobs</span>:
  <span class="pl-ent">sync</span>:
    <span class="pl-ent">runs-on</span>: <span class="pl-s">ubuntu-latest</span>
    <span class="pl-ent">steps</span>:
      - <span class="pl-ent">uses</span>: <span class="pl-s">actions/checkout@v4</span>
        <span class="pl-ent">with</span>:
          <span class="pl-ent">token</span>: <span class="pl-s">${{ secrets.GITHUB_TOKEN }}</span>
          <span class="pl-ent">fetch-depth</span>: <span class="pl-c1">0</span>
      - <span class="pl-ent">run</span>: <span class="pl-s">git remote add upstream https://github.com/anomalyco/opencode.git</span>
      - <span class="pl-ent">run</span>: <span class="pl-s">git fetch upstream</span>
      - <span class="pl-ent">run</span>: <span class="pl-s">git config user.email "lacy@example.com"</span>
      - <span class="pl-ent">run</span>: <span class="pl-s">git config user.name "Lacy Bot"</span>
      - <span class="pl-ent">run</span>: <span class="pl-s">|</span>
<span class="pl-s">          git merge upstream/dev --no-commit --no-ff || <span class="pl-c1">true</span></span>
<span class="pl-s">          # Check if there are conflicts</span>
<span class="pl-s">          if git diff --name-only --diff-filter=U | grep -q .; then</span>
<span class="pl-s">            echo "CONFLICTS=true" &gt;&gt; $GITHUB_ENV</span>
<span class="pl-s">          fi</span>
<span class="pl-s"></span>      - <span class="pl-ent">name</span>: <span class="pl-s">Open PR if merge succeeds</span>
        <span class="pl-ent">if</span>: <span class="pl-s">env.CONFLICTS != 'true'</span>
        <span class="pl-ent">run</span>: <span class="pl-s">|</span>
<span class="pl-s">          git commit -m "chore: merge upstream dev"</span>
<span class="pl-s">          git push origin HEAD:upstream-sync-$(date +%Y%m%d)</span>
<span class="pl-s">          gh pr create --title "Upstream sync $(date +%Y-%m-%d)" ...</span></pre></div>
<p dir="auto">For conflict-free or simple merges, this can be fully automated. Conflicted merges (like <code>prompt.ts</code> refactors) require manual resolution — create a PR instead and resolve manually.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Sync History</h2><a id="user-content-sync-history" class="anchor" aria-label="Permalink: Sync History" href="#sync-history"><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>Date</th>
<th>Upstream commits merged</th>
<th>Conflicts</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>2026-04-02</td>
<td>673 (cf7ca9b2f → 92e820fdc)</td>
<td>28 files</td>
<td>Major Effect rewrite of prompt.ts</td>
</tr>
<tr>
<td>2026-04-28</td>
<td>(QA only — no new merge)</td>
<td>—</td>
<td>LAC-163: found 3 regressions post-merge: missing double border, wrong Tab keybind, border height mismatch. Fixed in commits bde00fa30, 85faf49fc, 9d7ac27c1. Added this QA checklist.</td>
</tr>
<tr>
<td>2026-06-26</td>
<td>629 (catch-up)</td>
<td>—</td>
<td>PR #31 merged.</td>
</tr>
<tr>
<td>2026-06-30</td>
<td>68</td>
<td>escalated → LAC-2496</td>
<td>PR #32 opened; later superseded by PR #39.</td>
</tr>
<tr>
<td>2026-07-07</td>
<td>195 (→ v1.17.15)</td>
<td>prompt/index.tsx re-architecture</td>
<td>LAC-2556: merge completed on-branch; run died in API outage before PR. mode_toggle/handleModeToggleKey replaced by direct ctrl+space <code>prompt.mode.toggle</code> binding; TUI moved to <code>packages/tui/</code>.</td>
</tr>
<tr>
<td>2026-07-13</td>
<td>90 (→ v1.17.18)</td>
<td>15 version bumps, TEAM_MEMBERS, 1 hunk in prompt/index.tsx</td>
<td>LAC-2739: consolidated PR #39 (06-30 + 07-07 + 07-13). Kept lash <code>shortenedWorkingDir</code> footer over upstream's session-directory display. Typecheck 30/30.</td>
</tr>
<tr>
<td>2026-07-20</td>
<td>153 (→ v1.18.3)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-2865: merged into PR #39 branch (dev still awaiting PR #39 merge). Also merged origin/dev (PR #40 Windows deflake). No complex conflicts; invariants verified.</td>
</tr>
<tr>
<td>2026-07-27</td>
<td>167 (→ v1.18.7)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-3102: built on LAC-2739 branch (PR #39 still open). Version conflicts auto-resolved (kept lash 1.7.x). Typecheck gate: 0 errors. No changes to prompt.ts/keybinds.ts/types.gen.ts. agent_cycle=shift+tab verified.</td>
</tr>
<tr>
<td>2026-08-04</td>
<td>132 (→ v1.18.13)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-3206: continued on LAC-3102 branch (PR #42), which fully contains PR #39 → #39 superseded/closable. All conflicts standard (kept lash 1.7.13; bun.lock regenerated). Flagged complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. agent_cycle=shift+tab verified. <strong>Backlog risk: sync PRs (#39→#42) have not landed on dev since 07-13; escalate merge decision.</strong></td>
</tr>
<tr>
<td>2026-08-10</td>
<td>59 (→ v1.18.16)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-3264: continued on LAC-3102 branch (PR #42, still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from clean base — delta was internal versions + upstream's new @ai-sdk/openai-compatible@2.0.41 patch entry). Complex files: prompt.ts got 1 upstream fix hunk (orphan detection via parentID), prompt/index.tsx got cursor-style config (#32295); keybind.ts/app.tsx/types.gen.ts untouched. All invariants verified; agent_cycle=shift+tab. Typecheck 30/30. <strong>Backlog risk persists: PR #42 unmerged since 07-13 lineage.</strong></td>
</tr>
<tr>
<td>2026-09-04</td>
<td>(audit — no new upstream merge)</td>
<td>—</td>
<td>Merged PR #41 + PR #43 into <code>dev</code>, then <code>dev</code> → <code>lash</code> (<code>aa19cdfb11</code>, clean). Added <code>lash</code> to test/typecheck/nix-eval workflow branch filters. Routine repointed to target <code>lash</code>. Open: LAC-3268 visual QA, LAC-2396 release 1.7.14, LAC-3732 cwd-footer defect.</td>
</tr>
<tr>
<td>2026-08-17</td>
<td>62 (→ v1.18.18)</td>
<td>version bumps, bun.lock, beta.yml</td>
<td>LAC-3333: fresh branch from dev (PR #42 merged 2026-08-10). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). Complex files: all 5 (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybinds.ts) auto-merged clean — no escalation. EventCwdUpdated in types.gen.ts ✓, agent_cycle=shift+tab ✓, getCwd() in prompt.ts ✓. Typecheck 30/30. PR #43.</td>
</tr>
<tr>
<td>2026-08-24</td>
<td>113 (→ v1.18.21)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-3413: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only (kept lash 1.7.13; bun.lock regenerated from upstream base). <strong>Gotcha caught: <code>git checkout --ours</code> on packages/opencode/package.json dropped upstream's @ai-sdk/amazon-bedrock 4.0.158 + google-vertex 4.0.181 pin bumps — re-applied manually. When verifying version-only conflicts, diff merge-base→upstream per file; files reverted to ours vanish from <code>git diff --cached</code>.</strong> Complex files: prompt.ts got 1 fix hunk (continue unknown finish responses #43892), types.gen.ts 2 lines (upgrade endpoint #44686) — both auto-merged clean, no escalation. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd() ✓. Typecheck 30/30.</td>
</tr>
<tr>
<td>2026-08-31</td>
<td>62 (→ v1.18.25)</td>
<td>15 version bumps, bun.lock</td>
<td>LAC-3587: continued on LAC-3333 branch (PR #43 still open). Standard conflicts only — each package.json had a single version-line hunk (resolved in-place keeping lash 1.7.13, upstream dep changes auto-merged outside the hunk; no <code>checkout --ours</code>, so no pin-drop gotcha). bun.lock regenerated from upstream base; float check clean (only upstream's own 1.18.25 bumps + number-flow add / d3-geo removals). Complex files (prompt.ts/app.tsx/prompt/index.tsx/types.gen.ts/keybind.ts) untouched by upstream this week. agent_cycle=shift+tab ✓, EventCwdUpdated ✓, getCwd(ctx.directory) ✓, detectNaturalLanguage ✓. Typecheck 30/30. <strong>Backlog note: PR #43 now carries 3 weeks (08-17/08-24/08-31) awaiting merge by Lacy.</strong></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</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>

