lazycodex-ai 5.1.41 → 5.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.de.md +118 -0
  2. package/README.es.md +118 -0
  3. package/README.fr.md +118 -0
  4. package/README.it.md +118 -0
  5. package/README.ja.md +2 -1
  6. package/README.ko.md +2 -1
  7. package/README.md +3 -2
  8. package/README.pt-br.md +118 -0
  9. package/README.ru.md +2 -1
  10. package/README.zh-cn.md +2 -1
  11. package/dist/cli/index.js +187 -39
  12. package/dist/cli/service-auth/cli-keystore.fixture.d.ts +1 -7
  13. package/dist/cli/service-auth/index.d.ts +3 -0
  14. package/dist/cli/service-auth/keystore.d.ts +8 -2
  15. package/dist/cli/service-auth/secret-service-lock.d.ts +4 -0
  16. package/dist/cli/service-auth/session.d.ts +7 -1
  17. package/dist/cli-node/index.js +187 -39
  18. package/package.json +1 -1
  19. package/packages/lsp-daemon/dist/cli.js +363 -35
  20. package/packages/lsp-daemon/dist/client.js +341 -13
  21. package/packages/lsp-daemon/dist/index.js +344 -16
  22. package/packages/lsp-tools-mcp/dist/cli.js +333 -5
  23. package/packages/lsp-tools-mcp/dist/mcp.js +333 -5
  24. package/packages/lsp-tools-mcp/dist/tools.js +333 -5
  25. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +68 -9
  27. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  32. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  36. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +358 -36
  37. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  38. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  40. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  42. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2 -0
  44. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2 -0
  45. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  46. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  50. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  52. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  74. package/packages/omo-codex/plugin/package-lock.json +17 -12
  75. package/packages/omo-codex/plugin/package.json +1 -1
  76. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  77. package/packages/omo-codex/scripts/install-dist/install-local.mjs +72 -11
  78. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
