oh-my-opencode 5.0.0 → 5.1.0

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 +41 -376
  2. package/README.ko.md +45 -376
  3. package/README.md +39 -376
  4. package/README.ru.md +50 -368
  5. package/README.zh-cn.md +50 -371
  6. package/dist/cli/index.js +242 -150
  7. package/dist/cli-node/index.js +242 -150
  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 +2367 -2152
  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 +76 -43
  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 +26 -3
  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 +2 -2
  36. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  37. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  39. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ulw-execute-continuation/AGENTS.md +1 -1
  47. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +42 -32
  48. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/ulw-execute-continuation/src/plan-checklist.ts +55 -29
  51. package/packages/omo-codex/plugin/components/ulw-execute-continuation/test/boulder-reader.test.ts +51 -0
  52. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  53. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  75. package/packages/omo-codex/plugin/package-lock.json +12 -12
  76. package/packages/omo-codex/plugin/package.json +1 -1
  77. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  78. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  79. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  80. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  81. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  82. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  83. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  84. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  85. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
  86. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -1
  87. package/packages/omo-codex/scripts/install-dist/install-local.mjs +37 -14
  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-26T16:16:03.756Z"
8
+ "stagedAtUtc": "2026-09-28T19:16:58.447Z"
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,
@@ -3595,11 +3598,6 @@ var init_category_model_requirements = __esm(() => {
3595
3598
  writing: {
3596
3599
  requiresAnyModel: true,
3597
3600
  fallbackChain: [
3598
- {
3599
- providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
3600
- model: "claude-fable-5-1",
3601
- variant: "low"
3602
- },
3603
3601
  {
3604
3602
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
3605
3603
  model: "claude-opus-5-5",
@@ -3940,8 +3938,17 @@ var init_model_resolver = () => {};
3940
3938
  // packages/model-core/src/fallback-chain-from-models.ts
3941
3939
  var init_fallback_chain_from_models = () => {};
3942
3940
 
3941
+ // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
3942
+ var init_runtime_fallback_auto_retry_signal = () => {};
3943
+
3944
+ // packages/model-core/src/runtime-fallback-error-shape.ts
3945
+ var init_runtime_fallback_error_shape = () => {};
3946
+
3947
+ // packages/model-core/src/runtime-fallback-error-classifier.ts
3948
+ var init_runtime_fallback_error_classifier = () => {};
3949
+
3943
3950
  // packages/model-core/src/model-error-classifier.ts
3944
- var RETRYABLE_ERROR_NAMES, STOP_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3951
+ var RETRYABLE_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3945
3952
  var init_model_error_classifier = __esm(() => {
3946
3953
  RETRYABLE_ERROR_NAMES = new Set([
3947
3954
  "providermodelnotfounderror",
@@ -3950,11 +3957,6 @@ var init_model_error_classifier = __esm(() => {
3950
3957
  "providerconnectionerror",
3951
3958
  "authenticationerror"
3952
3959
  ]);
3953
- STOP_ERROR_NAMES = new Set([
3954
- "quotaexceedederror",
3955
- "insufficientcreditserror",
3956
- "freeusagelimiterror"
3957
- ]);
3958
3960
  NON_RETRYABLE_ERROR_NAMES = new Set([
3959
3961
  "messageabortederror",
3960
3962
  "permissiondeniederror",
@@ -3966,15 +3968,6 @@ var init_model_error_classifier = __esm(() => {
3966
3968
  ]);
3967
3969
  });
3968
3970
 
3969
- // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
3970
- var init_runtime_fallback_auto_retry_signal = () => {};
3971
-
3972
- // packages/model-core/src/runtime-fallback-error-shape.ts
3973
- var init_runtime_fallback_error_shape = () => {};
3974
-
3975
- // packages/model-core/src/runtime-fallback-error-classifier.ts
3976
- var init_runtime_fallback_error_classifier = () => {};
3977
-
3978
3971
  // packages/model-core/src/provider-exhaustion-fallback-policy.ts
3979
3972
  var init_provider_exhaustion_fallback_policy = () => {};
3980
3973
 
@@ -5091,7 +5084,7 @@ var init_kimi_categories = __esm(() => {
5091
5084
  KIMI_CATEGORIES = [
5092
5085
  {
5093
5086
  name: "writing",
5094
- config: { model: "anthropic/claude-fable-5-1", variant: "low" },
5087
+ config: { model: "anthropic/claude-opus-5-5", variant: "low" },
5095
5088
  description: "Documentation, prose, technical writing",
5096
5089
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
5097
5090
  }
@@ -69759,6 +69752,29 @@ var init_category = __esm(() => {
69759
69752
  OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
69760
69753
  });
69761
69754
 
69755
+ // packages/omo-config-core/src/schema/computer.ts
69756
+ var positiveInteger, nonNegativeInteger, OmoComputerSettingsLayerSchema, OmoComputerSettingsSchema;
69757
+ var init_computer = __esm(() => {
69758
+ init_zod();
69759
+ positiveInteger = number2().int().positive();
69760
+ nonNegativeInteger = number2().int().nonnegative();
69761
+ OmoComputerSettingsLayerSchema = object({
69762
+ enabled: boolean2().describe("Experimental: register the computer tool in OmO Native sessions (default: on where the host is supported; false leaves it unregistered)"),
69763
+ display: string2().min(1),
69764
+ max_width: positiveInteger,
69765
+ max_height: positiveInteger,
69766
+ screenshot_max_bytes: positiveInteger,
69767
+ stop_hotkey: string2().min(1),
69768
+ allow_host_relay_only_stop: boolean2(),
69769
+ macos_canary: _enum(["session", "off"]),
69770
+ audit_log: object({ enabled: boolean2() }).partial().strict(),
69771
+ screenshot_gc: object({ enabled: boolean2(), stale_ms: nonNegativeInteger, scan_interval_ms: nonNegativeInteger }).partial().strict(),
69772
+ engine_path: string2().min(1),
69773
+ cua_adapter: boolean2()
69774
+ }).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.");
69775
+ OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
69776
+ });
69777
+
69762
69778
  // packages/omo-config-core/src/schema/git-master.ts
69763
69779
  var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
69764
69780
  var init_git_master = __esm(() => {
@@ -70031,11 +70047,11 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
70031
70047
  const record2 = record(string2(), unknown()).parse(input);
70032
70048
  return OmoTaskSettingsSchema.parse({
70033
70049
  ...record2,
70034
- residency_max_children: record2["residency_max_children"] ?? Math.min(DEFAULT_RESIDENCY_MAX_CHILDREN, Math.max(8, resolveParallelism() * 2)),
70050
+ residency_max_children: record2["residency_max_children"] ?? DEFAULT_RESIDENCY_MAX_CHILDREN,
70035
70051
  global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
70036
70052
  });
70037
70053
  }
70038
- var DEFAULT_RESIDENCY_MAX_CHILDREN = 16, ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
70054
+ var DEFAULT_RESIDENCY_MAX_CHILDREN = "unlimited", ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
70039
70055
  var init_task = __esm(() => {
70040
70056
  init_zod();
70041
70057
  ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
@@ -70098,7 +70114,7 @@ var init_task = __esm(() => {
70098
70114
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70099
70115
  model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70100
70116
  max_depth: number2().int().nonnegative().default(1),
70101
- residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
70117
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
70102
70118
  resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
70103
70119
  ttl_ms: number2().int().positive().default(86400000),
70104
70120
  state_dir: string2().optional(),
@@ -70249,6 +70265,7 @@ var init_config = __esm(() => {
70249
70265
  init_zod();
70250
70266
  init_agent();
70251
70267
  init_category();
70268
+ init_computer();
70252
70269
  init_git_master();
70253
70270
  init_memory();
70254
70271
  init_model_catalog();
@@ -70271,6 +70288,7 @@ var init_config = __esm(() => {
70271
70288
  model_profile: string2().optional(),
70272
70289
  memory: OmoMemorySettingsLayerSchema.optional(),
70273
70290
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70291
+ computer: OmoComputerSettingsLayerSchema.optional(),
70274
70292
  disabled_skills: OmoDisabledSkillsSchema.optional()
70275
70293
  }).strict();
70276
70294
  OmoConfigProfileSchema = object({
@@ -70285,6 +70303,7 @@ var init_config = __esm(() => {
70285
70303
  model_profile: string2().optional(),
70286
70304
  memory: OmoMemorySettingsLayerSchema.optional(),
70287
70305
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70306
+ computer: OmoComputerSettingsLayerSchema.optional(),
70288
70307
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70289
70308
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70290
70309
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70304,6 +70323,7 @@ var init_config = __esm(() => {
70304
70323
  model_profile: string2().optional(),
70305
70324
  memory: OmoMemorySettingsSchema.optional(),
70306
70325
  telemetry: OmoTelemetrySettingsSchema.optional(),
70326
+ computer: OmoComputerSettingsSchema.optional(),
70307
70327
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70308
70328
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70309
70329
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70326,6 +70346,7 @@ var init_config = __esm(() => {
70326
70346
  model_profile: string2().optional(),
70327
70347
  memory: OmoMemorySettingsLayerSchema.optional(),
70328
70348
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70349
+ computer: OmoComputerSettingsLayerSchema.optional(),
70329
70350
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70330
70351
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70331
70352
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70465,6 +70486,7 @@ var init_schema = __esm(() => {
70465
70486
  init_task();
70466
70487
  init_team();
70467
70488
  init_telemetry();
70489
+ init_computer();
70468
70490
  });
70469
70491
 
70470
70492
  // packages/omo-config-core/src/loader/disabled-skills.ts
@@ -74155,7 +74177,7 @@ init_shared();
74155
74177
  // package.json
74156
74178
  var package_default = {
74157
74179
  name: "oh-my-opencode",
74158
- version: "5.0.0",
74180
+ version: "5.1.0",
74159
74181
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74160
74182
  main: "./dist/index.js",
74161
74183
  types: "dist/index.d.ts",
@@ -74188,6 +74210,11 @@ var package_default = {
74188
74210
  "packages/omo-codex",
74189
74211
  "packages/omo-senpi",
74190
74212
  "packages/senpi-task",
74213
+ "packages/senpi-desktop-protocol",
74214
+ "packages/senpi-desktop-engine",
74215
+ "packages/senpi-desktop-prelude",
74216
+ "packages/senpi-desktop-service",
74217
+ "packages/senpi-desktop-tool",
74191
74218
  "packages/omo-opencode",
74192
74219
  "packages/omo-native"
74193
74220
  ],
@@ -74289,7 +74316,7 @@ var package_default = {
74289
74316
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
74290
74317
  "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",
74291
74318
  typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
74292
- "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",
74319
+ "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",
74293
74320
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
74294
74321
  test: "bun test --timeout 20000",
74295
74322
  "changelog:section": "bun script/changelog-section.ts",
@@ -74298,7 +74325,8 @@ var package_default = {
74298
74325
  "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",
74299
74326
  "test:windows-codex": "bun run test:codex",
74300
74327
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
74301
- "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build"
74328
+ "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
74329
+ "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"
74302
74330
  },
74303
74331
  keywords: [
74304
74332
  "opencode",
@@ -74338,7 +74366,7 @@ var package_default = {
74338
74366
  zod: "^4.6.5"
74339
74367
  },
74340
74368
  devDependencies: {
74341
- "@code-yeongyu/senpi": "2026.9.26",
74369
+ "@code-yeongyu/senpi": "2026.9.28-7",
74342
74370
  "@oh-my-opencode/agents-md-core": "workspace:*",
74343
74371
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
74344
74372
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -74347,11 +74375,11 @@ var package_default = {
74347
74375
  "@oh-my-opencode/delegate-core": "workspace:*",
74348
74376
  "@oh-my-opencode/git-bash-mcp": "workspace:*",
74349
74377
  "@oh-my-opencode/hashline-core": "workspace:*",
74350
- "@oh-my-opencode/lsp-core": "workspace:*",
74351
74378
  "@oh-my-opencode/isolation-core": "workspace:*",
74352
- "@oh-my-opencode/memory-core": "workspace:*",
74379
+ "@oh-my-opencode/lsp-core": "workspace:*",
74353
74380
  "@oh-my-opencode/mcp-client-core": "workspace:*",
74354
74381
  "@oh-my-opencode/mcp-stdio-core": "workspace:*",
74382
+ "@oh-my-opencode/memory-core": "workspace:*",
74355
74383
  "@oh-my-opencode/model-core": "workspace:*",
74356
74384
  "@oh-my-opencode/omo-codex": "workspace:*",
74357
74385
  "@oh-my-opencode/omo-config-core": "workspace:*",
@@ -74360,6 +74388,11 @@ var package_default = {
74360
74388
  "@oh-my-opencode/openclaw-core": "workspace:*",
74361
74389
  "@oh-my-opencode/prompts-core": "workspace:*",
74362
74390
  "@oh-my-opencode/rules-engine": "workspace:*",
74391
+ "@oh-my-opencode/senpi-desktop-engine": "workspace:*",
74392
+ "@oh-my-opencode/senpi-desktop-prelude": "workspace:*",
74393
+ "@oh-my-opencode/senpi-desktop-protocol": "workspace:*",
74394
+ "@oh-my-opencode/senpi-desktop-service": "workspace:*",
74395
+ "@oh-my-opencode/senpi-desktop-tool": "workspace:*",
74363
74396
  "@oh-my-opencode/senpi-task": "workspace:*",
74364
74397
  "@oh-my-opencode/shared-skills": "workspace:*",
74365
74398
  "@oh-my-opencode/skills-loader-core": "workspace:*",
@@ -74379,18 +74412,18 @@ var package_default = {
74379
74412
  typescript: "^7.0.2"
74380
74413
  },
74381
74414
  optionalDependencies: {
74382
- "oh-my-opencode-darwin-arm64": "5.0.0",
74383
- "oh-my-opencode-darwin-x64": "5.0.0",
74384
- "oh-my-opencode-darwin-x64-baseline": "5.0.0",
74385
- "oh-my-opencode-linux-arm64": "5.0.0",
74386
- "oh-my-opencode-linux-arm64-musl": "5.0.0",
74387
- "oh-my-opencode-linux-x64": "5.0.0",
74388
- "oh-my-opencode-linux-x64-baseline": "5.0.0",
74389
- "oh-my-opencode-linux-x64-musl": "5.0.0",
74390
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0",
74391
- "oh-my-opencode-windows-arm64": "5.0.0",
74392
- "oh-my-opencode-windows-x64": "5.0.0",
74393
- "oh-my-opencode-windows-x64-baseline": "5.0.0"
74415
+ "oh-my-opencode-darwin-arm64": "5.1.0",
74416
+ "oh-my-opencode-darwin-x64": "5.1.0",
74417
+ "oh-my-opencode-darwin-x64-baseline": "5.1.0",
74418
+ "oh-my-opencode-linux-arm64": "5.1.0",
74419
+ "oh-my-opencode-linux-arm64-musl": "5.1.0",
74420
+ "oh-my-opencode-linux-x64": "5.1.0",
74421
+ "oh-my-opencode-linux-x64-baseline": "5.1.0",
74422
+ "oh-my-opencode-linux-x64-musl": "5.1.0",
74423
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.0",
74424
+ "oh-my-opencode-windows-arm64": "5.1.0",
74425
+ "oh-my-opencode-windows-x64": "5.1.0",
74426
+ "oh-my-opencode-windows-x64-baseline": "5.1.0"
74394
74427
  },
74395
74428
  overrides: {
74396
74429
  "@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.0",
3
+ "version": "5.1.0",
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.26",
192
+ "@code-yeongyu/senpi": "2026.9.28-7",
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.0",
228
- "oh-my-opencode-darwin-x64": "5.0.0",
229
- "oh-my-opencode-darwin-x64-baseline": "5.0.0",
230
- "oh-my-opencode-linux-arm64": "5.0.0",
231
- "oh-my-opencode-linux-arm64-musl": "5.0.0",
232
- "oh-my-opencode-linux-x64": "5.0.0",
233
- "oh-my-opencode-linux-x64-baseline": "5.0.0",
234
- "oh-my-opencode-linux-x64-musl": "5.0.0",
235
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0",
236
- "oh-my-opencode-windows-arm64": "5.0.0",
237
- "oh-my-opencode-windows-x64": "5.0.0",
238
- "oh-my-opencode-windows-x64-baseline": "5.0.0"
238
+ "oh-my-opencode-darwin-arm64": "5.1.0",
239
+ "oh-my-opencode-darwin-x64": "5.1.0",
240
+ "oh-my-opencode-darwin-x64-baseline": "5.1.0",
241
+ "oh-my-opencode-linux-arm64": "5.1.0",
242
+ "oh-my-opencode-linux-arm64-musl": "5.1.0",
243
+ "oh-my-opencode-linux-x64": "5.1.0",
244
+ "oh-my-opencode-linux-x64-baseline": "5.1.0",
245
+ "oh-my-opencode-linux-x64-musl": "5.1.0",
246
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.0",
247
+ "oh-my-opencode-windows-arm64": "5.1.0",
248
+ "oh-my-opencode-windows-x64": "5.1.0",
249
+ "oh-my-opencode-windows-x64-baseline": "5.1.0"
239
250
  },
240
251
  "overrides": {
241
252
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -182,6 +182,9 @@ function handleNotification(message) {
182
182
  }
183
183
  if (message.method === "textDocument/didOpen") {
184
184
  applyPublishSteps("didOpen", message.params.textDocument.uri, message.params.textDocument.version);
185
+ if (scenario.unscopedApplyEditOnDidOpen) {
186
+ sendApplyEdit(scenario.unscopedApplyEditOnDidOpen, { kind: "unscoped" });
187
+ }
185
188
  }
186
189
  if (message.method === "textDocument/didChange" && Array.isArray(scenario.diagnostics)) {
187
190
  send({
@@ -7,6 +7,7 @@ import {
7
7
  readEvents,
8
8
  renameTextEdit,
9
9
  waitForEventCount,
10
+ waitForEventCountBySubscription,
10
11
  } from "./workspace-apply-edit-test-support.js";
11
12
 
12
13
  const harness = createWorkspaceEditTestHarness();
@@ -17,13 +18,16 @@ afterEach(async () => {
17
18
 
18
19
  describe("LspClient workspace mutation lease", () => {
19
20
  it("#given no mutating request #when the server calls applyEdit #then the request is rejected as unscoped", async () => {
20
- const context = await harness.makeClient({ unscopedApplyEdit: renameTextEdit("before", "after", { version: 1 }) });
21
-
22
- const responses = await waitForEventCount(
21
+ const context = await harness.makeClient({
22
+ unscopedApplyEditOnDidOpen: renameTextEdit("before", "after", { version: 1 }),
23
+ });
24
+ const response = waitForEventCountBySubscription(
23
25
  context.events,
24
26
  (event) => event.type === "clientResponse" && event.method === "workspace/applyEdit",
25
27
  1,
26
28
  );
29
+ await context.client.openFile(context.source);
30
+ const responses = await response;
27
31
 
28
32
  expect(responses[0]?.result).toEqual({
29
33
  applied: false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",