oh-my-opencode 5.0.1 → 5.1.1

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 (96) hide show
  1. package/README.ja.md +2 -1
  2. package/README.ko.md +2 -1
  3. package/README.md +2 -1
  4. package/README.ru.md +2 -1
  5. package/README.zh-cn.md +2 -1
  6. package/dist/cli/index.js +851 -546
  7. package/dist/cli-node/index.js +851 -546
  8. package/dist/features/background-agent/parent-wake-dedupe.d.ts +1 -0
  9. package/dist/features/boulder-state/storage.d.ts +1 -1
  10. package/dist/hooks/comment-checker/downloader.d.ts +3 -1
  11. package/dist/index.js +2413 -2153
  12. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  13. package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
  14. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  15. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  16. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  17. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  18. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  19. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  20. package/dist/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
  21. package/dist/tui.js +116 -41
  22. package/package.json +29 -18
  23. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +3 -0
  24. package/packages/lsp-core/src/lsp/workspace-apply-edit-lease.integration.test.ts +7 -3
  25. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +341 -157
  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/bootstrap/src/setup.ts +7 -4
  30. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  33. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  35. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  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/hooks/hooks.json +1 -1
  44. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  46. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/ulw-execute-continuation/AGENTS.md +1 -1
  48. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +42 -32
  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-execute-continuation/src/plan-checklist.ts +55 -29
  52. package/packages/omo-codex/plugin/components/ulw-execute-continuation/test/boulder-reader.test.ts +51 -0
  53. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  54. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  76. package/packages/omo-codex/plugin/package-lock.json +12 -12
  77. package/packages/omo-codex/plugin/package.json +1 -1
  78. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  79. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  80. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  81. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  82. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  83. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  84. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  85. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  86. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
  87. package/packages/omo-codex/scripts/install-dist/install-local.mjs +10465 -10270
  88. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  89. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  90. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  91. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  92. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  93. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  94. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  95. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  96. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-09-27T06:05:44.538Z"
8
+ "stagedAtUtc": "2026-09-29T06:10:49.442Z"
9
9
  }
@@ -66,7 +66,7 @@ The finder prints JSON for stdout and `jq`. Every result includes:
66
66
  | `detail_hint` | Ready-to-run `read` command for detailed inspection |
67
67
  | `match_reasons` | Search-only array explaining which field/content matched each query |
68
68
 
69
- Each `match_reasons` entry includes `query`, `platform`, `field`, and `snippet`, so you can tell which platform matched and what content caused the hit without opening every transcript.
69
+ Each `match_reasons` entry includes `query`, `platform`, `field`, and `snippet`, so you can tell which platform matched and what content caused the hit without opening every transcript. `field` is `user_message` when the query matched a user prompt that the `first_user_message`/`last_user_message` previews do not cover, such as a prompt in the middle of the session.
70
70
 
71
71
  ## Filters
72
72
 
@@ -93,6 +93,7 @@ def _aside_session(path: Path, index: dict[str, _StateRow]) -> Session:
93
93
  sid = _dir_session_id(path.parent.name)
94
94
  row = index.get(sid)
95
95
  first_user = last_user = ""
96
+ prompts: list[str] = []
96
97
  provider = model = None
97
98
  created = updated = None
98
99
  usage: JsonMap = {}
@@ -107,6 +108,7 @@ def _aside_session(path: Path, index: dict[str, _StateRow]) -> Session:
107
108
  if prompt:
108
109
  first_user = first_user or prompt
109
110
  last_user = prompt
111
+ prompts.append(prompt)
110
112
  elif role == "assistant":
111
113
  provider = provider or text(data.get("provider"))
112
114
  model = model or text(data.get("model"))
@@ -125,6 +127,7 @@ def _aside_session(path: Path, index: dict[str, _StateRow]) -> Session:
125
127
  row.parent_id if row is not None else None,
126
128
  row.title if row is not None and row.parent_id is not None else None,
127
129
  last_user,
130
+ tuple(prompts),
128
131
  )
129
132
 
130
133
 
@@ -226,6 +226,10 @@ def _match_reasons(item: Session, query: str) -> list[JsonMap]:
226
226
  for field, value in _search_fields(item):
227
227
  if needle in value.lower():
228
228
  reasons.append({"query": query, "platform": item.platform, "field": field, "snippet": _snippet(value, needle)})
229
+ if not reasons:
230
+ prompt = next((message for message in item.user_messages or () if needle in message.lower()), "")
231
+ if prompt:
232
+ reasons.append({"query": query, "platform": item.platform, "field": "user_message", "snippet": _snippet(prompt, needle)})
229
233
  return reasons
