oh-my-opencode-slim 2.0.4 → 2.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.
- package/README.ja-JP.md +61 -21
- package/README.ko-KR.md +59 -19
- package/README.md +73 -20
- package/README.zh-CN.md +62 -24
- package/dist/agents/council.d.ts +1 -1
- package/dist/agents/index.d.ts +7 -2
- package/dist/agents/orchestrator.d.ts +1 -1
- package/dist/agents/permissions.d.ts +10 -0
- package/dist/cli/custom-skills-registry.d.ts +18 -0
- package/dist/cli/custom-skills.d.ts +3 -19
- package/dist/cli/index.js +1093 -186
- package/dist/cli/providers.d.ts +5 -9
- package/dist/cli/skills.d.ts +3 -3
- package/dist/companion/manager.d.ts +7 -0
- package/dist/config/constants.d.ts +3 -2
- package/dist/config/loader.d.ts +5 -2
- package/dist/config/schema.d.ts +7 -0
- package/dist/council/council-manager.d.ts +1 -1
- package/dist/hooks/auto-update-checker/skill-sync.d.ts +59 -1
- package/dist/hooks/filter-available-skills/index.d.ts +1 -2
- package/dist/hooks/foreground-fallback/index.d.ts +5 -1
- package/dist/hooks/image-hook.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/loop-command/index.d.ts +13 -0
- package/dist/hooks/phase-reminder/index.d.ts +1 -2
- package/dist/hooks/task-session-manager/index.d.ts +1 -2
- package/dist/hooks/task-session-manager/pending-call-tracker.d.ts +13 -0
- package/dist/hooks/task-session-manager/task-context-tracker.d.ts +14 -0
- package/dist/hooks/types.d.ts +3 -1
- package/dist/index.js +3491 -876
- package/dist/interview/dashboard-manager.d.ts +21 -0
- package/dist/interview/dashboard.d.ts +5 -0
- package/dist/interview/document.d.ts +4 -1
- package/dist/interview/manager.d.ts +0 -14
- package/dist/interview/server.d.ts +2 -0
- package/dist/interview/service.d.ts +9 -0
- package/dist/interview/session-server.d.ts +21 -0
- package/dist/interview/types.d.ts +16 -1
- package/dist/loop/loop-session.d.ts +64 -0
- package/dist/multiplexer/factory.d.ts +5 -5
- package/dist/multiplexer/herdr/index.d.ts +31 -0
- package/dist/multiplexer/index.d.ts +1 -0
- package/dist/multiplexer/session-manager.d.ts +3 -0
- package/dist/multiplexer/types.d.ts +4 -4
- package/dist/tools/acp-run.d.ts +1 -1
- package/dist/tui-state.d.ts +3 -0
- package/dist/tui.d.ts +4 -1
- package/dist/tui.js +142 -55
- package/dist/utils/background-job-board.d.ts +20 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/session.d.ts +1 -1
- package/oh-my-opencode-slim.schema.json +24 -4
- package/package.json +1 -1
- package/src/skills/clonedeps/SKILL.md +2 -2
- package/src/skills/clonedeps/codemap.md +23 -32
- package/src/skills/codemap/SKILL.md +2 -2
- package/src/skills/codemap.md +63 -36
- package/src/skills/loop-engineering/SKILL.md +30 -0
- package/src/skills/reflect/SKILL.md +133 -0
- package/src/skills/release-smoke-test/SKILL.md +159 -0
- package/src/skills/simplify/SKILL.md +6 -6
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PluginInput } from '@opencode-ai/plugin';
|
|
2
|
+
import type { PluginConfig } from '../config';
|
|
3
|
+
export declare function createDashboardManager(ctx: PluginInput, config: PluginConfig, dashboardPort: number, outputFolder: string): {
|
|
4
|
+
registerCommand: (config: Record<string, unknown>) => void;
|
|
5
|
+
handleCommandExecuteBefore: (input: {
|
|
6
|
+
command: string;
|
|
7
|
+
sessionID: string;
|
|
8
|
+
arguments: string;
|
|
9
|
+
}, output: {
|
|
10
|
+
parts: Array<{
|
|
11
|
+
type: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
}>;
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
handleEvent: (input: {
|
|
16
|
+
event: {
|
|
17
|
+
type: string;
|
|
18
|
+
properties?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
};
|
|
@@ -45,6 +45,11 @@ export declare function createDashboardServer(config: DashboardConfig): {
|
|
|
45
45
|
answer: string;
|
|
46
46
|
}> | null;
|
|
47
47
|
consumeNudgeAction: (interviewId: string) => 'more-questions' | 'confirm-complete' | null;
|
|
48
|
+
consumeBlockComment: (interviewId: string) => {
|
|
49
|
+
section: string;
|
|
50
|
+
comment: string;
|
|
51
|
+
} | null;
|
|
52
|
+
consumeChatMessage: (interviewId: string) => string | null;
|
|
48
53
|
authToken: string;
|
|
49
54
|
discoverSessionDirectories: () => Promise<void>;
|
|
50
55
|
addManualFolder: (dir: string) => void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InterviewAnswer, InterviewQuestion, InterviewRecord } from './types';
|
|
1
|
+
import type { InterviewAnswer, InterviewQuestion, InterviewRecord, SpecBlock } from './types';
|
|
2
2
|
export declare const DEFAULT_OUTPUT_FOLDER = "interview";
|
|
3
3
|
export declare function normalizeOutputFolder(outputFolder: string): string;
|
|
4
4
|
export declare function createInterviewDirectoryPath(directory: string, outputFolder: string): string;
|
|
@@ -16,6 +16,8 @@ export declare function extractTitle(document: string): string;
|
|
|
16
16
|
export declare function buildInterviewDocument(idea: string, summary: string, history: string, meta?: {
|
|
17
17
|
sessionID?: string;
|
|
18
18
|
baseMessageCount?: number;
|
|
19
|
+
owner?: string;
|
|
20
|
+
tags?: string[];
|
|
19
21
|
}): string;
|
|
20
22
|
/** Parse frontmatter from a .md file. Returns null if no frontmatter. */
|
|
21
23
|
export declare function parseFrontmatter(content: string): Record<string, string> | null;
|
|
@@ -23,3 +25,4 @@ export declare function ensureInterviewFile(record: InterviewRecord): Promise<vo
|
|
|
23
25
|
export declare function readInterviewDocument(record: InterviewRecord): Promise<string>;
|
|
24
26
|
export declare function rewriteInterviewDocument(record: InterviewRecord, summary: string): Promise<string>;
|
|
25
27
|
export declare function appendInterviewAnswers(record: InterviewRecord, questions: InterviewQuestion[], answers: InterviewAnswer[]): Promise<void>;
|
|
28
|
+
export declare function parseSpecBlocks(markdown: string): SpecBlock[];
|
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import type { PluginInput } from '@opencode-ai/plugin';
|
|
2
2
|
import type { PluginConfig } from '../config';
|
|
3
|
-
/**
|
|
4
|
-
* Interview Manager — Composition root.
|
|
5
|
-
*
|
|
6
|
-
* Two modes:
|
|
7
|
-
*
|
|
8
|
-
* 1. **Dashboard mode** (dashboard:true or port>0):
|
|
9
|
-
* First process to bind the port becomes the dashboard (dumb aggregator).
|
|
10
|
-
* Other processes register as sessions and push state to it.
|
|
11
|
-
* Sessions drive LLM interaction locally, dashboard just serves the web UI.
|
|
12
|
-
*
|
|
13
|
-
* 2. **Per-session mode** (default, port=0, dashboard:false):
|
|
14
|
-
* Upstream behavior. Each process runs its own interview server on a random
|
|
15
|
-
* port. Lazy startup on first /interview command.
|
|
16
|
-
*/
|
|
17
3
|
export declare function createInterviewManager(ctx: PluginInput, config: PluginConfig): {
|
|
18
4
|
registerCommand: (config: Record<string, unknown>) => void;
|
|
19
5
|
handleCommandExecuteBefore: (input: {
|
|
@@ -4,6 +4,8 @@ export declare function createInterviewServer(deps: {
|
|
|
4
4
|
listInterviewFiles: () => Promise<InterviewFileItem[]>;
|
|
5
5
|
listInterviews: () => InterviewListItem[];
|
|
6
6
|
submitAnswers: (interviewId: string, answers: InterviewAnswer[]) => Promise<void>;
|
|
7
|
+
submitBlockComment: (interviewId: string, section: string, comment: string) => Promise<void>;
|
|
8
|
+
submitChat: (interviewId: string, message: string) => Promise<void>;
|
|
7
9
|
handleNudgeAction: (interviewId: string, action: 'more-questions' | 'confirm-complete') => Promise<void>;
|
|
8
10
|
outputFolder: string;
|
|
9
11
|
port: number;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { PluginInput } from '@opencode-ai/plugin';
|
|
2
2
|
import type { InterviewConfig } from '../config';
|
|
3
3
|
import type { InterviewAnswer, InterviewFileItem, InterviewListItem, InterviewRecord, InterviewState } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Cap on retained abandoned interview records. Abandoned interviews are kept
|
|
6
|
+
* briefly so a still-open browser tab can render their final state, but
|
|
7
|
+
* without a bound the `interviewsById` and `browserOpened` collections grow
|
|
8
|
+
* for the life of a long-running session/dashboard process.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MAX_RETAINED_ABANDONED = 50;
|
|
4
11
|
export declare function createInterviewService(ctx: PluginInput, config?: InterviewConfig, deps?: {
|
|
5
12
|
openBrowser?: (url: string) => void;
|
|
6
13
|
env?: NodeJS.ProcessEnv;
|
|
@@ -30,5 +37,7 @@ export declare function createInterviewService(ctx: PluginInput, config?: Interv
|
|
|
30
37
|
listInterviewFiles: () => Promise<InterviewFileItem[]>;
|
|
31
38
|
listInterviews: () => InterviewListItem[];
|
|
32
39
|
submitAnswers: (interviewId: string, answers: InterviewAnswer[]) => Promise<void>;
|
|
40
|
+
submitBlockComment: (interviewId: string, section: string, comment: string) => Promise<void>;
|
|
41
|
+
submitChat: (interviewId: string, message: string) => Promise<void>;
|
|
33
42
|
handleNudgeAction: (interviewId: string, action: 'more-questions' | 'confirm-complete') => Promise<void>;
|
|
34
43
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PluginInput } from '@opencode-ai/plugin';
|
|
2
|
+
import type { InterviewConfig } from '../config';
|
|
3
|
+
export declare function createPerSessionInterviewServer(ctx: PluginInput, interviewConfig: InterviewConfig | undefined, outputFolder: string): {
|
|
4
|
+
registerCommand: (config: Record<string, unknown>) => void;
|
|
5
|
+
handleCommandExecuteBefore: (input: {
|
|
6
|
+
command: string;
|
|
7
|
+
sessionID: string;
|
|
8
|
+
arguments: string;
|
|
9
|
+
}, output: {
|
|
10
|
+
parts: Array<{
|
|
11
|
+
type: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
}>;
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
handleEvent: (input: {
|
|
16
|
+
event: {
|
|
17
|
+
type: string;
|
|
18
|
+
properties?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
};
|
|
@@ -14,7 +14,7 @@ export interface InterviewAssistantState {
|
|
|
14
14
|
title?: string;
|
|
15
15
|
questions: InterviewQuestion[];
|
|
16
16
|
}
|
|
17
|
-
/** Raw question object from LLM output
|
|
17
|
+
/** Raw question object from LLM output - loose, everything optional. */
|
|
18
18
|
export declare const RawQuestionSchema: z.ZodObject<{
|
|
19
19
|
id: z.ZodOptional<z.ZodString>;
|
|
20
20
|
question: z.ZodOptional<z.ZodString>;
|
|
@@ -33,6 +33,8 @@ export interface InterviewRecord {
|
|
|
33
33
|
idea: string;
|
|
34
34
|
markdownPath: string;
|
|
35
35
|
createdAt: string;
|
|
36
|
+
abandonedAt?: string;
|
|
37
|
+
abandonedOrder?: number;
|
|
36
38
|
status: 'active' | 'abandoned';
|
|
37
39
|
baseMessageCount: number;
|
|
38
40
|
}
|
|
@@ -61,6 +63,11 @@ export interface InterviewFileItem {
|
|
|
61
63
|
sessionID?: string;
|
|
62
64
|
directory?: string;
|
|
63
65
|
}
|
|
66
|
+
export interface SpecBlock {
|
|
67
|
+
id: string;
|
|
68
|
+
title: string;
|
|
69
|
+
content: string;
|
|
70
|
+
}
|
|
64
71
|
export interface InterviewState {
|
|
65
72
|
interview: InterviewRecord;
|
|
66
73
|
url: string;
|
|
@@ -71,6 +78,7 @@ export interface InterviewState {
|
|
|
71
78
|
summary: string;
|
|
72
79
|
questions: InterviewQuestion[];
|
|
73
80
|
document: string;
|
|
81
|
+
blocks: SpecBlock[];
|
|
74
82
|
}
|
|
75
83
|
/** Wire format for dashboard state cache entries. */
|
|
76
84
|
export interface InterviewStateEntry {
|
|
@@ -93,4 +101,11 @@ export interface InterviewStateEntry {
|
|
|
93
101
|
lastUpdatedAt: number;
|
|
94
102
|
filePath: string;
|
|
95
103
|
nudgeAction: 'more-questions' | 'confirm-complete' | null;
|
|
104
|
+
pendingBlockComment: {
|
|
105
|
+
section: string;
|
|
106
|
+
comment: string;
|
|
107
|
+
} | null;
|
|
108
|
+
pendingChatMessage: string | null;
|
|
109
|
+
document?: string;
|
|
110
|
+
blocks?: SpecBlock[];
|
|
96
111
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export declare function loopDirname(loopID: string, goal: string): string;
|
|
2
|
+
export type LoopPhase = 'executing' | 'verifying' | 'done' | 'escalated' | 'cancelled';
|
|
3
|
+
export type ExecuteAgent = 'fixer' | 'designer' | 'explorer' | 'librarian';
|
|
4
|
+
export type VerifyAgent = 'oracle' | 'observer' | 'test';
|
|
5
|
+
export type SuccessCriterion = {
|
|
6
|
+
type: 'test';
|
|
7
|
+
command: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'build';
|
|
10
|
+
command: string;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'lint';
|
|
13
|
+
command: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'fileExists';
|
|
16
|
+
path: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'command';
|
|
19
|
+
command: string;
|
|
20
|
+
expectExitCode?: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'oracle';
|
|
23
|
+
} | {
|
|
24
|
+
type: 'observer';
|
|
25
|
+
} | {
|
|
26
|
+
type: 'manual';
|
|
27
|
+
};
|
|
28
|
+
export interface LoopDefinition {
|
|
29
|
+
goal: string;
|
|
30
|
+
successCriteria: string;
|
|
31
|
+
success: SuccessCriterion;
|
|
32
|
+
maxAttempts: number;
|
|
33
|
+
executeAgent: ExecuteAgent;
|
|
34
|
+
verifyAgent: VerifyAgent;
|
|
35
|
+
contextFiles?: string[];
|
|
36
|
+
parentSessionID?: string;
|
|
37
|
+
}
|
|
38
|
+
export type VerificationResult = {
|
|
39
|
+
passed: true;
|
|
40
|
+
reason: string;
|
|
41
|
+
} | {
|
|
42
|
+
passed: false;
|
|
43
|
+
reason: string;
|
|
44
|
+
suggestedFix?: string;
|
|
45
|
+
};
|
|
46
|
+
export interface AttemptRecord {
|
|
47
|
+
attemptNumber: number;
|
|
48
|
+
executionResult: string;
|
|
49
|
+
verificationResult: VerificationResult;
|
|
50
|
+
artifactPaths?: string[];
|
|
51
|
+
}
|
|
52
|
+
export interface LoopSession {
|
|
53
|
+
loopID: string;
|
|
54
|
+
definition: LoopDefinition;
|
|
55
|
+
currentPhase: LoopPhase;
|
|
56
|
+
attempts: number;
|
|
57
|
+
activeJobID?: string;
|
|
58
|
+
history: AttemptRecord[];
|
|
59
|
+
historyDir: string;
|
|
60
|
+
manualReviewPending: boolean;
|
|
61
|
+
}
|
|
62
|
+
export declare function createLoopSession(definition: LoopDefinition, loopID: string): LoopSession;
|
|
63
|
+
export declare function compactAttempt(attempt: AttemptRecord): string;
|
|
64
|
+
export declare function writeHistoryFile(session: LoopSession): void;
|
|
@@ -6,9 +6,9 @@ import type { Multiplexer } from './types';
|
|
|
6
6
|
/**
|
|
7
7
|
* Create a multiplexer instance based on config.
|
|
8
8
|
*
|
|
9
|
-
* Do not cache instances: tmux/zellij integrations may depend on
|
|
10
|
-
* per-process environment like TMUX_PANE/ZELLIJ, which should
|
|
11
|
-
* fresh for each plugin context.
|
|
9
|
+
* Do not cache instances: tmux/zellij/herdr integrations may depend on
|
|
10
|
+
* per-process environment like TMUX_PANE/ZELLIJ/HERDR_PANE_ID, which should
|
|
11
|
+
* be captured fresh for each plugin context.
|
|
12
12
|
*/
|
|
13
13
|
export declare function getMultiplexer(config: MultiplexerConfig): Multiplexer | null;
|
|
14
14
|
/**
|
|
@@ -17,9 +17,9 @@ export declare function getMultiplexer(config: MultiplexerConfig): Multiplexer |
|
|
|
17
17
|
export declare function clearMultiplexerCache(): void;
|
|
18
18
|
/**
|
|
19
19
|
* Get the effective multiplexer type for auto mode
|
|
20
|
-
* Returns the actual type that would be used (tmux/zellij/none)
|
|
20
|
+
* Returns the actual type that would be used (tmux/zellij/herdr/none)
|
|
21
21
|
*/
|
|
22
|
-
export declare function getAutoMultiplexerType(): 'tmux' | 'zellij' | 'none';
|
|
22
|
+
export declare function getAutoMultiplexerType(): 'tmux' | 'zellij' | 'herdr' | 'none';
|
|
23
23
|
/**
|
|
24
24
|
* Start background availability check for a multiplexer
|
|
25
25
|
*/
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Herdr multiplexer implementation
|
|
3
|
+
*
|
|
4
|
+
* Splits panes for sub-agent sessions in Herdr.
|
|
5
|
+
*
|
|
6
|
+
* Herdr is an agent-aware terminal multiplexer (workspaces → tabs → panes).
|
|
7
|
+
* Pane IDs use the format `w<workspace>:p<pane>`. The CLI outputs
|
|
8
|
+
* newline-delimited JSON; `pane split` returns a `pane_info` result whose
|
|
9
|
+
* `pane.pane_id` field is the new pane's ID.
|
|
10
|
+
*
|
|
11
|
+
* Environment detection: Herdr injects `HERDR_ENV=1` and `HERDR_PANE_ID`
|
|
12
|
+
* into every pane it manages.
|
|
13
|
+
*/
|
|
14
|
+
import type { MultiplexerLayout } from '../../config/schema';
|
|
15
|
+
import type { Multiplexer, PaneResult } from '../types';
|
|
16
|
+
export declare class HerdrMultiplexer implements Multiplexer {
|
|
17
|
+
readonly type: "herdr";
|
|
18
|
+
private binaryPath;
|
|
19
|
+
private hasChecked;
|
|
20
|
+
private readonly parentPaneId;
|
|
21
|
+
private readonly paneDirection;
|
|
22
|
+
constructor(layout?: MultiplexerLayout, mainPaneSize?: number);
|
|
23
|
+
isAvailable(): Promise<boolean>;
|
|
24
|
+
isInsideSession(): boolean;
|
|
25
|
+
spawnPane(sessionId: string, description: string, serverUrl: string, directory: string): Promise<PaneResult>;
|
|
26
|
+
closePane(paneId: string): Promise<boolean>;
|
|
27
|
+
applyLayout(_layout: MultiplexerLayout, _mainPaneSize: number): Promise<void>;
|
|
28
|
+
private targetPaneArg;
|
|
29
|
+
private getBinary;
|
|
30
|
+
private findBinary;
|
|
31
|
+
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Multiplexer module exports
|
|
3
3
|
*/
|
|
4
4
|
export { clearMultiplexerCache, getMultiplexer, startAvailabilityCheck, } from './factory';
|
|
5
|
+
export { HerdrMultiplexer } from './herdr';
|
|
5
6
|
export { MultiplexerSessionManager, TmuxSessionManager, } from './session-manager';
|
|
6
7
|
export { TmuxMultiplexer } from './tmux';
|
|
7
8
|
export type { Multiplexer, PaneResult } from './types';
|
|
@@ -33,6 +33,7 @@ export declare class MultiplexerSessionManager {
|
|
|
33
33
|
private knownSessions;
|
|
34
34
|
private spawningSessions;
|
|
35
35
|
private closingSessions;
|
|
36
|
+
private deferredIdleCloses;
|
|
36
37
|
private pollInterval?;
|
|
37
38
|
private enabled;
|
|
38
39
|
constructor(ctx: PluginInput, config: MultiplexerConfig, backgroundJobBoard?: BackgroundJobBoard | undefined);
|
|
@@ -48,7 +49,9 @@ export declare class MultiplexerSessionManager {
|
|
|
48
49
|
private isTrackedOrSpawning;
|
|
49
50
|
private updatePolling;
|
|
50
51
|
private getSessionId;
|
|
52
|
+
private backgroundJobState;
|
|
51
53
|
private isRunningBackgroundJob;
|
|
54
|
+
retryDeferredIdleClose(sessionId: string): Promise<void>;
|
|
52
55
|
cleanup(): Promise<void>;
|
|
53
56
|
}
|
|
54
57
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Multiplexer abstraction layer
|
|
3
3
|
*
|
|
4
|
-
* Provides a unified interface for terminal multiplexers (tmux, zellij,
|
|
5
|
-
* to spawn and manage panes for child agent sessions.
|
|
4
|
+
* Provides a unified interface for terminal multiplexers (tmux, zellij,
|
|
5
|
+
* herdr, etc.) to spawn and manage panes for child agent sessions.
|
|
6
6
|
*/
|
|
7
7
|
import type { MultiplexerConfig, MultiplexerLayout } from '../config/schema';
|
|
8
8
|
export interface PaneResult {
|
|
@@ -11,10 +11,10 @@ export interface PaneResult {
|
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Core multiplexer interface
|
|
14
|
-
* Implementations: TmuxMultiplexer, ZellijMultiplexer
|
|
14
|
+
* Implementations: TmuxMultiplexer, ZellijMultiplexer, HerdrMultiplexer
|
|
15
15
|
*/
|
|
16
16
|
export interface Multiplexer {
|
|
17
|
-
readonly type: 'tmux' | 'zellij';
|
|
17
|
+
readonly type: 'tmux' | 'zellij' | 'herdr';
|
|
18
18
|
/**
|
|
19
19
|
* Check if the multiplexer binary is available on the system
|
|
20
20
|
*/
|
package/dist/tools/acp-run.d.ts
CHANGED
package/dist/tui-state.d.ts
CHANGED
|
@@ -2,14 +2,17 @@ export interface TuiSnapshot {
|
|
|
2
2
|
version: 1;
|
|
3
3
|
updatedAt: number;
|
|
4
4
|
agentModels: Record<string, string>;
|
|
5
|
+
agentVariants: Record<string, string>;
|
|
5
6
|
}
|
|
6
7
|
export declare function getTuiStatePath(): string;
|
|
7
8
|
export declare function readTuiSnapshot(): TuiSnapshot;
|
|
8
9
|
export declare function readTuiSnapshotAsync(): Promise<TuiSnapshot>;
|
|
9
10
|
export declare function recordTuiAgentModels(input: {
|
|
10
11
|
agentModels: Record<string, string>;
|
|
12
|
+
agentVariants?: Record<string, string>;
|
|
11
13
|
}): void;
|
|
12
14
|
export declare function recordTuiAgentModel(input: {
|
|
13
15
|
agentName: string;
|
|
14
16
|
model: string;
|
|
17
|
+
variant?: string | null;
|
|
15
18
|
}): void;
|
package/dist/tui.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { TuiPluginModule } from '@opencode-ai/plugin/tui';
|
|
2
2
|
import { type TuiSnapshot } from './tui-state';
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function splitSidebarModelId(model: string): {
|
|
4
|
+
provider?: string;
|
|
5
|
+
model: string;
|
|
6
|
+
};
|
|
4
7
|
export declare function getSidebarAgentNames(snapshot: TuiSnapshot): string[];
|
|
5
8
|
export declare function readConfigInvalid(directory: string): boolean;
|
|
6
9
|
declare const plugin: TuiPluginModule & {
|