oh-my-opencode-slim 2.2.1 → 2.2.3
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.
- package/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.md +16 -4
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +36 -40
- package/dist/cli/system.d.ts +2 -2
- package/dist/config/constants.d.ts +0 -1
- package/dist/config/schema.d.ts +3 -0
- package/dist/council/council-manager.d.ts +1 -3
- package/dist/hooks/phase-reminder/index.d.ts +6 -2
- package/dist/hooks/post-file-tool-nudge/index.d.ts +3 -5
- package/dist/hooks/session-lifecycle.d.ts +0 -1
- package/dist/hooks/task-session-manager/index.d.ts +3 -0
- package/dist/hooks/task-session-manager/pending-call-tracker.d.ts +2 -0
- package/dist/hooks/types.d.ts +1 -0
- package/dist/index-event.d.ts +17 -0
- package/dist/index.js +573 -229
- package/dist/multiplexer/index.d.ts +1 -0
- package/dist/multiplexer/kitty/index.d.ts +58 -0
- package/dist/multiplexer/shared.d.ts +28 -0
- package/dist/multiplexer/types.d.ts +2 -2
- package/dist/tui.js +1 -1
- package/dist/utils/background-job-board.d.ts +1 -1
- package/oh-my-opencode-slim.schema.json +1 -0
- package/package.json +2 -1
- package/src/skills/deepwork/SKILL.md +2 -0
- package/dist/utils/subagent-depth.d.ts +0 -35
package/README.ja-JP.md
CHANGED
|
@@ -35,7 +35,7 @@ oh-my-opencode-slim は OpenCode 向けのエージェントオーケストレ
|
|
|
35
35
|
- **[同梱スキル](#skills)** - `deepwork`、`codemap`、`verification-planning`、`reflect` などのプロンプトベースのワークフローを、エージェントごとに割り当てます。
|
|
36
36
|
- **[Council](docs/council.md)** - `@council` で同じ質問を複数モデルに並列で投げ、1 つの回答に統合します。
|
|
37
37
|
- **[Companion](docs/companion.md)** - 並列のバックグラウンド専門家を含む、稼働中のエージェントを表示する任意のフローティングデスクトップウィンドウです。
|
|
38
|
-
- **[マルチプレクサー統合](docs/multiplexer-integration.md)** - Tmux、Zellij、Herdr、cmux のペインでエージェントの作業をライブ表示します。
|
|
38
|
+
- **[マルチプレクサー統合](docs/multiplexer-integration.md)** - Tmux、Zellij、Herdr、cmux、kitty のペインでエージェントの作業をライブ表示します。
|
|
39
39
|
- **[プリセット切り替え](docs/preset-switching.md)** - `/preset` でチーム全体のモデルを実行時に切り替えます。
|
|
40
40
|
- **[コードインテリジェンスツール](docs/tools.md)** - 25 言語対応の LSP、AST 対応検索、Web 検索・ドキュメント・GitHub コード検索用の組み込み MCP を提供します。
|
|
41
41
|
- **[完全にカスタマイズ可能](docs/configuration.md)** - カスタムエージェント、プロンプト上書き、エージェントごとのスキル/MCP 権限、[プロジェクトローカルのカスタマイズ](docs/project-local-customization.md)に対応します。
|
|
@@ -143,7 +143,7 @@ bun run build
|
|
|
143
143
|
> バックグラウンドオーケストレーションの仕組みを理解しておくことを**推奨**します。**[Orchestrator のプロンプト](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** には、スケジューラーのルール、専門エージェントへのルーティングロジック、作業をバックグラウンドエージェントへ割り当てるしきい値が記述されています。`@agentName <task>` のようにサブエージェントを呼び出すことで、いつでも手動で委譲できます。
|
|
144
144
|
|
|
145
145
|
> [!TIP]
|
|
146
|
-
> バックグラウンドエージェントが現在のデフォルトワークフローになっているため、**[Multiplexer Integration](docs/multiplexer-integration.md)** を有効化して設定することを**強く推奨**します。各エージェントが専用の Tmux、Zellij、Herdr
|
|
146
|
+
> バックグラウンドエージェントが現在のデフォルトワークフローになっているため、**[Multiplexer Integration](docs/multiplexer-integration.md)** を有効化して設定することを**強く推奨**します。各エージェントが専用の Tmux、Zellij、Herdr、cmux、または kitty ペインで自動的に開かれるため、Orchestrator がセッションを調整し続けている間も、専門エージェントの作業をリアルタイムで追えます。
|
|
147
147
|
|
|
148
148
|
デフォルトで生成される設定には `openai` と `opencode-go` の両方のプリセットが含まれます。
|
|
149
149
|
|
|
@@ -607,7 +607,7 @@ bunx oh-my-opencode-slim@latest install --companion=yes
|
|
|
607
607
|
| **[Council](docs/council.md)** | 複数のモデルを並列実行し、`@council` で 1 つの回答に統合します |
|
|
608
608
|
| **[Custom Agents](docs/configuration.md#custom-agents)** | カスタムプロンプト、モデル、MCP アクセス、Orchestrator の委譲ルールを備えた独自の専門エージェントを定義します |
|
|
609
609
|
| **[ACP Agents](docs/acp-agents.md)** | Claude Code ACP や Gemini ACP などの外部 ACP 互換エージェントを委譲可能なサブエージェントとして接続します |
|
|
610
|
-
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | エージェントの動作を Tmux、Zellij、Herdr
|
|
610
|
+
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | エージェントの動作を Tmux、Zellij、Herdr、cmux、や kitty のペインでライブ表示します |
|
|
611
611
|
| **[Codemap](docs/codemap.md)** | 階層的なコードマップを生成し、大規模コードベースを迅速に理解します |
|
|
612
612
|
| **[Clonedeps](docs/clonedeps.md)** | 選択した依存関係のソースを ignore 済みのローカルワークスペースにクローンし、調査できるようにします |
|
|
613
613
|
| **[Worktrees](docs/worktrees.md)** | `.slim/worktrees/` lane を使い、隔離された並列または高リスクなコーディング作業を行います |
|
package/README.ko-KR.md
CHANGED
|
@@ -44,7 +44,7 @@ oh-my-opencode-slim은 OpenCode용 에이전트 오케스트레이션 플러그
|
|
|
44
44
|
- **[Companion](docs/companion.md)** - 병렬 백그라운드 전문 에이전트를 포함해
|
|
45
45
|
활성 에이전트를 보여 주는 선택적 플로팅 데스크톱 창입니다.
|
|
46
46
|
- **[멀티플렉서 통합](docs/multiplexer-integration.md)** - Tmux, Zellij,
|
|
47
|
-
Herdr 또는
|
|
47
|
+
Herdr, cmux, 또는 kitty 페인에서 에이전트 작업을 실시간으로 확인합니다.
|
|
48
48
|
- **[프리셋 전환](docs/preset-switching.md)** - `/preset`으로 실행 중에 팀 전체의
|
|
49
49
|
모델을 교체합니다.
|
|
50
50
|
- **[코드 인텔리전스 도구](docs/tools.md)** - 25개 언어를 지원하는 LSP 도구와
|
|
@@ -154,7 +154,7 @@ bun run build
|
|
|
154
154
|
> 자동 위임이 어떻게 동작하는지 이해하는 것을 **권장**합니다. **[Orchestrator 프롬프트](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** 에는 위임 규칙, 전문 에이전트 라우팅 로직, 메인 에이전트가 언제 서브에이전트로 작업을 넘겨야 하는지에 대한 임계값이 포함되어 있습니다. 수동으로 위임하려면 `@agentName <task>`로 서브에이전트를 호출하면 됩니다.
|
|
155
155
|
|
|
156
156
|
> [!TIP]
|
|
157
|
-
> 이제 백그라운드 에이전트가 기본 워크플로이므로 **[Multiplexer Integration](docs/multiplexer-integration.md)** 을 활성화하고 설정하는 것을 **강력히 권장**합니다. 각 에이전트를 전용 Tmux, Zellij, Herdr 또는
|
|
157
|
+
> 이제 백그라운드 에이전트가 기본 워크플로이므로 **[Multiplexer Integration](docs/multiplexer-integration.md)** 을 활성화하고 설정하는 것을 **강력히 권장**합니다. 각 에이전트를 전용 Tmux, Zellij, Herdr, cmux, 또는 kitty 창에서 자동으로 열어 주기 때문에, Orchestrator가 세션을 계속 조율하는 동안 전문 에이전트들의 작업을 실시간으로 따라볼 수 있습니다.
|
|
158
158
|
|
|
159
159
|
기본 생성 설정에는 `openai`와 `opencode-go` 프리셋이 모두 포함되어 있습니다.
|
|
160
160
|
|
|
@@ -628,7 +628,7 @@ bunx oh-my-opencode-slim@latest install --companion=yes
|
|
|
628
628
|
| **[Council](docs/council.md)** | `@council`로 여러 모델을 병렬 실행하고 하나의 답변으로 종합 |
|
|
629
629
|
| **[Custom Agents](docs/configuration.md#custom-agents)** | 커스텀 프롬프트, 모델, MCP 접근, Orchestrator 위임 규칙으로 커스텀 전문 에이전트 정의 |
|
|
630
630
|
| **[ACP Agents](docs/acp-agents.md)** | Claude Code ACP 또는 Gemini ACP 같은 외부 ACP 호환 에이전트를 위임 가능한 서브에이전트로 연결 |
|
|
631
|
-
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | Tmux, Zellij, Herdr 또는
|
|
631
|
+
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | Tmux, Zellij, Herdr, cmux, 또는 kitty 페인에서 에이전트 작업을 실시간으로 확인 |
|
|
632
632
|
| **[Codemap](docs/codemap.md)** | 계층형 코드맵을 생성하여 대규모 코드베이스를 빠르게 파악 |
|
|
633
633
|
| **[Clonedeps](docs/clonedeps.md)** | 선택한 의존성 소스를 무시된 로컬 워크스페이스에 복제하여 검사 |
|
|
634
634
|
| **[Worktrees](docs/worktrees.md)** | `.slim/worktrees/` lane을 사용해 격리된 병렬 또는 고위험 코딩 작업 수행 |
|
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ The main idea is simple: instead of forcing one model to do everything, the plug
|
|
|
43
43
|
- **[Companion](docs/companion.md)** - an optional floating desktop window
|
|
44
44
|
showing which agents are active, including parallel background specialists.
|
|
45
45
|
- **[Multiplexer integration](docs/multiplexer-integration.md)** - watch agents
|
|
46
|
-
work live in Tmux, Zellij, Herdr, or
|
|
46
|
+
work live in Tmux, Zellij, Herdr, cmux, or kitty panes.
|
|
47
47
|
- **[Preset switching](docs/preset-switching.md)** - swap the whole team's
|
|
48
48
|
models at runtime with `/preset`.
|
|
49
49
|
- **[Code intelligence tools](docs/tools.md)** - LSP tools, AST-aware search
|
|
@@ -101,6 +101,13 @@ Install and configure oh-my-opencode-slim: https://raw.githubusercontent.com/alv
|
|
|
101
101
|
bunx oh-my-opencode-slim@latest install
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
+
The published CLI is a Node-compatible bundle, so `npx` works too if you don't
|
|
105
|
+
have Bun installed:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx oh-my-opencode-slim@latest install
|
|
109
|
+
```
|
|
110
|
+
|
|
104
111
|
### Run from Master
|
|
105
112
|
|
|
106
113
|
Use this if you want the latest code, easier bug fixes, or a local setup for
|
|
@@ -155,7 +162,7 @@ Then:
|
|
|
155
162
|
> It's **recommended** to understand how background orchestration works. The **[Orchestrator prompt](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** contains the scheduler rules, specialist routing logic, and thresholds for when work should be assigned to background agents. You can always delegate manually by calling a subagent via: `@agentName <task>`
|
|
156
163
|
|
|
157
164
|
> [!TIP]
|
|
158
|
-
> Because background agents are now the default workflow, it is **highly recommended** to enable and configure **[Multiplexer Integration](docs/multiplexer-integration.md)**. It automatically opens each agent in a dedicated Tmux, Zellij, Herdr, or
|
|
165
|
+
> Because background agents are now the default workflow, it is **highly recommended** to enable and configure **[Multiplexer Integration](docs/multiplexer-integration.md)**. It automatically opens each agent in a dedicated Tmux, Zellij, Herdr, cmux, or kitty pane, so you can watch specialists work live while the Orchestrator continues coordinating the session.
|
|
159
166
|
|
|
160
167
|
The default generated configuration includes both `openai` and `opencode-go` presets.
|
|
161
168
|
|
|
@@ -631,7 +638,7 @@ Use this section as a map: start with installation, then jump to features, confi
|
|
|
631
638
|
| **[Council](docs/council.md)** | Run multiple models in parallel and synthesize a single answer with `@council` |
|
|
632
639
|
| **[Custom Agents](docs/configuration.md#custom-agents)** | Define your own specialists with custom prompts, models, MCP access, and Orchestrator delegation rules |
|
|
633
640
|
| **[ACP Agents](docs/acp-agents.md)** | Connect external ACP-compatible agents such as Claude Code ACP or Gemini ACP as delegatable subagents |
|
|
634
|
-
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | Watch agents work live in Tmux, Zellij, Herdr, or
|
|
641
|
+
| **[Multiplexer Integration](docs/multiplexer-integration.md)** | Watch agents work live in Tmux, Zellij, Herdr, cmux, or kitty panes |
|
|
635
642
|
| **[Codemap](docs/codemap.md)** | Generate hierarchical codemaps to understand large codebases faster |
|
|
636
643
|
| **[Clonedeps](docs/clonedeps.md)** | Clone selected dependency source into an ignored local workspace for inspection |
|
|
637
644
|
| **[Worktrees](docs/worktrees.md)** | Use `.slim/worktrees/` lanes for isolated parallel or risky coding work |
|
|
@@ -661,7 +668,7 @@ Use this section as a map: start with installation, then jump to features, confi
|
|
|
661
668
|
<p><sub>Every merged contribution leaves a mark on the realm.</sub></p>
|
|
662
669
|
|
|
663
670
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
664
|
-
[](#contributors-)
|
|
665
672
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
666
673
|
</div>
|
|
667
674
|
|
|
@@ -773,6 +780,11 @@ Use this section as a map: start with installation, then jump to features, confi
|
|
|
773
780
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/umi008"><img src="https://avatars.githubusercontent.com/u/200843810?v=4?s=100" width="100px;" alt="Ulises Millán"/><br /><sub><b>Ulises Millán</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=umi008" title="Code">💻</a></td>
|
|
774
781
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HighColdHC"><img src="https://avatars.githubusercontent.com/u/35870222?v=4?s=100" width="100px;" alt="HighColdHC"/><br /><sub><b>HighColdHC</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=HighColdHC" title="Code">💻</a></td>
|
|
775
782
|
<td align="center" valign="top" width="16.66%"><a href="https://hardcore.engineer/about"><img src="https://avatars.githubusercontent.com/u/401815?v=4?s=100" width="100px;" alt="Stephan Schielke"/><br /><sub><b>Stephan Schielke</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=stephanschielke" title="Code">💻</a></td>
|
|
783
|
+
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DanMaly"><img src="https://avatars.githubusercontent.com/u/69809112?v=4?s=100" width="100px;" alt="Daniel Maly"/><br /><sub><b>Daniel Maly</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=DanMaly" title="Code">💻</a></td>
|
|
784
|
+
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Chewji9875"><img src="https://avatars.githubusercontent.com/u/126886556?v=4?s=100" width="100px;" alt="Chewji"/><br /><sub><b>Chewji</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=Chewji9875" title="Code">💻</a></td>
|
|
785
|
+
</tr>
|
|
786
|
+
<tr>
|
|
787
|
+
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DanielMaly"><img src="https://avatars.githubusercontent.com/u/1443921?v=4?s=100" width="100px;" alt="Daniel Maly"/><br /><sub><b>Daniel Maly</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=DanielMaly" title="Code">💻</a></td>
|
|
776
788
|
</tr>
|
|
777
789
|
</tbody>
|
|
778
790
|
</table>
|
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
// @bun
|
|
1
|
+
#!/usr/bin/env node
|
|
3
2
|
import { createRequire } from "node:module";
|
|
4
3
|
var __defProp = Object.defineProperty;
|
|
5
4
|
var __returnValue = (v) => v;
|
|
@@ -468,6 +467,7 @@ var MultiplexerTypeSchema = z2.enum([
|
|
|
468
467
|
"tmux",
|
|
469
468
|
"zellij",
|
|
470
469
|
"herdr",
|
|
470
|
+
"kitty",
|
|
471
471
|
"cmux",
|
|
472
472
|
"none"
|
|
473
473
|
]);
|
|
@@ -2924,12 +2924,13 @@ init_compat();
|
|
|
2924
2924
|
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
2925
2925
|
import { statSync as statSync4 } from "node:fs";
|
|
2926
2926
|
var cachedOpenCodePath = null;
|
|
2927
|
-
function resolvePathCommand(command) {
|
|
2927
|
+
function resolvePathCommand(command, environment = process.env) {
|
|
2928
2928
|
try {
|
|
2929
2929
|
const resolver = process.platform === "win32" ? "where" : "which";
|
|
2930
2930
|
const result = spawnSync2(resolver, [command], {
|
|
2931
2931
|
encoding: "utf-8",
|
|
2932
|
-
stdio: ["ignore", "pipe", "ignore"]
|
|
2932
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
2933
|
+
env: environment
|
|
2933
2934
|
});
|
|
2934
2935
|
if (result.status !== 0) {
|
|
2935
2936
|
return null;
|
|
@@ -2940,18 +2941,19 @@ function resolvePathCommand(command) {
|
|
|
2940
2941
|
return null;
|
|
2941
2942
|
}
|
|
2942
2943
|
}
|
|
2943
|
-
function canExecute(command, args) {
|
|
2944
|
+
function canExecute(command, args, environment = process.env) {
|
|
2944
2945
|
try {
|
|
2945
2946
|
const result = spawnSync2(command, args, {
|
|
2946
|
-
stdio: "ignore"
|
|
2947
|
+
stdio: "ignore",
|
|
2948
|
+
env: environment
|
|
2947
2949
|
});
|
|
2948
2950
|
return result.status === 0;
|
|
2949
2951
|
} catch {
|
|
2950
2952
|
return false;
|
|
2951
2953
|
}
|
|
2952
2954
|
}
|
|
2953
|
-
function getOpenCodePaths() {
|
|
2954
|
-
const home =
|
|
2955
|
+
function getOpenCodePaths(environment = process.env) {
|
|
2956
|
+
const home = environment.HOME || environment.USERPROFILE || "";
|
|
2955
2957
|
return [
|
|
2956
2958
|
"opencode",
|
|
2957
2959
|
`${home}/.local/bin/opencode`,
|
|
@@ -2981,50 +2983,53 @@ function getOpenCodePaths() {
|
|
|
2981
2983
|
`${home}/.pnpm-global/bin/opencode`
|
|
2982
2984
|
];
|
|
2983
2985
|
}
|
|
2984
|
-
function resolveOpenCodePath() {
|
|
2985
|
-
|
|
2986
|
+
function resolveOpenCodePath(environment = process.env) {
|
|
2987
|
+
const useCache = environment === process.env;
|
|
2988
|
+
if (useCache && cachedOpenCodePath) {
|
|
2986
2989
|
return cachedOpenCodePath;
|
|
2987
2990
|
}
|
|
2988
|
-
const pathOpenCodePath = resolvePathCommand("opencode");
|
|
2991
|
+
const pathOpenCodePath = resolvePathCommand("opencode", environment);
|
|
2989
2992
|
if (pathOpenCodePath) {
|
|
2990
|
-
|
|
2993
|
+
if (useCache) {
|
|
2994
|
+
cachedOpenCodePath = pathOpenCodePath;
|
|
2995
|
+
}
|
|
2991
2996
|
return pathOpenCodePath;
|
|
2992
2997
|
}
|
|
2993
|
-
const paths = getOpenCodePaths();
|
|
2998
|
+
const paths = getOpenCodePaths(environment);
|
|
2994
2999
|
for (const opencodePath of paths) {
|
|
2995
3000
|
if (opencodePath === "opencode")
|
|
2996
3001
|
continue;
|
|
2997
3002
|
try {
|
|
2998
3003
|
const stat = statSync4(opencodePath);
|
|
2999
3004
|
if (stat.isFile()) {
|
|
3000
|
-
|
|
3005
|
+
if (useCache) {
|
|
3006
|
+
cachedOpenCodePath = opencodePath;
|
|
3007
|
+
}
|
|
3001
3008
|
return opencodePath;
|
|
3002
3009
|
}
|
|
3003
3010
|
} catch {}
|
|
3004
3011
|
}
|
|
3005
3012
|
return "opencode";
|
|
3006
3013
|
}
|
|
3007
|
-
async function isOpenCodeInstalled() {
|
|
3008
|
-
const
|
|
3009
|
-
|
|
3010
|
-
|
|
3014
|
+
async function isOpenCodeInstalled(environment = process.env) {
|
|
3015
|
+
const useCache = environment === process.env;
|
|
3016
|
+
const pathOpenCodePath = resolvePathCommand("opencode", environment);
|
|
3017
|
+
if (pathOpenCodePath && canExecute(pathOpenCodePath, ["--version"], environment)) {
|
|
3018
|
+
if (useCache) {
|
|
3019
|
+
cachedOpenCodePath = pathOpenCodePath;
|
|
3020
|
+
}
|
|
3011
3021
|
return true;
|
|
3012
3022
|
}
|
|
3013
|
-
const paths = getOpenCodePaths();
|
|
3023
|
+
const paths = getOpenCodePaths(environment);
|
|
3014
3024
|
for (const opencodePath of paths) {
|
|
3015
3025
|
if (opencodePath === "opencode")
|
|
3016
3026
|
continue;
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
stdout: "pipe",
|
|
3020
|
-
stderr: "pipe"
|
|
3021
|
-
});
|
|
3022
|
-
await proc.exited;
|
|
3023
|
-
if (proc.exitCode === 0) {
|
|
3027
|
+
if (canExecute(opencodePath, ["--version"], environment)) {
|
|
3028
|
+
if (useCache) {
|
|
3024
3029
|
cachedOpenCodePath = opencodePath;
|
|
3025
|
-
return true;
|
|
3026
3030
|
}
|
|
3027
|
-
|
|
3031
|
+
return true;
|
|
3032
|
+
}
|
|
3028
3033
|
}
|
|
3029
3034
|
return false;
|
|
3030
3035
|
}
|
|
@@ -3437,15 +3442,6 @@ async function install(args) {
|
|
|
3437
3442
|
return runInstall(config);
|
|
3438
3443
|
}
|
|
3439
3444
|
|
|
3440
|
-
// src/cli/providers.ts
|
|
3441
|
-
var GENERATED_PRESETS2 = ["openai", "opencode-go"];
|
|
3442
|
-
function isGeneratedPresetName2(value) {
|
|
3443
|
-
return GENERATED_PRESETS2.includes(value);
|
|
3444
|
-
}
|
|
3445
|
-
function getGeneratedPresetNames2() {
|
|
3446
|
-
return [...GENERATED_PRESETS2];
|
|
3447
|
-
}
|
|
3448
|
-
|
|
3449
3445
|
// src/cli/index.ts
|
|
3450
3446
|
function parseArgs(args) {
|
|
3451
3447
|
const result = {
|
|
@@ -3467,8 +3463,8 @@ function parseArgs(args) {
|
|
|
3467
3463
|
result.companion = mode;
|
|
3468
3464
|
} else if (arg.startsWith("--preset=")) {
|
|
3469
3465
|
const preset = arg.split("=")[1];
|
|
3470
|
-
if (!
|
|
3471
|
-
console.error(`Unsupported preset: ${preset}. Available presets: ${
|
|
3466
|
+
if (!isGeneratedPresetName(preset)) {
|
|
3467
|
+
console.error(`Unsupported preset: ${preset}. Available presets: ${getGeneratedPresetNames().join(", ")}`);
|
|
3472
3468
|
process.exit(1);
|
|
3473
3469
|
}
|
|
3474
3470
|
result.preset = preset;
|
|
@@ -3519,7 +3515,7 @@ Options:
|
|
|
3519
3515
|
Doctor options:
|
|
3520
3516
|
--json Print diagnostics as JSON
|
|
3521
3517
|
|
|
3522
|
-
Available presets: ${
|
|
3518
|
+
Available presets: ${getGeneratedPresetNames().join(", ")}
|
|
3523
3519
|
|
|
3524
3520
|
The installer generates OpenAI and OpenCode Go presets by default.
|
|
3525
3521
|
OpenAI is active unless --preset selects another generated preset.
|
package/dist/cli/system.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare function resolveOpenCodePath(): string;
|
|
2
|
-
export declare function isOpenCodeInstalled(): Promise<boolean>;
|
|
1
|
+
export declare function resolveOpenCodePath(environment?: NodeJS.ProcessEnv): string;
|
|
2
|
+
export declare function isOpenCodeInstalled(environment?: NodeJS.ProcessEnv): Promise<boolean>;
|
|
3
3
|
export declare function isTmuxInstalled(): Promise<boolean>;
|
|
4
4
|
export declare function getOpenCodeVersion(): Promise<string | null>;
|
|
5
5
|
export declare function getOpenCodePath(): string | null;
|
|
@@ -13,7 +13,6 @@ export declare const DEFAULT_MODELS: Record<AgentName, string | undefined>;
|
|
|
13
13
|
export declare const POLL_INTERVAL_MS = 500;
|
|
14
14
|
export declare const POLL_INTERVAL_BACKGROUND_MS = 2000;
|
|
15
15
|
export declare const MAX_POLL_TIME_MS: number;
|
|
16
|
-
export declare const DEFAULT_MAX_SUBAGENT_DEPTH = 3;
|
|
17
16
|
export declare const PHASE_REMINDER_TEXT = "!IMPORTANT! Scheduler workflow: First choose the lightest workflow that fits the work. If direct execution is justified, complete it and verify proportionately. Otherwise: plan lanes/dependencies \u2192 dispatch background specialists \u2192 track task IDs \u2192 wait for hook-driven completion \u2192 reconcile terminal results \u2192 verify. Do not poll running jobs, consume running-job output, or advance dependent work. !END!";
|
|
18
17
|
export declare function formatSystemReminder(text: string): string;
|
|
19
18
|
export declare const PHASE_REMINDER: string;
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -335,6 +335,7 @@ export declare const MultiplexerTypeSchema: z.ZodEnum<{
|
|
|
335
335
|
tmux: "tmux";
|
|
336
336
|
zellij: "zellij";
|
|
337
337
|
herdr: "herdr";
|
|
338
|
+
kitty: "kitty";
|
|
338
339
|
cmux: "cmux";
|
|
339
340
|
none: "none";
|
|
340
341
|
}>;
|
|
@@ -366,6 +367,7 @@ export declare const MultiplexerConfigSchema: z.ZodObject<{
|
|
|
366
367
|
tmux: "tmux";
|
|
367
368
|
zellij: "zellij";
|
|
368
369
|
herdr: "herdr";
|
|
370
|
+
kitty: "kitty";
|
|
369
371
|
cmux: "cmux";
|
|
370
372
|
none: "none";
|
|
371
373
|
}>>;
|
|
@@ -968,6 +970,7 @@ export declare const PluginConfigSchema: z.ZodObject<{
|
|
|
968
970
|
tmux: "tmux";
|
|
969
971
|
zellij: "zellij";
|
|
970
972
|
herdr: "herdr";
|
|
973
|
+
kitty: "kitty";
|
|
971
974
|
cmux: "cmux";
|
|
972
975
|
none: "none";
|
|
973
976
|
}>>;
|
|
@@ -7,16 +7,14 @@
|
|
|
7
7
|
import type { PluginInput } from '@opencode-ai/plugin';
|
|
8
8
|
import type { PluginConfig } from '../config';
|
|
9
9
|
import type { CouncilResult } from '../config/council-schema';
|
|
10
|
-
import type { SubagentDepthTracker } from '../utils/subagent-depth';
|
|
11
10
|
export declare class CouncilManager {
|
|
12
11
|
private client;
|
|
13
12
|
private directory;
|
|
14
13
|
private config?;
|
|
15
|
-
private depthTracker?;
|
|
16
14
|
private tmuxEnabled;
|
|
17
15
|
private deprecatedFields?;
|
|
18
16
|
private legacyMasterModel?;
|
|
19
|
-
constructor(ctx: PluginInput, config?: PluginConfig,
|
|
17
|
+
constructor(ctx: PluginInput, config?: PluginConfig, tmuxEnabled?: boolean);
|
|
20
18
|
/** Return deprecated config fields detected during parsing (for tool warnings). */
|
|
21
19
|
getDeprecatedFields(): string[] | undefined;
|
|
22
20
|
/** Return the legacy master.model if it was used as fallback. */
|
|
@@ -6,15 +6,19 @@
|
|
|
6
6
|
* of the user's actual turn.
|
|
7
7
|
*/
|
|
8
8
|
import { PHASE_REMINDER } from '../../config/constants';
|
|
9
|
-
import type
|
|
9
|
+
import { type MessagePart } from '../types';
|
|
10
10
|
export { PHASE_REMINDER };
|
|
11
11
|
export declare const PHASE_REMINDER_METADATA_KEY = "oh-my-opencode-slim.phaseReminder";
|
|
12
|
+
export declare function hasPhaseReminder(part: MessagePart): boolean;
|
|
13
|
+
interface PhaseReminderOptions {
|
|
14
|
+
shouldInject?: (sessionID: string) => boolean;
|
|
15
|
+
}
|
|
12
16
|
/**
|
|
13
17
|
* Creates the experimental.chat.messages.transform hook for phase reminder injection.
|
|
14
18
|
* This hook runs right before sending to API, so it doesn't affect UI display.
|
|
15
19
|
* Only injects for the orchestrator agent.
|
|
16
20
|
*/
|
|
17
|
-
export declare function createPhaseReminderHook(
|
|
21
|
+
export declare function createPhaseReminderHook(options?: PhaseReminderOptions): {
|
|
18
22
|
'experimental.chat.messages.transform': (_input: Record<string, never>, output: {
|
|
19
23
|
messages?: unknown;
|
|
20
24
|
}) => Promise<void>;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Catches the "inspect/edit files → implement myself" anti-pattern.
|
|
4
4
|
*
|
|
5
5
|
* The reminder is ephemeral: recorded on tool execution, injected via
|
|
6
|
-
*
|
|
6
|
+
* messages.transform, and consumed once. File tool output stays clean.
|
|
7
7
|
*/
|
|
8
8
|
import type { SessionLifecycle } from '../session-lifecycle';
|
|
9
9
|
interface PostFileToolNudgeOptions {
|
|
@@ -16,10 +16,8 @@ export declare function createPostFileToolNudgeHook(options?: PostFileToolNudgeO
|
|
|
16
16
|
sessionID?: string;
|
|
17
17
|
callID?: string;
|
|
18
18
|
}, _output: unknown) => Promise<void>;
|
|
19
|
-
'experimental.chat.
|
|
20
|
-
|
|
21
|
-
}, output: {
|
|
22
|
-
system: string[];
|
|
19
|
+
'experimental.chat.messages.transform': (_input: Record<string, never>, output: {
|
|
20
|
+
messages?: unknown;
|
|
23
21
|
}) => Promise<void>;
|
|
24
22
|
};
|
|
25
23
|
export {};
|
|
@@ -6,6 +6,5 @@ export declare class SessionLifecycle {
|
|
|
6
6
|
markPending(sessionId: string): void;
|
|
7
7
|
/** Atomic — only one caller gets true per markPending call. */
|
|
8
8
|
consumePending(sessionId: string): boolean;
|
|
9
|
-
hasPendingSession(sessionId: string): boolean;
|
|
10
9
|
clearSession(sessionId: string): void;
|
|
11
10
|
}
|
|
@@ -18,7 +18,10 @@ export declare function createTaskSessionManagerHook(_ctx: PluginInput, options:
|
|
|
18
18
|
* model fallback rather than natural completion. */
|
|
19
19
|
isFallbackInProgress?: (sessionID: string) => boolean;
|
|
20
20
|
coordinator?: SessionLifecycle;
|
|
21
|
+
/** Test seam only; production always uses the reconciliation delay. */
|
|
22
|
+
idleReconcileDelayMs?: number;
|
|
21
23
|
}): {
|
|
24
|
+
observeChatMessage: (input: unknown, output: unknown) => void;
|
|
22
25
|
'tool.execute.before': (input: {
|
|
23
26
|
tool: string;
|
|
24
27
|
sessionID?: string;
|
|
@@ -8,6 +8,8 @@ export interface PendingTaskCall {
|
|
|
8
8
|
export declare function createPendingCallTracker(): {
|
|
9
9
|
add(call: PendingTaskCall): void;
|
|
10
10
|
take(callId?: string, parentSessionId?: string): PendingTaskCall | undefined;
|
|
11
|
+
/** Peek oldest pending call for a parent without removing it. */
|
|
12
|
+
peekByParent(parentSessionId: string): PendingTaskCall | undefined;
|
|
11
13
|
clearSession(sessionId: string): void;
|
|
12
14
|
pendingCallId(sessionID?: string, callID?: string): string;
|
|
13
15
|
};
|
package/dist/hooks/types.d.ts
CHANGED
|
@@ -23,3 +23,4 @@ export type MessageWithParts = {
|
|
|
23
23
|
};
|
|
24
24
|
export declare function isMessageWithParts(message: unknown): message is MessageWithParts;
|
|
25
25
|
export declare function isUserMessageWithParts(message: unknown): message is MessageWithParts;
|
|
26
|
+
export declare function findLatestUserMessage(messages: unknown[]): MessageWithParts | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type EventInput = {
|
|
2
|
+
event: {
|
|
3
|
+
type: string;
|
|
4
|
+
properties?: {
|
|
5
|
+
info?: {
|
|
6
|
+
id?: string;
|
|
7
|
+
};
|
|
8
|
+
sessionID?: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Invalidate task continuations before multiplexer event handling and disposal
|
|
14
|
+
* cleanup.
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleTaskSessionEvent(input: EventInput, invalidateTaskSessions: (input: EventInput) => Promise<void>, handleMultiplexerEvent: () => Promise<void>, cleanupInstance: () => Promise<void>): Promise<void>;
|
|
17
|
+
export {};
|