230
234
 
231
235
 
@@ -80,6 +80,7 @@ def scan_aider(extra_roots: tuple[Path, ...], workers: int) -> list[Session]:
80
80
  def _droid_session(path: Path) -> Session:
81
81
  sid = path.stem
82
82
  cwd = model = first_user = last_user = None
83
+ prompts: list[str] = []
83
84
  created = updated = None
84
85
  settings = as_map(read_json(path.with_suffix(".settings.json"))) or {}
85
86
  for data in iter_jsonl(path):
@@ -94,7 +95,8 @@ def _droid_session(path: Path) -> Session:
94
95
  if prompt:
95
96
  first_user = first_user or prompt
96
97
  last_user = prompt
97
- return Session("droid", sid, str(path), cwd, created or file_time(path), updated or created or file_time(path), None, text(settings.get("model")) or model, first_user or "", _usage(settings), last_user_message=last_user or "")
98
+ prompts.append(prompt)
99
+ return Session("droid", sid, str(path), cwd, created or file_time(path), updated or created or file_time(path), None, text(settings.get("model")) or model, first_user or "", _usage(settings), last_user_message=last_user or "", user_messages=tuple(prompts))
98
100
 
99
101
 
100
102
  def _amp_sessions(path: Path) -> list[Session]:
@@ -136,6 +138,7 @@ def _gemini_sessions(path: Path) -> list[Session]:
136
138
 
137
139
  def _kimi_session(path: Path) -> Session:
138
140
  first_user = last_user = ""
141
+ prompts: list[str] = []
139
142
  created = updated = None
140
143
  for data in iter_jsonl(path):
141
144
  stamp = data.get("timestamp")
@@ -146,7 +149,8 @@ def _kimi_session(path: Path) -> Session:
146
149
  if prompt:
147
150
  first_user = first_user or prompt
148
151
  last_user = prompt
149
- return Session("kimi", path.parent.name, str(path), None, created or file_time(path), updated or file_time(path), "moonshot", None, first_user, {}, last_user_message=last_user)
152
+ prompts.append(prompt)
153
+ return Session("kimi", path.parent.name, str(path), None, created or file_time(path), updated or file_time(path), "moonshot", None, first_user, {}, last_user_message=last_user, user_messages=tuple(prompts))
150
154
 
151
155
 
152
156
  def _codebuff_sessions(path: Path) -> list[Session]:
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from concurrent.futures import ThreadPoolExecutor, as_completed
4
+ from dataclasses import replace
4
5
  from pathlib import Path
5
6
  from typing import Callable, TypeAlias
6
7
 
@@ -95,8 +96,13 @@ def _dedupe(sessions: list[Session]) -> list[Session]:
95
96
  for session in sessions:
96
97
  key = (session.platform, session.id)
97
98
  current = found.get(key)
98
- if current is None or _linkage_score(session) > _linkage_score(current):
99
+ if current is None:
99
100
  found[key] = session
101
+ continue
102
+ winner, twin = (session, current) if _linkage_score(session) > _linkage_score(current) else (current, session)
103
+ if winner.user_messages is None and twin.user_messages is not None:
104
+ winner = replace(winner, user_messages=twin.user_messages)
105
+ found[key] = winner
100
106
  return list(found.values())
101
107
 
102
108
 
@@ -39,6 +39,7 @@ def jsonl_session(platform: str, path: Path, fallback_id: str) -> Session:
39
39
  sid = fallback_id
40
40
  cwd = provider = model = first_user = parent = agent = None
41
41
  last_user = ""
42
+ prompts: list[str] = []
42
43
  created = updated = None
43
44
  usage: JsonMap = {}
44
45
  for data in iter_jsonl(path):
@@ -65,8 +66,9 @@ def jsonl_session(platform: str, path: Path, fallback_id: str) -> Session:
65
66
  if prompt:
66
67
  first_user = first_user or prompt
67
68
  last_user = prompt
69
+ prompts.append(prompt)
68
70
  merge_usage(usage, as_map(message.get("usage")) or as_map(data.get("usage")))
69
- return Session(platform, sid, str(path), cwd, created or file_time(path), updated or created or file_time(path), provider, model, first_user or "", usage, parent, agent, last_user)
71
+ return Session(platform, sid, str(path), cwd, created or file_time(path), updated or created or file_time(path), provider, model, first_user or "", usage, parent, agent, last_user, tuple(prompts))
70
72
 