@@ -0,0 +1,118 @@
1
+ [English](README.md) | [简体中文](README.zh-cn.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | [한국어](README.ko.md) | [Español](README.es.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Português (Brasil)](README.pt-br.md) | [Italiano](README.it.md)
2
+
3
+ > [!NOTE]
4
+ > **OmO 5.0: OmO ❤️ Pi**
5
+ > Instale com `curl -fsSL https://get.omo.dev/install.sh | bash`. Sistema de memória, CodeMode, assinaturas da Anthropic, tudo incluso.
6
+ > [![OmO Herdr DAG - DAGs de fluxo de trabalho do OmO ao vivo em um painel lateral do Herdr](./.github/assets/omo-herdr-dag.png)](https://github.com/jc01rho/omo-herdr-dag)
7
+ > *Basta digitar "mass ulw" com o seu prompt - agora você é o mestre da engenharia de grafos. O ultracode multimodelo, junto com um sistema de memória melhor. (O painel à direita é o [omo-herdr-dag](https://github.com/jc01rho/omo-herdr-dag).)*
8
+
9
+ > **Patrocinadores**
10
+ > Estes são os nossos patrocinadores. Eles ajudam a manter o OmO ativo como um projeto paralelo pessoal.
11
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | O **[OpenGateway](https://opengateway.ai/)** patrocina o OmO. Um gateway compatível com a OpenAI que reúne vários provedores de modelos em uma única API. Obrigado por apoiar o código aberto. |
12
+ > | :-----| :----- |
13
+
14
+
15
+ > [!NOTE]
16
+ >
17
+ > [![Sisyphus Labs - Conheça Dori. Não é uma demo. Assina tudo.](./.github/assets/sisyphuslabs.png?v=4)](https://sisyphuslabs.ai)
18
+ > > **O OmO é mantido por Jobdori, o assistente de IA mostrado acima. Conheça seu próprio Jobdori, Dori. <br />Entre na lista de espera [aqui](https://sisyphuslabs.ai).**
19
+
20
+ > [!TIP]
21
+ > Junte-se a nós!
22
+ >
23
+ > | [<img alt="Discord link" src="https://img.shields.io/discord/1452487457085063218?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=flat-square" width="156px" />](https://discord.gg/PUwSMR9XNk) | Entre na nossa [comunidade no Discord](https://discord.gg/PUwSMR9XNk) para se conectar com contribuidores e outros usuários do OmO. |
24
+ > | :-----| :----- |
25
+ > | [<img alt="X link" src="https://img.shields.io/badge/Follow-%40justsisyphus-00CED1?style=flat-square&logo=x&labelColor=black" width="156px" />](https://x.com/justsisyphus) | As atualizações do OmO costumavam ser postadas na minha conta do X. <br /> Como ela foi suspensa por engano, [@justsisyphus](https://x.com/justsisyphus) agora posta atualizações em meu nome. |
26
+ > | [<img alt="GitHub Follow" src="https://img.shields.io/github/followers/code-yeongyu?style=flat-square&logo=github&labelColor=black&color=24292f" width="156px" />](https://github.com/code-yeongyu) | Siga [@code-yeongyu](https://github.com/code-yeongyu) no GitHub para mais projetos. |
27
+
28
+ <!-- <CENTERED SECTION FOR GITHUB DISPLAY> -->
29
+
30
+ <div align="center">
31
+
32
+ <a href="https://omo.dev"><img src="./.github/assets/omo-icon-light.svg" alt="OmO" width="200" /></a>
33
+
34
+ # OmO
35
+
36
+ **Sua ferramenta para trabalho de verdade. Mas é um agente.**
37
+
38
+ [![GitHub Release](https://img.shields.io/github/v/release/code-yeongyu/oh-my-openagent?color=369eff&labelColor=black&logo=github&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/releases)
39
+ [![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fomo.dev%2Fapi%2Fdownloads&style=flat-square)](https://omo.dev)
40
+ [![GitHub Contributors](https://img.shields.io/github/contributors/code-yeongyu/oh-my-openagent?color=c4f042&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/graphs/contributors)
41
+ [![GitHub Stars](https://img.shields.io/github/stars/code-yeongyu/oh-my-openagent?color=ffcb47&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/stargazers)
42
+ [![License](https://img.shields.io/badge/license-SUL--1.0-white?labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/blob/dev/LICENSE.md)
43
+ [![Docs](https://img.shields.io/badge/docs-omo.dev-369eff?labelColor=black&logo=readthedocs&logoColor=white&style=flat-square)](https://omo.dev/docs)
44
+
45
+
46
+ </div>
47
+
48
+ <!-- </CENTERED SECTION FOR GITHUB DISPLAY> -->
49
+
50
+ O OmO é um único comando `omo` que transforma seus tokens em trabalho pronto: pesquisa em dez mil fontes, uma apresentação que as pessoas realmente entendem, backends, frontends, código. Ele roda no senpi, nosso fork do [pi](https://github.com/badlogic/pi-mono), com tudo o que está abaixo já integrado.
51
+
52
+ ## Instalação
53
+
54
+ ```bash
55
+ curl -fsSL https://get.omo.dev/install.sh | bash
56
+ omo
57
+ ```
58
+
59
+ No Windows, no PowerShell: `irm https://get.omo.dev/install.ps1 | iex`. O script instala o binário nativo do `omo` para o seu SO e CPU em `~/.local/bin`, confere os checksums da versão e recorre ao GitHub Releases quando o espelho está inacessível. Adicione `-s -- beta` (ou uma versão como `-s -- 5.1.1`) após `bash` para escolher outro canal. O CMD do Windows, o ajuste do seu `PATH`, a atualização e a desinstalação são abordados em [omo.dev/docs/install](https://omo.dev/docs/install).
60
+
61
+ Prefere um gerenciador de pacotes? `bun add -g omo-ai` (ou `npm i -g omo-ai`) instala o mesmo OmO. O pacote é `omo-ai`; o pacote `omo` no npm não tem relação e pertence a outra pessoa.
62
+
63
+ Abra o seu projeto, execute `omo`, descreva a tarefa. Essa é toda a configuração.
64
+
65
+ Em uma sessão, `/thinking <level>` define o quanto o modelo pensa (`/thinking` sozinho abre um seletor), `Shift+Tab` alterna entre os níveis e `/efforts <level>` define o esforço de raciocínio diretamente em modelos com níveis de esforço. Para retomar um trabalho anterior, `/resume` (ou `/sessions`) abre suas sessões passadas; no shell, `omo -c` continua a última e `omo -r` abre o seletor. `/help` lista todo o resto.
66
+
67
+ Vindo da edição OpenCode ou do LazyCodex? Execute `omo setup` uma vez. Ele transfere suas chaves de provedor, provedores personalizados, servidores MCP, skills e escolhas de modelo. Em seguida, `omo doctor` mostra quais categorias de tarefas seus provedores podem executar e o que a instalação antiga deixou para trás. O passo a passo completo está em [Migrando do OpenCode](docs/guide/migrating-from-opencode.md).
68
+
69
+ Para atualizar, execute a linha de instalação novamente (uma instalação via gerenciador de pacotes atualiza com `omo update`). `rm ~/.local/bin/omo` remove a instalação do binário; `bun remove -g omo-ai` (ou `npm uninstall -g omo-ai`) remove a instalação do pacote.
70
+
71
+ ## Por que o OmO
72
+
73
+ **ultrawork.** Pule o estudo. Se uma tarefa parecer difícil, adicione `ultrawork` (ou `ulw`) ao seu prompt. O agente lê a base de código antes de tocar em uma linha, planeja, comprova cada etapa antes de avançar, verifica o resultado na superfície real e para quando termina.
74
+
75
+ **Centenas de agentes, uma palavra-chave.** Digite `mass ulw` e todo o trabalho vira um grafo de agentes: pesquisa profunda em milhares de fontes, um pipeline completo de machine learning, uma migração que ninguém quer fazer. Cada parte roda no modelo mais adequado, em paralelo, e é verificada antes que qualquer coisa seja dada como pronta.
76
+
77
+ **Kibitzer. Seu agente não esquece de você, nem do seu trabalho.** A memória fica em um repositório git de arquivos markdown. Um modelo pequeno e barato fica ao lado do agente principal mais caro, lê o que você já fez e avisa o agente principal antes que ele repita um erro. Você para de se explicar repetidamente.
78
+
79
+ **Combine modelos sem pensar nisso.** Use os modelos de ponta que você adora junto com os mais baratos. Basta entrar: `/login` cobre assinaturas do Claude, ChatGPT, Kimi e GLM. Cada modelo já vem com um system prompt ajustado para ele, então você nunca escolhe o errado.
80
+
81
+ **Skills de alta qualidade, apenas as que você precisa.** Seu modelo é inteligente, mas ainda não sabe muito sobre como resolver problemas do mundo real. O OmO entrega o conhecimento que falta na forma de skills, incluindo uso do navegador, e carrega apenas o que a tarefa precisa.
82
+
83
+ **Todo o resto é pensado nos detalhes.** Chamadas de ferramentas independentes rodam juntas em um pequeno programa, então vinte leituras acontecem em uma única viagem de ida e volta. Argumentos de ferramentas malformados são reparados antes de rodar. Esperar por um build ou deploy funciona por inscrição, não por polling. Trabalhos longos mantêm um registro do que já foi verificado, para que uma sessão reiniciada continue de onde parou. Configurações, skills e prompts recarregam ao vivo.
84
+
85
+ ## Configuração
86
+
87
+ Padrões opinativos, ajustáveis se você insistir. Suas configurações ficam em `~/.omo/omo.jsonc`, e um projeto pode adicionar seu próprio `.omo/omo.jsonc`; o arquivo mais próximo vence. Todas as chaves estão na [referência de configuração](docs/reference/configuration.md).
88
+
89
+ ## Documentação
90
+
91
+ - [omo.dev/docs](https://omo.dev/docs)
92
+ - [Migrando do OpenCode](docs/guide/migrating-from-opencode.md)
93
+ - [Referência de configuração](docs/reference/configuration.md)
94
+ - [Recursos](docs/reference/features.md)
95
+ - [Uso do computador](docs/guide/computer-use.md) (experimental)
96
+ - [Manifesto Ultrawork](docs/manifesto.md)
97
+
98
+ ## Avaliações
99
+
100
+ > "Me fez cancelar minha assinatura do Cursor. Coisas inacreditáveis estão acontecendo na comunidade open source." - [Arthur Guiot](https://x.com/arthur_guiot/status/2008736347092382053?s=20)
101
+
102
+ > "Se o Claude Code faz em 7 dias o que um humano faz em 3 meses, o OmO faz em 1 hora." <br/>- B, Pesquisador Quantitativo
103
+
104
+ > "Vocês deveriam integrar isso ao core e contratá-lo. Sério. É muito, muito, muito bom." <br/>- Henning Kilset
105
+
106
+ ## Nota do Autor
107
+
108
+ Quando preciso tomar o volante de volta de um agente, isso não é trabalho em equipe. O sistema falhou. O OmO foi construído com base nessa ideia. Você diz o que quer; o agente pesquisa, planeja, escreve um código que você não conseguiria diferenciar do de um engenheiro sênior, faz a verificação e continua até terminar. Ele gasta tokens quando eles compram velocidade real e direciona as partes fáceis para modelos baratos.
109
+
110
+ Sou o usuário mais obcecado deste projeto. Qual modelo tem a lógica mais afiada? Quem escreve a melhor prosa? O que todo mundo lançou esta semana? O OmO é onde essas respostas vão parar. Tem um jeito melhor? PRs são bem-vindos.
111
+
112
+ O objetivo é um agente que você deixa de notar. Você aperta o interruptor, a luz acende. A versão longa está no [Manifesto Ultrawork](docs/manifesto.md).
113
+
114
+ Sem afiliação com nenhum projeto ou modelo mencionado. As ideias do Ultragoal e do UltraQA vêm do [oh-my-codex](https://github.com/Yeachan-Heo/oh-my-codex), reimplementadas a partir do conceito para o OmO.
115
+
116
+ ## Amado por profissionais em
117
+
118
+ [Indent](https://indentcorp.com), criadores do Spray (solução de marketing de influência), vovushop (plataforma de comércio transfronteiriço) e vreview (solução de marketing de avaliações de comércio com IA). [Google](https://google.com). [Microsoft](https://microsoft.com). [Vercel](https://vercel.com). [ELESTYLE](https://elestyle.jp), criadores do elepay (gateway de pagamento multimóvel) e OneQR (SaaS de aplicativo móvel para soluções sem dinheiro em espécie). [Deepgram](https://deepgram.com).
package/README.ru.md CHANGED
@@ -1,3 +1,5 @@
1
+ [English](README.md) | [简体中文](README.zh-cn.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | [한국어](README.ko.md) | [Español](README.es.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Português (Brasil)](README.pt-br.md) | [Italiano](README.it.md)
2
+
1
3
  > [!NOTE]
2
4
  > **OmO Бета: OmO ❤️ Pi**
3
5
  > Установите одной командой `curl -fsSL https://get.omo.dev/install.sh | bash`: система памяти, CodeMode, подписки Anthropic. Всё включено.
@@ -41,7 +43,6 @@
41
43
  [![License](https://img.shields.io/badge/license-SUL--1.0-white?labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/blob/dev/LICENSE.md)
42
44
  [![Docs](https://img.shields.io/badge/docs-omo.dev-369eff?labelColor=black&logo=readthedocs&logoColor=white&style=flat-square)](https://omo.dev/docs)
43
45
 
44
- [English](README.md) | [简体中文](README.zh-cn.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | [한국어](README.ko.md)
45
46
 
46
47
  </div>
47
48
 
package/README.zh-cn.md CHANGED
@@ -1,3 +1,5 @@
1
+ [English](README.md) | [简体中文](README.zh-cn.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | [한국어](README.ko.md) | [Español](README.es.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Português (Brasil)](README.pt-br.md) | [Italiano](README.it.md)
2
+
1
3
  > [!NOTE]
2
4
  > **OmO 测试版: OmO ❤️ Pi**
3
5
  > 使用 `curl -fsSL https://get.omo.dev/install.sh | bash` 安装。记忆系统、CodeMode、Anthropic 订阅,全部支持。
@@ -41,7 +43,6 @@
41
43
  [![License](https://img.shields.io/badge/license-SUL--1.0-white?labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/blob/dev/LICENSE.md)
42
44
  [![Docs](https://img.shields.io/badge/docs-omo.dev-369eff?labelColor=black&logo=readthedocs&logoColor=white&style=flat-square)](https://omo.dev/docs)
43
45
 
44
- [English](README.md) | [简体中文](README.zh-cn.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | [한국어](README.ko.md)
45
46
 
46
47
  </div>
47
48
 
package/dist/cli/index.js CHANGED
@@ -2132,7 +2132,7 @@ var package_default;
2132
2132
  var init_package = __esm(() => {
2133
2133
  package_default = {
2134
2134
  name: "oh-my-opencode",
2135
- version: "5.1.41",
2135
+ version: "5.1.43",
2136
2136
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2137
2137
  main: "./dist/index.js",
2138
2138
  types: "dist/index.d.ts",
@@ -2309,7 +2309,7 @@ var init_package = __esm(() => {
2309
2309
  },
2310
2310
  devDependencies: {
2311
2311
  "@clack/prompts": "^1.8.1",
2312
- "@code-yeongyu/senpi": "2026.10.21-1",
2312
+ "@code-yeongyu/senpi": "2026.10.21-2",
2313
2313
  "@modelcontextprotocol/sdk": "^1.30.0",
2314
2314
  "@oh-my-opencode/agents-md-core": "workspace:*",
2315
2315
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -2370,18 +2370,18 @@ var init_package = __esm(() => {
2370
2370
  typescript: "^7.0.2"
2371
2371
  },
2372
2372
  optionalDependencies: {
2373
- "oh-my-opencode-darwin-arm64": "5.1.41",
2374
- "oh-my-opencode-darwin-x64": "5.1.41",
2375
- "oh-my-opencode-darwin-x64-baseline": "5.1.41",
2376
- "oh-my-opencode-linux-arm64": "5.1.41",
2377
- "oh-my-opencode-linux-arm64-musl": "5.1.41",
2378
- "oh-my-opencode-linux-x64": "5.1.41",
2379
- "oh-my-opencode-linux-x64-baseline": "5.1.41",
2380
- "oh-my-opencode-linux-x64-musl": "5.1.41",
2381
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.41",
2382
- "oh-my-opencode-windows-arm64": "5.1.41",
2383
- "oh-my-opencode-windows-x64": "5.1.41",
2384
- "oh-my-opencode-windows-x64-baseline": "5.1.41"
2373
+ "oh-my-opencode-darwin-arm64": "5.1.43",
2374
+ "oh-my-opencode-darwin-x64": "5.1.43",
2375
+ "oh-my-opencode-darwin-x64-baseline": "5.1.43",
2376
+ "oh-my-opencode-linux-arm64": "5.1.43",
2377
+ "oh-my-opencode-linux-arm64-musl": "5.1.43",
2378
+ "oh-my-opencode-linux-x64": "5.1.43",
2379
+ "oh-my-opencode-linux-x64-baseline": "5.1.43",
2380
+ "oh-my-opencode-linux-x64-musl": "5.1.43",
2381
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.43",
2382
+ "oh-my-opencode-windows-arm64": "5.1.43",
2383
+ "oh-my-opencode-windows-x64": "5.1.43",
2384
+ "oh-my-opencode-windows-x64-baseline": "5.1.43"
2385
2385
  },
2386
2386
  overrides: {
2387
2387
  hono: "^4.13.8",
@@ -76830,7 +76830,7 @@ var init_memory_agreements = __esm(() => {
76830
76830
  });
76831
76831
 
76832
76832
  // packages/omo-config-core/src/schema/memory.ts
76833
- var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76833
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemoryAutoIdentitySchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76834
76834
  var init_memory = __esm(() => {
76835
76835
  init_zod();
76836
76836
  init_memory_agreements();
@@ -76986,9 +76986,11 @@ var init_memory = __esm(() => {
76986
76986
  projection: OmoMemoryProjectionLayerSchema.optional(),
76987
76987
  compile_warn_tokens: number2().int().positive().optional()
76988
76988
  }).strict();
76989
+ OmoMemoryAutoIdentitySchema = _enum(["path", "git"]);
76989
76990
  OmoMemorySettingsSchema = object({
76990
76991
  enabled: boolean2().default(true),
76991
76992
  agent: string2().min(1).default("auto"),
76993
+ auto_identity: OmoMemoryAutoIdentitySchema.default("path"),
76992
76994
  reflection: OmoMemoryReflectionSchema.default({
76993
76995
  enabled: true,
76994
76996
  trigger: { step_count: 25, on_compaction: true },
@@ -77030,6 +77032,7 @@ var init_memory = __esm(() => {
77030
77032
  OmoMemorySettingsLayerSchema = object({
77031
77033
  enabled: boolean2().optional(),
77032
77034
  agent: string2().min(1).optional(),
77035
+ auto_identity: OmoMemoryAutoIdentitySchema.optional(),
77033
77036
  reflection: OmoMemoryReflectionLayerSchema.optional(),
77034
77037
  nudge: OmoMemoryNudgeLayerSchema.optional(),
77035
77038
  facts: OmoMemoryFactsLayerSchema.optional(),
@@ -77079,6 +77082,7 @@ var init_model_profile = __esm(() => {
77079
77082
  init_fallback_models();
77080
77083
  OmoModelProfileInputSchema = object({
77081
77084
  display_name: string2().optional(),
77085
+ caution: string2().optional(),
77082
77086
  family: _enum(["daily", "geeky"]).optional(),
77083
77087
  tier: _enum(["normal", "heavy"]).optional(),
77084
77088
  models: array(union([string2(), OmoFallbackModelObjectSchema])).optional()
@@ -77372,7 +77376,7 @@ var init_gateway = __esm(() => {
77372
77376
  });
77373
77377
 
77374
77378
  // packages/omo-config-core/src/schema/config.ts
77375
- var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
77379
+ var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoExcludedModelsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
77376
77380
  var init_config = __esm(() => {
77377
77381
  init_zod();
77378
77382
  init_agent();
@@ -77390,6 +77394,7 @@ var init_config = __esm(() => {
77390
77394
  init_gateway();
77391
77395
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
77392
77396
  OmoDisabledSkillsSchema = array(string2());
77397
+ OmoExcludedModelsSchema = array(string2());
77393
77398
  OmoTypedHarnessConfigSchema = object({
77394
77399
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77395
77400
  gateway: OmoGatewaySectionSchema.optional(),
@@ -77405,7 +77410,8 @@ var init_config = __esm(() => {
77405
77410
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
77406
77411
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77407
77412
  computer: OmoComputerSettingsLayerSchema.optional(),
77408
- disabled_skills: OmoDisabledSkillsSchema.optional()
77413
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
77414
+ exclude_models: OmoExcludedModelsSchema.optional()
77409
77415
  }).strict();
77410
77416
  OmoConfigProfileSchema = object({
77411
77417
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -77422,6 +77428,7 @@ var init_config = __esm(() => {
77422
77428
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77423
77429
  computer: OmoComputerSettingsLayerSchema.optional(),
77424
77430
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77431
+ exclude_models: OmoExcludedModelsSchema.optional(),
77425
77432
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77426
77433
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77427
77434
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77444,6 +77451,7 @@ var init_config = __esm(() => {
77444
77451
  side_panel: OmoSidePanelSettingsSchema.optional(),
77445
77452
  computer: OmoComputerSettingsSchema.optional(),
77446
77453
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77454
+ exclude_models: OmoExcludedModelsSchema.optional(),
77447
77455
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77448
77456
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77449
77457
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77469,6 +77477,7 @@ var init_config = __esm(() => {
77469
77477
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77470
77478
  computer: OmoComputerSettingsLayerSchema.optional(),
77471
77479
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77480
+ exclude_models: OmoExcludedModelsSchema.optional(),
77472
77481
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77473
77482
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77474
77483
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77677,7 +77686,51 @@ var init_diagnostic_lines = __esm(() => {
77677
77686
  });
77678
77687
 
77679
77688
  // packages/omo-config-core/src/loader/disabled-skills.ts
77680
- var init_disabled_skills = () => {};
77689
+ function toRecord(value) {
77690
+ if (value === null || typeof value !== "object" || Array.isArray(value))
77691
+ return;
77692
+ return value;
77693
+ }
77694
+ function namesAt(record, key) {
77695
+ const value = record?.[key];
77696
+ if (!Array.isArray(value))
77697
+ return [];
77698
+ return value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
77699
+ }
77700
+ function harnessBlockKeys(harness) {
77701
+ const canonical = canonicalHarnessName(harness);
77702
+ const legacy = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([name]) => harnessBlockKey(name));
77703
+ return [harnessBlockKey(canonical), ...legacy];
77704
+ }
77705
+ function scopesOf(config, harness) {
77706
+ if (harness === undefined)
77707
+ return [config];
77708
+ return [config, ...harnessBlockKeys(harness).map((key) => toRecord(config[key]))];
77709
+ }
77710
+ function collectExcludedModels(options) {
77711
+ return collectUnionedList("exclude_models", options);
77712
+ }
77713
+ function collectUnionedList(key, options) {
77714
+ const names = new Set;
77715
+ for (const layer of options.layers) {
77716
+ const config = toRecord(layer.config);
77717
+ if (config === undefined)
77718
+ continue;
77719
+ const profile = options.profile === undefined ? undefined : toRecord(toRecord(config["profiles"])?.[options.profile]);
77720
+ const scopes = [
77721
+ ...scopesOf(config, options.harness),
77722
+ ...profile === undefined ? [] : scopesOf(profile, options.harness)
77723
+ ];
77724
+ for (const scope of scopes) {
77725
+ for (const name of namesAt(scope, key))
77726
+ names.add(name.trim());
77727
+ }
77728
+ }
77729
+ return [...names];
77730
+ }
77731
+ var init_disabled_skills = __esm(() => {
77732
+ init_schema();
77733
+ });
77681
77734
 
77682
77735
  // packages/omo-config-core/src/loader/merge.ts
77683
77736
  function isUnsafeObjectKey2(key) {
@@ -77913,7 +77966,7 @@ function stripUnrecognizedKeys(record, issues) {
77913
77966
  }
77914
77967
  return { issuePaths, stripped };
77915
77968
  }
77916
- function toRecord(value) {
77969
+ function toRecord2(value) {
77917
77970
  if (value === null || typeof value !== "object" || Array.isArray(value))
77918
77971
  return null;
77919
77972
  const record = {};
@@ -77924,7 +77977,7 @@ function toRecord(value) {
77924
77977
  }
77925
77978
  function validateConfigLayer(path, data) {
77926
77979
  const sanitized = sanitizeUnsafeKeys(data);
77927
- const record = toRecord(sanitized.value);
77980
+ const record = toRecord2(sanitized.value);
77928
77981
  const unsafeIssuePaths = sanitized.issues.flatMap((issue) => issue.keys.map((key) => [...issue.path, key].join(".")));
77929
77982
  const unsafeDiagnostics = unsafeIssuePaths.length === 0 ? [] : [{ kind: "unknown-keys", message: `Ignored unknown keys in ${path}: ${unsafeIssuePaths.join(", ")}`, path, issuePaths: unsafeIssuePaths }];
77930
77983
  const validation = OmoConfigLayerSchema.safeParse(sanitized.value);
@@ -78077,7 +78130,7 @@ function resolveOmoProfileName(options = {}) {
78077
78130
  const env = options.env ?? process.env;
78078
78131
  return profileName(options.profile) ?? profileName(env["OMO_PROFILE"]) ?? profileName(env["OCX_PROFILE"]) ?? profileNameFromOpenCodeConfigDir(env["OPENCODE_CONFIG_DIR"]);
78079
78132
  }
78080
- function toRecord2(value) {
78133
+ function toRecord3(value) {
78081
78134
  if (value === null || typeof value !== "object" || Array.isArray(value))
78082
78135
  return;
78083
78136
  return Object.fromEntries(Object.entries(value));
@@ -78098,13 +78151,13 @@ function harnessLayer(config, harness) {
78098
78151
  const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
78099
78152
  let layer = {};
78100
78153
  for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
78101
- layer = mergeOmoConfigRecords(layer, toRecord2(config[key]) ?? {});
78154
+ layer = mergeOmoConfigRecords(layer, toRecord3(config[key]) ?? {});
78102
78155
  }
78103
78156
  return layer;
78104
78157
  }
78105
78158
  function resolveOmoConfigView(options) {
78106
- const profiles = toRecord2(options.config["profiles"]);
78107
- const profile = options.profile === undefined ? undefined : toRecord2(profiles?.[options.profile]);
78159
+ const profiles = toRecord3(options.config["profiles"]);
78160
+ const profile = options.profile === undefined ? undefined : toRecord3(profiles?.[options.profile]);
78108
78161
  const diagnostics = profile === undefined && options.profile !== undefined ? [{
78109
78162
  kind: "profile",
78110
78163
  message: `Activated omo profile "${options.profile}" does not exist; using the base configuration`,
@@ -78245,9 +78298,15 @@ function loadOmoConfig(options = {}) {
78245
78298
  });
78246
78299
  const finalInput = mergeOmoConfigRecords(DEFAULT_RAW_CONFIG, resolved.config);
78247
78300
  const finalConfig = OmoConfigSchema.safeParse(finalInput);
78301
+ const excludeModels = collectExcludedModels({
78302
+ layers,
78303
+ ...options.harness === undefined ? {} : { harness: options.harness },
78304
+ ...resolved.profile === undefined ? {} : { profile: resolved.profile }
78305
+ });
78306
+ const withExcludedModels = (config) => excludeModels.length === 0 ? config : { ...config, exclude_models: [...excludeModels] };
78248
78307
  if (finalConfig.success) {
78249
78308
  return {
78250
- config: stripResolutionControlKeys(finalConfig.data),
78309
+ config: withExcludedModels(stripResolutionControlKeys(finalConfig.data)),
78251
78310
  diagnostics: [...diagnostics, ...resolved.diagnostics],
78252
78311
  layers,
78253
78312
  ...resolved.profile === undefined ? {} : { profile: resolved.profile },
@@ -78260,7 +78319,7 @@ function loadOmoConfig(options = {}) {
78260
78319
  });
78261
78320
  if (pruned.ok) {
78262
78321
  return {
78263
- config: stripResolutionControlKeys(OmoConfigSchema.parse(pruned.config)),
78322
+ config: withExcludedModels(stripResolutionControlKeys(OmoConfigSchema.parse(pruned.config))),
78264
78323
  diagnostics: [...diagnostics, ...resolved.diagnostics, ...invalidValueDiagnostics(MERGED_OMO_CONFIG_PATH, pruned.dropped)],
78265
78324
  layers,
78266
78325
  ...resolved.profile === undefined ? {} : { profile: resolved.profile },
@@ -78279,6 +78338,7 @@ var DEFAULT_RAW_CONFIG;
78279
78338
  var init_loader2 = __esm(() => {
78280
78339
  init_main();
78281
78340
  init_schema();
78341
+ init_disabled_skills();
78282
78342
  init_layer_validation();
78283
78343
  init_merge();
78284
78344
  init_paths();
@@ -82388,6 +82448,8 @@ function toDiagnosticRecord(input, now) {
82388
82448
  timestamp: now.toISOString(),
82389
82449
  event: input.event,
82390
82450
  source: input.source,
82451
+ ...input.entryKind === undefined ? {} : { entry_kind: input.entryKind },
82452
+ ...input.errorCode === undefined ? {} : { error_code: input.errorCode },
82391
82453
  ...input.count === undefined ? {} : { count: input.count },
82392
82454
  ...serializeError(input.error, input.errorKind)
82393
82455
  };
@@ -92141,7 +92203,7 @@ var package_default2;
92141
92203
  var init_package2 = __esm(() => {
92142
92204
  package_default2 = {
92143
92205
  name: "@oh-my-opencode/omo-codex",
92144
- version: "5.1.41",
92206
+ version: "5.1.43",
92145
92207
  type: "module",
92146
92208
  private: true,
92147
92209
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -99448,6 +99510,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99448
99510
  join63("extensions", "CaseFolding.txt"),
99449
99511
  join63("extensions", "omo-thread-client.js"),
99450
99512
  join63("extensions", "omo-feedback.js"),
99513
+ join63("extensions", "omo-claim-receipt.js"),
99451
99514
  join63("extensions", "assets.generated.json"),
99452
99515
  join63("extensions", "omo-member.js"),
99453
99516
  join63("extensions", "memory-run-supervisor.mjs"),
@@ -108490,6 +108553,10 @@ var package_default3 = {
108490
108553
  types: "./src/config-migration/index.ts",
108491
108554
  import: "./src/config-migration/index.ts"
108492
108555
  },
108556
+ "./service-auth": {
108557
+ types: "./src/cli/service-auth/index.ts",
108558
+ import: "./src/cli/service-auth/index.ts"
108559
+ },
108493
108560
  "./binary-downloader": {
108494
108561
  types: "./src/shared/binary-downloader.ts",
108495
108562
  import: "./src/shared/binary-downloader.ts"
@@ -111503,24 +111570,98 @@ async function loginDevice(session, options) {
111503
111570
 
111504
111571
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111505
111572
  import { createHash as createHash9 } from "crypto";
111573
+
111574
+ // packages/omo-opencode/src/cli/service-auth/secret-service-lock.ts
111575
+ import { spawn as spawn5 } from "child_process";
111576
+ var DEFAULT_COLLECTION = "/org/freedesktop/secrets/aliases/default";
111577
+ var PROBE_TIMEOUT_MS2 = 1e4;
111578
+ var parseLockedReply = (stdout) => {
111579
+ const match = /<\s*(true|false)\s*>/.exec(stdout);
111580
+ if (match === null)
111581
+ return null;
111582
+ return match[1] === "true" ? "locked" : "unlocked";
111583
+ };
111584
+ var probeSecretServiceLock = () => new Promise((resolve) => {
111585
+ const child = spawn5("gdbus", [
111586
+ "call",
111587
+ "--session",
111588
+ "--dest",
111589
+ "org.freedesktop.secrets",
111590
+ "--object-path",
111591
+ DEFAULT_COLLECTION,
111592
+ "--method",
111593
+ "org.freedesktop.DBus.Properties.Get",
111594
+ "org.freedesktop.Secret.Collection",
111595
+ "Locked"
111596
+ ], { stdio: ["ignore", "pipe", "ignore"] });
111597
+ let stdout = "";
111598
+ const timer = setTimeout(() => {
111599
+ child.kill();
111600
+ resolve("unknown");
111601
+ }, PROBE_TIMEOUT_MS2);
111602
+ child.stdout.on("data", (chunk) => {
111603
+ stdout += chunk.toString();
111604
+ });
111605
+ child.on("error", () => {
111606
+ clearTimeout(timer);
111607
+ resolve("unknown");
111608
+ });
111609
+ child.on("close", (code) => {
111610
+ clearTimeout(timer);
111611
+ resolve(code === 0 ? parseLockedReply(stdout) ?? "absent" : "absent");
111612
+ });
111613
+ });
111614
+
111615
+ // packages/omo-opencode/src/cli/service-auth/keystore.ts
111616
+ class KeychainLockedError extends SignInError {
111617
+ }
111618
+ var LOCKED = /-25308|errSecInteractionNotAllowed|interaction is not allowed|locked collection/i;
111619
+ var UNLOCKED_REUSE_MS = 30000;
111620
+ var fallbackNoticed = false;
111621
+ var stderrNoticeOncePerProcess = (message) => {
111622
+ if (fallbackNoticed)
111623
+ return;
111624
+ fallbackNoticed = true;
111625
+ process.stderr.write(`${message}
111626
+ `);
111627
+ };
111628
+ var isLocked = (error) => error instanceof Error && (LOCKED.test(error.message) || LOCKED.test(String(error.code ?? "")));
111506
111629
  function credentialId(api) {
111507
111630
  return createHash9("sha256").update(serviceOrigin(api)).digest("hex");
111508
111631
  }
111509
- function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform) {
111632
+ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform, lockProbe = probeSecretServiceLock, notice = stderrNoticeOncePerProcess) {
111510
111633
  if (!secrets)
111511
111634
  throw new SignInError("OmO sign-in needs Bun 1.4 or newer with OS credential storage. No file fallback is available.");
111512
111635
  const platformName = platform === "darwin" ? "macOS Keychain" : platform === "linux" ? "Linux Secret Service (libsecret and an unlocked keyring)" : platform === "win32" ? "Windows Credential Manager" : null;
111513
111636
  if (platformName === null)
111514
111637
  throw new SignInError("This platform has no supported OS credential store.");
111515
111638
  const key = { service: "omo-cli", name: credentialId(api) };
111516
- const unavailable = () => new SignInError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
111639
+ const unavailable = (error) => isLocked(error) ? new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`) : new SignInError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
111640
+ let unlockedUntil = 0;
111641
+ let noticed = false;
111642
+ const assertUsable = async () => {
111643
+ if (platform !== "linux" || Date.now() < unlockedUntil)
111644
+ return;
111645
+ const lock = await lockProbe();
111646
+ if (lock === "locked")
111647
+ throw new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`);
111648
+ if (lock === "unlocked") {
111649
+ unlockedUntil = Date.now() + UNLOCKED_REUSE_MS;
111650
+ return;
111651
+ }
111652
+ if (!noticed) {
111653
+ noticed = true;
111654
+ notice("omo: could not check whether the keyring is locked (gdbus or the Secret Service did not answer); using libsecret directly.");
111655
+ }
111656
+ };
111517
111657
  return {
111518
111658
  async read() {
111659
+ await assertUsable();
111519
111660
  let value;
111520
111661
  try {
111521
111662
  value = await secrets.get(key);
111522
- } catch {
111523
- throw unavailable();
111663
+ } catch (error) {
111664
+ throw unavailable(error);
111524
111665
  }
111525
111666
  if (value === null)
111526
111667
  return null;
@@ -111531,17 +111672,19 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111531
111672
  }
111532
111673
  },
111533
111674
  async write(value) {
111675
+ await assertUsable();
111534
111676
  try {
111535
111677
  await secrets.set({ ...key, value: JSON.stringify(credentialSchema.parse(value)) });
111536
- } catch {
111537
- throw unavailable();
111678
+ } catch (error) {
111679
+ throw unavailable(error);
111538
111680
  }
111539
111681
  },
111540
111682
  async clear() {
111683
+ await assertUsable();
111541
111684
  try {
111542
111685
  await secrets.delete(key);
111543
- } catch {
111544
- throw unavailable();
111686
+ } catch (error) {
111687
+ throw unavailable(error);
111545
111688
  }
111546
111689
  }
111547
111690
  };
@@ -111885,9 +112028,11 @@ async function reapStaleLock(lockPath, staleAfterMs = DEFAULT_STALE_AFTER_MS, de
111885
112028
  // packages/omo-opencode/src/cli/service-auth/session.ts
111886
112029
  class SessionEnded extends SignInError {
111887
112030
  deviceRevoked;
111888
- constructor(message, deviceRevoked) {
112031
+ code;
112032
+ constructor(message, deviceRevoked, code) {
111889
112033
  super(message);
111890
112034
  this.deviceRevoked = deviceRevoked;
112035
+ this.code = code;
111891
112036
  }
111892
112037
  }
111893
112038
  var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required"]);
@@ -111919,7 +112064,7 @@ function createSession(options) {
111919
112064
  } catch (error) {
111920
112065
  if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant"].includes(error.code)) {
111921
112066
  await store.clear();
111922
- throw new SessionEnded(error.code === "reauth_required" ? "This session was ended because its refresh token was reused. Sign in again with omo login." : "Sign in again with omo login.", DEVICE_REVOKING_REFUSALS.has(error.code));
112067
+ throw new SessionEnded(error.code === "reauth_required" ? "This session was ended because its refresh token was reused. Sign in again with omo login." : "Sign in again with omo login.", DEVICE_REVOKING_REFUSALS.has(error.code), error.code);
111923
112068
  }
111924
112069
  if (error instanceof RequestFailure && error.notSent || error instanceof ApiRefusal && error.status === 429 && error.code === "rate_limited") {
111925
112070
  await store.write(current);
@@ -111937,6 +112082,9 @@ function createSession(options) {
111937
112082
  async save(value) {
111938
112083
  await locked(() => store.write(value));
111939
112084
  },
112085
+ async update(action) {
112086
+ return locked(async () => action(await store.read()));
112087
+ },
111940
112088
  async logout() {
111941
112089
  return locked(async () => {
111942
112090
  try {
@@ -112300,7 +112448,7 @@ async function boulder(options) {
112300
112448
  return 0;
112301
112449
  }
112302
112450
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
112303
- import { spawn as spawn5 } from "child_process";
112451
+ import { spawn as spawn6 } from "child_process";
112304
112452
  import { existsSync as existsSync65, readFileSync as readFileSync43, realpathSync as realpathSync11 } from "fs";
112305
112453
  import { homedir as homedir29 } from "os";
112306
112454
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
@@ -112330,7 +112478,7 @@ async function codexUlwLoop(args) {
112330
112478
  return 1;
112331
112479
  }
112332
112480
  const { promise, resolve } = Promise.withResolvers();
112333
- const child = spawn5(command.executable, [...command.argsPrefix, ...args], {
112481
+ const child = spawn6(command.executable, [...command.argsPrefix, ...args], {
112334
112482
  stdio: "inherit",
112335
112483
  env: { ...process.env, [ULW_LOOP_DELEGATION_SENTINEL]: "1" }
112336
112484
  });
@@ -1,7 +1 @@
1
- declare const fakeStoreUrl: string | undefined;
2
- declare const get: () => Promise<string | null>;
3
- declare const set: ({ value }: {
4
- readonly value: string;
5
- }) => Promise<void>;
6
- declare const remove: () => Promise<boolean>;
7
- declare const failure: string | undefined;
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { type CredentialStore, createCredentialStore, quietNotice } from "./keystore";
2
+ export { type Credentials, SignInError, serviceOrigin } from "./protocol";
3
+ export { createSession, type Session } from "./session";