oh-my-opencode 5.0.1 → 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 (95) 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 +241 -144
  7. package/dist/cli-node/index.js +241 -144
  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 +2366 -2146
  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 +75 -37
  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/scripts/install-dist/install-local.mjs +37 -14
  87. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  88. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  89. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  90. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  91. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  92. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  93. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  94. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  95. 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-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,
@@ -3935,8 +3938,17 @@ var init_model_resolver = () => {};
3935
3938
  // packages/model-core/src/fallback-chain-from-models.ts
3936
3939
  var init_fallback_chain_from_models = () => {};
3937
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
+
3938
3950
  // packages/model-core/src/model-error-classifier.ts
3939
- var RETRYABLE_ERROR_NAMES, STOP_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3951
+ var RETRYABLE_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
3940
3952
  var init_model_error_classifier = __esm(() => {
3941
3953
  RETRYABLE_ERROR_NAMES = new Set([
3942
3954
  "providermodelnotfounderror",
@@ -3945,11 +3957,6 @@ var init_model_error_classifier = __esm(() => {
3945
3957
  "providerconnectionerror",
3946
3958
  "authenticationerror"
3947
3959
  ]);
3948
- STOP_ERROR_NAMES = new Set([
3949
- "quotaexceedederror",
3950
- "insufficientcreditserror",
3951
- "freeusagelimiterror"
3952
- ]);
3953
3960
  NON_RETRYABLE_ERROR_NAMES = new Set([
3954
3961
  "messageabortederror",
3955
3962
  "permissiondeniederror",
@@ -3961,15 +3968,6 @@ var init_model_error_classifier = __esm(() => {
3961
3968
  ]);
3962
3969
  });
3963
3970
 
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
3971
  // packages/model-core/src/provider-exhaustion-fallback-policy.ts
3974
3972
  var init_provider_exhaustion_fallback_policy = () => {};
3975
3973
 
@@ -69754,6 +69752,29 @@ var init_category = __esm(() => {
69754
69752
  OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
69755
69753
  });
69756
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
+
69757
69778
  // packages/omo-config-core/src/schema/git-master.ts
69758
69779
  var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
69759
69780
  var init_git_master = __esm(() => {
@@ -70026,11 +70047,11 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
70026
70047
  const record2 = record(string2(), unknown()).parse(input);
70027
70048
  return OmoTaskSettingsSchema.parse({
70028
70049
  ...record2,
70029
- 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,
70030
70051
  global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
70031
70052
  });
70032
70053
  }
70033
- 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;
70034
70055
  var init_task = __esm(() => {
70035
70056
  init_zod();
70036
70057
  ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
@@ -70093,7 +70114,7 @@ var init_task = __esm(() => {
70093
70114
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70094
70115
  model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
70095
70116
  max_depth: number2().int().nonnegative().default(1),
70096
- residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
70117
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
70097
70118
  resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
70098
70119
  ttl_ms: number2().int().positive().default(86400000),
70099
70120
  state_dir: string2().optional(),
@@ -70244,6 +70265,7 @@ var init_config = __esm(() => {
70244
70265
  init_zod();
70245
70266
  init_agent();
70246
70267
  init_category();
70268
+ init_computer();
70247
70269
  init_git_master();
70248
70270
  init_memory();
70249
70271
  init_model_catalog();
@@ -70266,6 +70288,7 @@ var init_config = __esm(() => {
70266
70288
  model_profile: string2().optional(),
70267
70289
  memory: OmoMemorySettingsLayerSchema.optional(),
70268
70290
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70291
+ computer: OmoComputerSettingsLayerSchema.optional(),
70269
70292
  disabled_skills: OmoDisabledSkillsSchema.optional()
70270
70293
  }).strict();
70271
70294
  OmoConfigProfileSchema = object({
@@ -70280,6 +70303,7 @@ var init_config = __esm(() => {
70280
70303
  model_profile: string2().optional(),
70281
70304
  memory: OmoMemorySettingsLayerSchema.optional(),
70282
70305
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70306
+ computer: OmoComputerSettingsLayerSchema.optional(),
70283
70307
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70284
70308
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70285
70309
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70299,6 +70323,7 @@ var init_config = __esm(() => {
70299
70323
  model_profile: string2().optional(),
70300
70324
  memory: OmoMemorySettingsSchema.optional(),
70301
70325
  telemetry: OmoTelemetrySettingsSchema.optional(),
70326
+ computer: OmoComputerSettingsSchema.optional(),
70302
70327
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70303
70328
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70304
70329
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70321,6 +70346,7 @@ var init_config = __esm(() => {
70321
70346
  model_profile: string2().optional(),
70322
70347
  memory: OmoMemorySettingsLayerSchema.optional(),
70323
70348
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
70349
+ computer: OmoComputerSettingsLayerSchema.optional(),
70324
70350
  disabled_skills: OmoDisabledSkillsSchema.optional(),
70325
70351
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
70326
70352
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -70460,6 +70486,7 @@ var init_schema = __esm(() => {
70460
70486
  init_task();
70461
70487
  init_team();
70462
70488
  init_telemetry();
70489
+ init_computer();
70463
70490
  });
70464
70491
 
70465
70492
  // packages/omo-config-core/src/loader/disabled-skills.ts
@@ -74150,7 +74177,7 @@ init_shared();
74150
74177
  // package.json
74151
74178
  var package_default = {
74152
74179
  name: "oh-my-opencode",
74153
- version: "5.0.1",
74180
+ version: "5.1.0",
74154
74181
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74155
74182
  main: "./dist/index.js",
74156
74183
  types: "dist/index.d.ts",
@@ -74183,6 +74210,11 @@ var package_default = {
74183
74210
  "packages/omo-codex",
74184
74211
  "packages/omo-senpi",
74185
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",
74186
74218
  "packages/omo-opencode",
74187
74219
  "packages/omo-native"
74188
74220
  ],
@@ -74284,7 +74316,7 @@ var package_default = {
74284
74316
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
74285
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",
74286
74318
  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",
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",
74288
74320
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
74289
74321
  test: "bun test --timeout 20000",
74290
74322
  "changelog:section": "bun script/changelog-section.ts",
@@ -74293,7 +74325,8 @@ var package_default = {
74293
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",
74294
74326
  "test:windows-codex": "bun run test:codex",
74295
74327
  "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"
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"
74297
74330
  },
74298
74331
  keywords: [
74299
74332
  "opencode",
@@ -74333,7 +74366,7 @@ var package_default = {
74333
74366
  zod: "^4.6.5"
74334
74367
  },
74335
74368
  devDependencies: {
74336
- "@code-yeongyu/senpi": "2026.9.27",
74369
+ "@code-yeongyu/senpi": "2026.9.28-7",
74337
74370
  "@oh-my-opencode/agents-md-core": "workspace:*",
74338
74371
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
74339
74372
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -74342,11 +74375,11 @@ var package_default = {
74342
74375
  "@oh-my-opencode/delegate-core": "workspace:*",
74343
74376
  "@oh-my-opencode/git-bash-mcp": "workspace:*",
74344
74377
  "@oh-my-opencode/hashline-core": "workspace:*",
74345
- "@oh-my-opencode/lsp-core": "workspace:*",
74346
74378
  "@oh-my-opencode/isolation-core": "workspace:*",
74347
- "@oh-my-opencode/memory-core": "workspace:*",
74379
+ "@oh-my-opencode/lsp-core": "workspace:*",
74348
74380
  "@oh-my-opencode/mcp-client-core": "workspace:*",
74349
74381
  "@oh-my-opencode/mcp-stdio-core": "workspace:*",
74382
+ "@oh-my-opencode/memory-core": "workspace:*",
74350
74383
  "@oh-my-opencode/model-core": "workspace:*",
74351
74384
  "@oh-my-opencode/omo-codex": "workspace:*",
74352
74385
  "@oh-my-opencode/omo-config-core": "workspace:*",
@@ -74355,6 +74388,11 @@ var package_default = {
74355
74388
  "@oh-my-opencode/openclaw-core": "workspace:*",
74356
74389
  "@oh-my-opencode/prompts-core": "workspace:*",
74357
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:*",
74358
74396
  "@oh-my-opencode/senpi-task": "workspace:*",
74359
74397
  "@oh-my-opencode/shared-skills": "workspace:*",
74360
74398
  "@oh-my-opencode/skills-loader-core": "workspace:*",
@@ -74374,18 +74412,18 @@ var package_default = {
74374
74412
  typescript: "^7.0.2"
74375
74413
  },
74376
74414
  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"
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"
74389
74427
  },
74390
74428
  overrides: {
74391
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.1",
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.27",
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.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.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.1",
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",