71
73
 
72
74
  def spawn_info(source: Json | None) -> tuple[str | None, str | None]:
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
4
  from pathlib import Path
5
5
  from typing import TypeAlias
6
6
 
@@ -38,6 +38,8 @@ class Session:
38
38
  parent_id: str | None = None
39
39
  agent: str | None = None
40
40
  last_user_message: str = ""
41
+ # Every user prompt the scanner already parsed, kept for search only; None when the scanner did not read the whole transcript.
42
+ user_messages: tuple[str, ...] | None = field(default=None, compare=False, repr=False)
41
43
 
42
44
  def to_json(self) -> JsonMap:
43
45
  return {
@@ -16,4 +16,8 @@ sys.path.insert(0, str(Path(__file__).resolve().parent))
16
16
 
17
17
 
18
18
  if __name__ == "__main__":
19
+ if sys.version_info < (3, 11):
20
+ found = ".".join(str(part) for part in sys.version_info[:3])
21
+ _ = sys.stderr.write(f"find-agent-sessions requires Python 3.11 or newer (found {found}); run it with python3.11+ or `uv run`.\n")
22
+ raise SystemExit(2)
19
23
  _ = runpy.run_module("agent_sessions.cli", run_name="__main__")
package/dist/tui.js CHANGED
@@ -2911,6 +2911,9 @@ function getActiveReservation(sessionID) {
2911
2911
  pruneExpiredReservations();
2912
2912
  return promptAsyncReservations.get(sessionID);
2913
2913
  }
2914
+ function reservedDispatchResult(reservation) {
2915
+ return reservation.expiresAt === undefined ? { status: "reserved", reservedBy: reservation.source } : { status: "reserved", reservedBy: reservation.source, expiresAt: reservation.expiresAt };
2916
+ }
2914
2917
  function setPromptReservation(sessionID, reservation) {
2915
2918
  promptAsyncReservations.set(sessionID, reservation);
2916
2919
  }
@@ -2960,7 +2963,7 @@ async function dispatchAfterSessionIdle(args) {
2960
2963
  reservedBy: existing.source,
2961
2964
  reservedAgeMs: Date.now() - existing.reservedAt
2962
2965
  });
2963
- return { status: "reserved", reservedBy: existing.source };
2966
+ return reservedDispatchResult(existing);
2964
2967
  }
2965
2968
  const reservation = {
2966
2969
  source,
@@ -3499,12 +3502,12 @@ var init_category_model_requirements = __esm(() => {
3499
3502
  },
3500
3503
  "deep-low": {
3501
3504
  fallbackChain: [
3502
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-5.6-sol-fast", variant: "medium" },
3503
3505
  {
3504
3506
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
3505
3507
  model: "gpt-5.6-sol",
3506
3508
  variant: "medium"
3507
- }
3509
+ },
3510
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-5.6-sol-fast", variant: "medium" }
3508
3511
  ]
3509
3512
  },
3510
3513
  "deep-high": {
@@ -3556,6 +3559,11 @@ var init_category_model_requirements = __esm(() => {
3556
3559
  },
3557
3560
  "unspecified-low": {
3558
3561
  fallbackChain: [
3562
+ {
3563
+ providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
3564
+ model: "claude-sonnet-5-5",
3565
+ variant: "medium"
3566
+ },
3559
3567
  { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
3560
3568
  { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
3561
3569
  {
@@ -3935,8 +3943,17 @@ var init_model_resolver = () => {};
3935
3943
  // packages/model-core/src/fallback-chain-from-models.ts
3936
3944
  var init_fallback_chain_from_models = () => {};
3937
3945
 
3946
+ // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
3947
+ var init_runtime_fallback_auto_retry_signal = () => {};
3948
+
3949
+ // packages/model-core/src/runtime-fallback-error-shape.ts
3950
+ var init_runtime_fallback_error_shape = () => {};
3951
+
3952
+ // packages/model-core/src/runtime-fallback-error-classifier.ts
3953
+ var init_runtime_fallback_error_classifier = () => {};
3954
+
3938
3955
  // packages/model-core/src/model-error-classifier.ts
3939
- var RETRYABLE_ERROR_NAMES, STOP_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3956
+ var RETRYABLE_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3940
3957
  var init_model_error_classifier = __esm(() => {
3941
3958
  RETRYABLE_ERROR_NAMES = new Set([
3942
3959
  "providermodelnotfounderror",
@@ -3945,11 +3962,6 @@ var init_model_error_classifier = __esm(() => {
3945
3962
  "providerconnectionerror",
3946
3963
  "authenticationerror"
3947
3964
  ]);
3948
- STOP_ERROR_NAMES = new Set([
3949
- "quotaexceedederror",
3950
- "insufficientcreditserror",
3951
- "freeusagelimiterror"
3952
- ]);
3953
3965
  NON_RETRYABLE_ERROR_NAMES = new Set([
3954
3966
  "messageabortederror",
3955
3967
  "permissiondeniederror",
@@ -3961,15 +3973,6 @@ var init_model_error_classifier = __esm(() => {
3961
3973
  ]);
3962
3974
  });
3963
3975
 
3964
- // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
3965
- var init_runtime_fallback_auto_retry_signal = () => {};
3966
-
3967
- // packages/model-core/src/runtime-fallback-error-shape.ts
3968
- var init_runtime_fallback_error_shape = () => {};
3969
-
3970
- // packages/model-core/src/runtime-fallback-error-classifier.ts
3971
- var init_runtime_fallback_error_classifier = () => {};
3972
-
3973
3976
  // packages/model-core/src/provider-exhaustion-fallback-policy.ts
3974
3977
  var init_provider_exhaustion_fallback_policy = () => {};
3975
3978
 
@@ -4275,6 +4278,36 @@ var init_supplemental_entries = __esm(() => {
4275
4278
  output: 32768
4276
4279
  }
4277
4280
  },
4281
+ "claude-sonnet-5-5": {
4282
+ id: "claude-sonnet-5-5",
4283
+ family: "claude-sonnet",
4284
+ reasoning: true,
4285
+ temperature: false,
4286
+ toolCall: true,
4287
+ modalities: {
4288
+ input: ["text", "image", "pdf"],
4289
+ output: ["text"]
4290
+ },
4291
+ limit: {
4292
+ context: 1e6,
4293
+ output: 128000
4294
+ }
4295
+ },
4296
+ "anthropic/claude-sonnet-5-5": {
4297
+ id: "anthropic/claude-sonnet-5-5",
4298
+ family: "claude-sonnet",
4299
+ reasoning: true,
4300
+ temperature: false,
4301
+ toolCall: true,
4302
+ modalities: {
4303
+ input: ["text", "image", "pdf"],
4304
+ output: ["text"]
4305
+ },
4306
+ limit: {
4307
+ context: 1e6,
4308
+ output: 128000
4309
+ }
4310
+ },
4278
4311
  "grok-4.7": {
4279
4312
  id: "grok-4.7",
4280
4313
  family: "grok",
@@ -5235,7 +5268,7 @@ var init_openai_categories = __esm(() => {
5235
5268
  },
5236
5269
  {
5237
5270
  name: "deep-low",
5238
- config: { model: "openai/gpt-5.6-sol-fast", variant: "medium" },
5271
+ config: { model: "openai/gpt-5.6-sol", variant: "medium" },
5239
5272
  description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
5240
5273
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
5241
5274
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
@@ -5260,7 +5293,7 @@ var init_openai_categories = __esm(() => {
5260
5293
  },
5261
5294
  {
5262
5295
  name: "unspecified-low",
5263
- config: { model: "xiaomi/mimo-v2.6-pro", variant: "max" },
5296
+ config: { model: "anthropic/claude-sonnet-5-5", variant: "medium" },
5264
5297
  description: "Tasks that don't fit other categories, low effort required",
5265
5298
  callerGuidance: UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE,
5266
5299
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
@@ -69754,6 +69787,29 @@ var init_category = __esm(() => {
69754
69787
  OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
69755
69788
  });
69756
69789
 
69790
+ // packages/omo-config-core/src/schema/computer.ts
69791
+ var positiveInteger, nonNegativeInteger, OmoComputerSettingsLayerSchema, OmoComputerSettingsSchema;
69792
+ var init_computer = __esm(() => {
69793
+ init_zod();
69794
+ positiveInteger = number2().int().positive();
69795
+ nonNegativeInteger = number2().int().nonnegative();
69796
+ OmoComputerSettingsLayerSchema = object({
69797
+ enabled: boolean2().describe("Experimental: register the computer tool in OmO Native sessions (default: on where the host is supported; false leaves it unregistered)"),
69798
+ display: string2().min(1),
69799
+ max_width: positiveInteger,
69800
+ max_height: positiveInteger,
69801
+ screenshot_max_bytes: positiveInteger,
69802
+ stop_hotkey: string2().min(1),
69803
+ allow_host_relay_only_stop: boolean2(),
69804
+ macos_canary: _enum(["session", "off"]),
69805
+ audit_log: object({ enabled: boolean2() }).partial().strict(),
69806
+ screenshot_gc: object({ enabled: boolean2(), stale_ms: nonNegativeInteger, scan_interval_ms: nonNegativeInteger }).partial().strict(),
69807
+ engine_path: string2().min(1),
69808
+ cua_adapter: boolean2()
69809
+ }).partial().strict().describe("Experimental computer use in OmO Native: screenshots, windows, accessibility trees and native mouse and keyboard input. Every key is optional; defaults depend on the host.");
69810
+ OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
69811
+ });
69812
+
69757
69813
  // packages/omo-config-core/src/schema/git-master.ts
69758
69814
  var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
69759
69815
  var init_git_master = __esm(() => {
@@ -70026,11 +70082,11 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
70026
70082
  const record2 = record(string2(), unknown()).parse(input);
70027
70083
  return OmoTaskSettingsSchema.parse({
70028
70084
  ...record2,
70029
- residency_max_children: record2["residency_max_children"] ?? Math.min(DEFAULT_RESIDENCY_MAX_CHILDREN, Math.max(8, resolveParallelism() * 2)),
70085
+ residency_max_children: record2["residency_max_children"] ?? DEFAULT_RESIDENCY_MAX_CHILDREN,
70030
70086
  global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
70031
70087
  });
70032
70088
  }
70033
- var DEFAULT_RESIDENCY_MAX_CHILDREN = 16, ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
70089
+ var DEFAULT_RESIDENCY_MAX_CHILDREN = "unlimited", ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
70034
70090
  var init_task = __esm(() => {
70035
70091
  init_zod();
70036
70092
  ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
@@ -70088,12 +70144,13 @@ var init_task = __esm(() => {
70088
70144
  process_runner: _enum(["host", "child-process"]).default("host"),
70089
70145
  host_engine_policy: _enum(["upgrade", "fallback"]).default("upgrade"),
70090
70146
  host_idle_exit_ms: number2().int().positive().optional(),
70147
+ host_shard_prewarm: _enum(["off", "first-turn", "session-start"]).default("first-turn"),
70091
70148
  default_concurrency: number2().int().nonnegative().default(5),
70092
70149
  global_concurrency: number2().int().nonnegative().default(8),
70093
70150
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70094
70151
  model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70095
70152
  max_depth: number2().int().nonnegative().default(1),
70096
- residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
70153
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
70097
70154
  resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
70098
70155
  ttl_ms: number2().int().positive().default(86400000),
70099
70156
  state_dir: string2().optional(),
@@ -70137,6 +70194,7 @@ var init_task = __esm(() => {
70137
70194
  process_runner: _enum(["host", "child-process"]).optional(),
70138
70195
  host_engine_policy: _enum(["upgrade", "fallback"]).optional(),
70139
70196
  host_idle_exit_ms: number2().int().positive().optional(),
70197
+ host_shard_prewarm: _enum(["off", "first-turn", "session-start"]).optional(),
70140
70198
  default_concurrency: number2().int().nonnegative().optional(),
70141
70199
  global_concurrency: number2().int().nonnegative().optional(),
70142
70200
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
@@ -70244,6 +70302,7 @@ var init_config = __esm(() => {
70244
70302
  init_zod();
70245
70303
  init_agent();
70246
70304
  init_category();
70305
+ init_computer();
70247
70306
  init_git_master();
70248
70307
  init_memory();
70249
70308
  init_model_catalog();
@@ -70266,6 +70325,7 @@ var init_config = __esm(() => {
70266
70325
  model_profile: string2().optional(),
70267
70326
  memory: OmoMemorySettingsLayerSchema.optional(),
70268
70327
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70328
+ computer: OmoComputerSettingsLayerSchema.optional(),
70269
70329
  disabled_skills: OmoDisabledSkillsSchema.optional()
70270
70330
  }).strict();
70271
70331
  OmoConfigProfileSchema = object({
@@ -70280,6 +70340,7 @@ var init_config = __esm(() => {
70280
70340
  model_profile: string2().optional(),
70281
70341
  memory: OmoMemorySettingsLayerSchema.optional(),
70282
70342
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70343
+ computer: OmoComputerSettingsLayerSchema.optional(),
70283
70344
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70284
70345
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70285
70346
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70299,6 +70360,7 @@ var init_config = __esm(() => {
70299
70360
  model_profile: string2().optional(),
70300
70361
  memory: OmoMemorySettingsSchema.optional(),
70301
70362
  telemetry: OmoTelemetrySettingsSchema.optional(),
70363
+ computer: OmoComputerSettingsSchema.optional(),
70302
70364
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70303
70365
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70304
70366
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70321,6 +70383,7 @@ var init_config = __esm(() => {
70321
70383
  model_profile: string2().optional(),
70322
70384
  memory: OmoMemorySettingsLayerSchema.optional(),
70323
70385
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70386
+ computer: OmoComputerSettingsLayerSchema.optional(),
70324
70387
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70325
70388
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70326
70389
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70460,6 +70523,7 @@ var init_schema = __esm(() => {
70460
70523
  init_task();
70461
70524
  init_team();
70462
70525
  init_telemetry();
70526
+ init_computer();
70463
70527
  });
70464
70528
 
70465
70529
  // packages/omo-config-core/src/loader/disabled-skills.ts
@@ -74150,7 +74214,7 @@ init_shared();
74150
74214
  // package.json
74151
74215
  var package_default = {
74152
74216
  name: "oh-my-opencode",
74153
- version: "5.0.1",
74217
+ version: "5.1.1",
74154
74218
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74155
74219
  main: "./dist/index.js",
74156
74220
  types: "dist/index.d.ts",
@@ -74183,6 +74247,11 @@ var package_default = {
74183
74247
  "packages/omo-codex",
74184
74248
  "packages/omo-senpi",
74185
74249
  "packages/senpi-task",
74250
+ "packages/senpi-desktop-protocol",
74251
+ "packages/senpi-desktop-engine",
74252
+ "packages/senpi-desktop-prelude",
74253
+ "packages/senpi-desktop-service",
74254
+ "packages/senpi-desktop-tool",
74186
74255
  "packages/omo-opencode",
74187
74256
  "packages/omo-native"
74188
74257
  ],
@@ -74284,7 +74353,7 @@ var package_default = {
74284
74353
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
74285
74354
  "test:model-capabilities": "bun test --timeout 20000 packages/model-core/src/model-capability-aliases.test.ts packages/model-core/src/model-capability-guardrails.test.ts packages/model-core/src/model-capabilities.test.ts packages/omo-opencode/src/cli/doctor/checks/model-resolution.test.ts --bail",
74286
74355
  typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
74287
- "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/isolation-core/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json",
74356
+ "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/isolation-core/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-protocol/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-engine/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-prelude/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-service/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-tool/tsconfig.json",
74288
74357
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
74289
74358
  test: "bun test --timeout 20000",
74290
74359
  "changelog:section": "bun script/changelog-section.ts",
@@ -74293,7 +74362,8 @@ var package_default = {
74293
74362
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test --timeout 20000 packages/omo-senpi && bun test ./.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs",
74294
74363
  "test:windows-codex": "bun run test:codex",
74295
74364
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
74296
- "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build"
74365
+ "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
74366
+ "test:desktop": "bun script/check-cargo-pinned-deps.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test"
74297
74367
  },
74298
74368
  keywords: [
74299
74369
  "opencode",
@@ -74333,7 +74403,7 @@ var package_default = {
74333
74403
  zod: "^4.6.5"
74334
74404
  },
74335
74405
  devDependencies: {
74336
- "@code-yeongyu/senpi": "2026.9.27",
74406
+ "@code-yeongyu/senpi": "2026.9.29",
74337
74407
  "@oh-my-opencode/agents-md-core": "workspace:*",
74338
74408
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
74339
74409
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -74342,11 +74412,11 @@ var package_default = {
74342
74412
  "@oh-my-opencode/delegate-core": "workspace:*",
74343
74413
  "@oh-my-opencode/git-bash-mcp": "workspace:*",
74344
74414
  "@oh-my-opencode/hashline-core": "workspace:*",
74345
- "@oh-my-opencode/lsp-core": "workspace:*",
74346
74415
  "@oh-my-opencode/isolation-core": "workspace:*",
74347
- "@oh-my-opencode/memory-core": "workspace:*",
74416
+ "@oh-my-opencode/lsp-core": "workspace:*",
74348
74417
  "@oh-my-opencode/mcp-client-core": "workspace:*",
74349
74418
  "@oh-my-opencode/mcp-stdio-core": "workspace:*",
74419
+ "@oh-my-opencode/memory-core": "workspace:*",
74350
74420
  "@oh-my-opencode/model-core": "workspace:*",
74351
74421
  "@oh-my-opencode/omo-codex": "workspace:*",
74352
74422
  "@oh-my-opencode/omo-config-core": "workspace:*",
@@ -74355,6 +74425,11 @@ var package_default = {
74355
74425
  "@oh-my-opencode/openclaw-core": "workspace:*",
74356
74426
  "@oh-my-opencode/prompts-core": "workspace:*",
74357
74427
  "@oh-my-opencode/rules-engine": "workspace:*",
74428
+ "@oh-my-opencode/senpi-desktop-engine": "workspace:*",
74429
+ "@oh-my-opencode/senpi-desktop-prelude": "workspace:*",
74430
+ "@oh-my-opencode/senpi-desktop-protocol": "workspace:*",
74431
+ "@oh-my-opencode/senpi-desktop-service": "workspace:*",
74432
+ "@oh-my-opencode/senpi-desktop-tool": "workspace:*",
74358
74433
  "@oh-my-opencode/senpi-task": "workspace:*",
74359
74434
  "@oh-my-opencode/shared-skills": "workspace:*",
74360
74435
  "@oh-my-opencode/skills-loader-core": "workspace:*",
@@ -74374,18 +74449,18 @@ var package_default = {
74374
74449
  typescript: "^7.0.2"
74375
74450
  },
74376
74451
  optionalDependencies: {
74377
- "oh-my-opencode-darwin-arm64": "5.0.1",
74378
- "oh-my-opencode-darwin-x64": "5.0.1",
74379
- "oh-my-opencode-darwin-x64-baseline": "5.0.1",
74380
- "oh-my-opencode-linux-arm64": "5.0.1",
74381
- "oh-my-opencode-linux-arm64-musl": "5.0.1",
74382
- "oh-my-opencode-linux-x64": "5.0.1",
74383
- "oh-my-opencode-linux-x64-baseline": "5.0.1",
74384
- "oh-my-opencode-linux-x64-musl": "5.0.1",
74385
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.1",
74386
- "oh-my-opencode-windows-arm64": "5.0.1",
74387
- "oh-my-opencode-windows-x64": "5.0.1",
74388
- "oh-my-opencode-windows-x64-baseline": "5.0.1"
74452
+ "oh-my-opencode-darwin-arm64": "5.1.1",
74453
+ "oh-my-opencode-darwin-x64": "5.1.1",
74454
+ "oh-my-opencode-darwin-x64-baseline": "5.1.1",
74455
+ "oh-my-opencode-linux-arm64": "5.1.1",
74456
+ "oh-my-opencode-linux-arm64-musl": "5.1.1",
74457
+ "oh-my-opencode-linux-x64": "5.1.1",
74458
+ "oh-my-opencode-linux-x64-baseline": "5.1.1",
74459
+ "oh-my-opencode-linux-x64-musl": "5.1.1",
74460
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.1",
74461
+ "oh-my-opencode-windows-arm64": "5.1.1",
74462
+ "oh-my-opencode-windows-x64": "5.1.1",
74463
+ "oh-my-opencode-windows-x64-baseline": "5.1.1"
74389
74464
  },
74390
74465
  overrides: {
74391
74466
  "@earendil-works/pi-agent-core": "0.84.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.1",
3
+ "version": "5.1.1",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,6 +33,11 @@
33
33
  "packages/omo-codex",
34
34
  "packages/omo-senpi",
35
35
  "packages/senpi-task",
36
+ "packages/senpi-desktop-protocol",
37
+ "packages/senpi-desktop-engine",
38
+ "packages/senpi-desktop-prelude",
39
+ "packages/senpi-desktop-service",
40
+ "packages/senpi-desktop-tool",
36
41
  "packages/omo-opencode",
37
42
  "packages/omo-native"
38
43
  ],
@@ -134,7 +139,7 @@
134
139
  "prepublishOnly": "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
135
140
  "test:model-capabilities": "bun test --timeout 20000 packages/model-core/src/model-capability-aliases.test.ts packages/model-core/src/model-capability-guardrails.test.ts packages/model-core/src/model-capabilities.test.ts packages/omo-opencode/src/cli/doctor/checks/model-resolution.test.ts --bail",
136
141
  "typecheck": "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
137
- "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/isolation-core/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json",
142
+ "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/isolation-core/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-protocol/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-engine/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-prelude/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-service/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-tool/tsconfig.json",
138
143
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
139
144
  "test": "bun test --timeout 20000",
140
145
  "changelog:section": "bun script/changelog-section.ts",
@@ -143,7 +148,8 @@
143
148
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test --timeout 20000 packages/omo-senpi && bun test ./.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs",
144
149
  "test:windows-codex": "bun run test:codex",
145
150
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
146
- "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build"
151
+ "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
152
+ "test:desktop": "bun script/check-cargo-pinned-deps.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test"
147
153
  },
148
154
  "keywords": [
149
155
  "opencode",
@@ -183,7 +189,7 @@
183
189
  "zod": "^4.6.5"
184
190
  },
185
191
  "devDependencies": {
186
- "@code-yeongyu/senpi": "2026.9.27",
192
+ "@code-yeongyu/senpi": "2026.9.29",
187
193
  "@oh-my-opencode/agents-md-core": "workspace:*",
188
194
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
189
195
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -192,11 +198,11 @@
192
198
  "@oh-my-opencode/delegate-core": "workspace:*",
193
199
  "@oh-my-opencode/git-bash-mcp": "workspace:*",
194
200
  "@oh-my-opencode/hashline-core": "workspace:*",
195
- "@oh-my-opencode/lsp-core": "workspace:*",
196
201
  "@oh-my-opencode/isolation-core": "workspace:*",
197
- "@oh-my-opencode/memory-core": "workspace:*",
202
+ "@oh-my-opencode/lsp-core": "workspace:*",
198
203
  "@oh-my-opencode/mcp-client-core": "workspace:*",
199
204
  "@oh-my-opencode/mcp-stdio-core": "workspace:*",
205
+ "@oh-my-opencode/memory-core": "workspace:*",
200
206
  "@oh-my-opencode/model-core": "workspace:*",
201
207
  "@oh-my-opencode/omo-codex": "workspace:*",
202
208
  "@oh-my-opencode/omo-config-core": "workspace:*",
@@ -205,6 +211,11 @@
205
211
  "@oh-my-opencode/openclaw-core": "workspace:*",
206
212
  "@oh-my-opencode/prompts-core": "workspace:*",
207
213
  "@oh-my-opencode/rules-engine": "workspace:*",
214
+ "@oh-my-opencode/senpi-desktop-engine": "workspace:*",
215
+ "@oh-my-opencode/senpi-desktop-prelude": "workspace:*",
216
+ "@oh-my-opencode/senpi-desktop-protocol": "workspace:*",
217
+ "@oh-my-opencode/senpi-desktop-service": "workspace:*",
218
+ "@oh-my-opencode/senpi-desktop-tool": "workspace:*",
208
219
  "@oh-my-opencode/senpi-task": "workspace:*",
209
220
  "@oh-my-opencode/shared-skills": "workspace:*",
210
221
  "@oh-my-opencode/skills-loader-core": "workspace:*",
@@ -224,18 +235,18 @@
224
235
  "typescript": "^7.0.2"
225
236
  },
226
237
  "optionalDependencies": {
227
- "oh-my-opencode-darwin-arm64": "5.0.1",
228
- "oh-my-opencode-darwin-x64": "5.0.1",
229
- "oh-my-opencode-darwin-x64-baseline": "5.0.1",
230
- "oh-my-opencode-linux-arm64": "5.0.1",
231
- "oh-my-opencode-linux-arm64-musl": "5.0.1",
232
- "oh-my-opencode-linux-x64": "5.0.1",
233
- "oh-my-opencode-linux-x64-baseline": "5.0.1",
234
- "oh-my-opencode-linux-x64-musl": "5.0.1",
235
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.1",
236
- "oh-my-opencode-windows-arm64": "5.0.1",
237
- "oh-my-opencode-windows-x64": "5.0.1",
238
- "oh-my-opencode-windows-x64-baseline": "5.0.1"
238
+ "oh-my-opencode-darwin-arm64": "5.1.1",
239
+ "oh-my-opencode-darwin-x64": "5.1.1",
240
+ "oh-my-opencode-darwin-x64-baseline": "5.1.1",
241
+ "oh-my-opencode-linux-arm64": "5.1.1",
242
+ "oh-my-opencode-linux-arm64-musl": "5.1.1",
243
+ "oh-my-opencode-linux-x64": "5.1.1",
244
+ "oh-my-opencode-linux-x64-baseline": "5.1.1",
245
+ "oh-my-opencode-linux-x64-musl": "5.1.1",
246
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.1",
247
+ "oh-my-opencode-windows-arm64": "5.1.1",
248
+ "oh-my-opencode-windows-x64": "5.1.1",
249
+ "oh-my-opencode-windows-x64-baseline": "5.1.1"
239
250
  },
240
251
  "overrides": {
241
252
  "@earendil-works/pi-agent-core": "0.84.2",