@skj1724/oh-my-opencode 3.18.5 → 3.18.6
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/dist/cli/index.js +1 -1
- package/dist/hooks/atlas/boulder-continuation-injector.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-after.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-before.d.ts +0 -1
- package/dist/hooks/atlas/types.d.ts +1 -1
- package/dist/hooks/compaction-context-injector/hook.d.ts +0 -1
- package/dist/hooks/context-window-monitor.d.ts +1 -1
- package/dist/hooks/prometheus-md-only/hook.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/continuation-injection.d.ts +0 -1
- package/dist/hooks/todo-continuation-enforcer/countdown.d.ts +0 -1
- package/dist/hooks/todo-continuation-enforcer/handler.d.ts +0 -1
- package/dist/hooks/todo-continuation-enforcer/idle-event.d.ts +0 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +0 -1
- package/dist/index.js +26 -36
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -53770,7 +53770,7 @@ var {
|
|
|
53770
53770
|
// package.json
|
|
53771
53771
|
var package_default = {
|
|
53772
53772
|
name: "@skj1724/oh-my-opencode",
|
|
53773
|
-
version: "3.18.
|
|
53773
|
+
version: "3.18.6",
|
|
53774
53774
|
description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
53775
53775
|
main: "./dist/index.js",
|
|
53776
53776
|
types: "dist/index.d.ts",
|
|
@@ -7,5 +7,4 @@ export declare function createToolExecuteAfterHandler(input: {
|
|
|
7
7
|
pendingTaskRefs: Map<string, PendingTaskRef>;
|
|
8
8
|
autoCommit: boolean;
|
|
9
9
|
getState: (sessionID: string) => SessionState;
|
|
10
|
-
language?: string;
|
|
11
10
|
}): (toolInput: ToolExecuteAfterInput, toolOutput: ToolExecuteAfterOutput) => Promise<void>;
|
|
@@ -11,8 +11,8 @@ export interface AtlasHookOptions {
|
|
|
11
11
|
backgroundManager?: BackgroundManager;
|
|
12
12
|
isContinuationStopped?: (sessionID: string) => boolean;
|
|
13
13
|
agentOverrides?: AgentOverrides;
|
|
14
|
+
/** Enable auto-commit after each atomic task completion (default: true) */
|
|
14
15
|
autoCommit?: boolean;
|
|
15
|
-
language?: string;
|
|
16
16
|
}
|
|
17
17
|
export interface ToolExecuteAfterInput {
|
|
18
18
|
tool: string;
|
|
@@ -3,5 +3,4 @@ import type { CompactionContextClient, CompactionContextInjector } from "./types
|
|
|
3
3
|
export declare function createCompactionContextInjector(options?: {
|
|
4
4
|
ctx?: CompactionContextClient;
|
|
5
5
|
backgroundManager?: BackgroundManager;
|
|
6
|
-
language?: string;
|
|
7
6
|
}): CompactionContextInjector;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
2
|
import { type ContextLimitModelCacheState } from "../shared/context-limit-resolver";
|
|
3
|
-
export declare function createContextWindowMonitorHook(_ctx: PluginInput, modelCacheState?: ContextLimitModelCacheState
|
|
3
|
+
export declare function createContextWindowMonitorHook(_ctx: PluginInput, modelCacheState?: ContextLimitModelCacheState): {
|
|
4
4
|
"tool.execute.after": (input: {
|
|
5
5
|
tool: string;
|
|
6
6
|
sessionID: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
|
-
export declare function createPrometheusMdOnlyHook(ctx: PluginInput
|
|
2
|
+
export declare function createPrometheusMdOnlyHook(ctx: PluginInput): {
|
|
3
3
|
"tool.execute.before": (input: {
|
|
4
4
|
tool: string;
|
|
5
5
|
sessionID: string;
|
package/dist/index.js
CHANGED
|
@@ -66321,7 +66321,7 @@ async function injectContinuation(args) {
|
|
|
66321
66321
|
const incompleteTodos = todos.filter((todo) => todo.status !== "completed" && todo.status !== "cancelled");
|
|
66322
66322
|
const todoList = incompleteTodos.map((todo) => `- [${todo.status}] ${todo.content}`).join(`
|
|
66323
66323
|
`);
|
|
66324
|
-
const prompt = `${getContinuationPrompt(
|
|
66324
|
+
const prompt = `${getContinuationPrompt()}
|
|
66325
66325
|
|
|
66326
66326
|
[Status: ${todos.length - freshIncompleteCount}/${todos.length} completed, ${freshIncompleteCount} remaining]
|
|
66327
66327
|
|
|
@@ -66420,8 +66420,7 @@ function startCountdown(args) {
|
|
|
66420
66420
|
skipAgents,
|
|
66421
66421
|
resolvedInfo,
|
|
66422
66422
|
sessionStateStore,
|
|
66423
|
-
isContinuationStopped
|
|
66424
|
-
language: args.language
|
|
66423
|
+
isContinuationStopped
|
|
66425
66424
|
});
|
|
66426
66425
|
}, COUNTDOWN_SECONDS * 1000);
|
|
66427
66426
|
log(`[${HOOK_NAME}] Countdown started`, {
|
|
@@ -66445,8 +66444,7 @@ async function handleSessionIdle(args) {
|
|
|
66445
66444
|
sessionStateStore,
|
|
66446
66445
|
backgroundManager,
|
|
66447
66446
|
skipAgents = DEFAULT_SKIP_AGENTS,
|
|
66448
|
-
isContinuationStopped
|
|
66449
|
-
language
|
|
66447
|
+
isContinuationStopped
|
|
66450
66448
|
} = args;
|
|
66451
66449
|
log(`[${HOOK_NAME}] session.idle`, { sessionID });
|
|
66452
66450
|
const state2 = sessionStateStore.getState(sessionID);
|
|
@@ -66593,8 +66591,7 @@ async function handleSessionIdle(args) {
|
|
|
66593
66591
|
backgroundManager,
|
|
66594
66592
|
skipAgents,
|
|
66595
66593
|
sessionStateStore,
|
|
66596
|
-
isContinuationStopped
|
|
66597
|
-
language
|
|
66594
|
+
isContinuationStopped
|
|
66598
66595
|
});
|
|
66599
66596
|
}
|
|
66600
66597
|
|
|
@@ -66735,8 +66732,7 @@ function createTodoContinuationHandler(args) {
|
|
|
66735
66732
|
sessionStateStore,
|
|
66736
66733
|
backgroundManager,
|
|
66737
66734
|
skipAgents,
|
|
66738
|
-
isContinuationStopped
|
|
66739
|
-
language: args.language
|
|
66735
|
+
isContinuationStopped
|
|
66740
66736
|
});
|
|
66741
66737
|
return;
|
|
66742
66738
|
}
|
|
@@ -66970,8 +66966,7 @@ function createTodoContinuationEnforcer(ctx, options = {}) {
|
|
|
66970
66966
|
const {
|
|
66971
66967
|
backgroundManager,
|
|
66972
66968
|
skipAgents = DEFAULT_SKIP_AGENTS,
|
|
66973
|
-
isContinuationStopped
|
|
66974
|
-
language
|
|
66969
|
+
isContinuationStopped
|
|
66975
66970
|
} = options;
|
|
66976
66971
|
const sessionStateStore = createSessionStateStore();
|
|
66977
66972
|
const markRecovering = (sessionID) => {
|
|
@@ -66992,8 +66987,7 @@ function createTodoContinuationEnforcer(ctx, options = {}) {
|
|
|
66992
66987
|
sessionStateStore,
|
|
66993
66988
|
backgroundManager,
|
|
66994
66989
|
skipAgents,
|
|
66995
|
-
isContinuationStopped
|
|
66996
|
-
language
|
|
66990
|
+
isContinuationStopped
|
|
66997
66991
|
});
|
|
66998
66992
|
const cancelAllCountdowns = () => {
|
|
66999
66993
|
sessionStateStore.cancelAllCountdowns();
|
|
@@ -67024,7 +67018,7 @@ Complete your work thoroughly and methodically.`;
|
|
|
67024
67018
|
|
|
67025
67019
|
${reminderText}`;
|
|
67026
67020
|
}
|
|
67027
|
-
function createContextWindowMonitorHook(_ctx, modelCacheState
|
|
67021
|
+
function createContextWindowMonitorHook(_ctx, modelCacheState) {
|
|
67028
67022
|
const remindedSessions = new Set;
|
|
67029
67023
|
const tokenCache = new Map;
|
|
67030
67024
|
const toolExecuteAfter = async (input, output) => {
|
|
@@ -67049,7 +67043,7 @@ function createContextWindowMonitorHook(_ctx, modelCacheState, language) {
|
|
|
67049
67043
|
const limitTokens = actualLimit.toLocaleString();
|
|
67050
67044
|
output.output += `
|
|
67051
67045
|
|
|
67052
|
-
${createContextReminder(actualLimit
|
|
67046
|
+
${createContextReminder(actualLimit)}
|
|
67053
67047
|
[Context Status: ${usedPct}% used (${usedTokens}/${limitTokens} tokens), ${remainingPct}% remaining]`;
|
|
67054
67048
|
};
|
|
67055
67049
|
const eventHandler = async ({ event }) => {
|
|
@@ -84959,7 +84953,7 @@ function isAllowedFile(filePath, workspaceRoot) {
|
|
|
84959
84953
|
|
|
84960
84954
|
// src/hooks/prometheus-md-only/hook.ts
|
|
84961
84955
|
var TASK_TOOLS = ["task", "call_omo_agent"];
|
|
84962
|
-
function createPrometheusMdOnlyHook(ctx
|
|
84956
|
+
function createPrometheusMdOnlyHook(ctx) {
|
|
84963
84957
|
return {
|
|
84964
84958
|
"tool.execute.before": async (input, output) => {
|
|
84965
84959
|
const agentName = await getAgentFromSession(input.sessionID, ctx.directory, ctx.client);
|
|
@@ -84970,7 +84964,7 @@ function createPrometheusMdOnlyHook(ctx, language) {
|
|
|
84970
84964
|
if (TASK_TOOLS.includes(toolName)) {
|
|
84971
84965
|
const prompt = output.args.prompt;
|
|
84972
84966
|
if (prompt && !prompt.includes(SYSTEM_DIRECTIVE_PREFIX)) {
|
|
84973
|
-
output.args.prompt = getPlanningConsultWarning(
|
|
84967
|
+
output.args.prompt = getPlanningConsultWarning() + prompt;
|
|
84974
84968
|
log(`[${HOOK_NAME4}] Injected planning warning to ${toolName}`, {
|
|
84975
84969
|
sessionID: input.sessionID,
|
|
84976
84970
|
tool: toolName,
|
|
@@ -85003,7 +84997,7 @@ function createPrometheusMdOnlyHook(ctx, language) {
|
|
|
85003
84997
|
filePath,
|
|
85004
84998
|
agent: agentName
|
|
85005
84999
|
});
|
|
85006
|
-
output.message = (output.message || "") + getPrometheusWorkflowReminder(
|
|
85000
|
+
output.message = (output.message || "") + getPrometheusWorkflowReminder();
|
|
85007
85001
|
}
|
|
85008
85002
|
log(`[${HOOK_NAME4}] Allowed: .sisyphus/*.md write permitted`, {
|
|
85009
85003
|
sessionID: input.sessionID,
|
|
@@ -85963,7 +85957,7 @@ async function injectBoulderContinuation(input) {
|
|
|
85963
85957
|
const preferredSessionContext = preferredTaskSessionId ? `
|
|
85964
85958
|
|
|
85965
85959
|
[Preferred reuse session for current top-level plan task${preferredTaskTitle ? `: ${preferredTaskTitle}` : ""}: ${preferredTaskSessionId}]` : "";
|
|
85966
|
-
const prompt = getBoulderContinuationPrompt(
|
|
85960
|
+
const prompt = getBoulderContinuationPrompt().replace(/{PLAN_NAME}/g, planName) + `
|
|
85967
85961
|
|
|
85968
85962
|
[Status: ${total - remaining}/${total} completed, ${remaining} remaining]` + preferredSessionContext + worktreeContext;
|
|
85969
85963
|
const continuationAgent = resolveRegisteredAgentName(agent ?? (isAgentRegistered("atlas") ? "atlas" : undefined));
|
|
@@ -86075,8 +86069,7 @@ async function injectContinuation2(input) {
|
|
|
86075
86069
|
preferredTaskSessionId: preferredTaskSession?.session_id,
|
|
86076
86070
|
preferredTaskTitle: preferredTaskSession?.task_title,
|
|
86077
86071
|
backgroundManager: input.options?.backgroundManager,
|
|
86078
|
-
sessionState: input.sessionState
|
|
86079
|
-
language: input.options?.language
|
|
86072
|
+
sessionState: input.sessionState
|
|
86080
86073
|
});
|
|
86081
86074
|
if (result === "injected") {
|
|
86082
86075
|
if (input.sessionState.pendingRetryTimer) {
|
|
@@ -86772,7 +86765,7 @@ function createToolExecuteAfterHandler2(input) {
|
|
|
86772
86765
|
filePath = toolOutput.metadata?.filePath;
|
|
86773
86766
|
}
|
|
86774
86767
|
if (filePath && !isSisyphusPath(filePath)) {
|
|
86775
|
-
toolOutput.output = (toolOutput.output || "") + getDirectWorkReminder(
|
|
86768
|
+
toolOutput.output = (toolOutput.output || "") + getDirectWorkReminder();
|
|
86776
86769
|
log(`[${HOOK_NAME7}] Direct work reminder appended`, {
|
|
86777
86770
|
sessionID: toolInput.sessionID,
|
|
86778
86771
|
tool: toolInput.tool,
|
|
@@ -86914,7 +86907,7 @@ function createToolExecuteBeforeHandler2(input) {
|
|
|
86914
86907
|
if (toolInput.callID) {
|
|
86915
86908
|
pendingFilePaths.set(toolInput.callID, filePath);
|
|
86916
86909
|
}
|
|
86917
|
-
const warning = getOrchestratorDelegationRequired(
|
|
86910
|
+
const warning = getOrchestratorDelegationRequired().replace("$FILE_PATH", filePath);
|
|
86918
86911
|
toolOutput.message = (toolOutput.message || "") + warning;
|
|
86919
86912
|
log(`[${HOOK_NAME7}] Injected delegation warning for direct file modification`, {
|
|
86920
86913
|
sessionID: toolInput.sessionID,
|
|
@@ -86961,7 +86954,7 @@ function createToolExecuteBeforeHandler2(input) {
|
|
|
86961
86954
|
}
|
|
86962
86955
|
const prompt = toolOutput.args.prompt;
|
|
86963
86956
|
if (prompt && !prompt.includes(SYSTEM_DIRECTIVE_PREFIX)) {
|
|
86964
|
-
toolOutput.args.prompt = `<system-reminder>${getSingleTaskDirective(
|
|
86957
|
+
toolOutput.args.prompt = `<system-reminder>${getSingleTaskDirective()}</system-reminder>
|
|
86965
86958
|
` + prompt;
|
|
86966
86959
|
log(`[${HOOK_NAME7}] Injected single-task directive to task`, {
|
|
86967
86960
|
sessionID: toolInput.sessionID
|
|
@@ -86987,8 +86980,8 @@ function createAtlasHook(ctx, options) {
|
|
|
86987
86980
|
}
|
|
86988
86981
|
return {
|
|
86989
86982
|
handler: createAtlasEventHandler({ ctx, options, sessions, getState }),
|
|
86990
|
-
"tool.execute.before": createToolExecuteBeforeHandler2({ ctx, pendingFilePaths, pendingTaskRefs
|
|
86991
|
-
"tool.execute.after": createToolExecuteAfterHandler2({ ctx, pendingFilePaths, pendingTaskRefs, autoCommit, getState
|
|
86983
|
+
"tool.execute.before": createToolExecuteBeforeHandler2({ ctx, pendingFilePaths, pendingTaskRefs }),
|
|
86984
|
+
"tool.execute.after": createToolExecuteAfterHandler2({ ctx, pendingFilePaths, pendingTaskRefs, autoCommit, getState })
|
|
86992
86985
|
};
|
|
86993
86986
|
}
|
|
86994
86987
|
// src/hooks/delegate-task-retry/patterns.ts
|
|
@@ -87652,7 +87645,6 @@ function createRecoveryLogic(ctx, getTailState) {
|
|
|
87652
87645
|
function createCompactionContextInjector(options) {
|
|
87653
87646
|
const ctx = options?.ctx;
|
|
87654
87647
|
const backgroundManager = options?.backgroundManager;
|
|
87655
|
-
const language = options?.language;
|
|
87656
87648
|
const tailStates = new Map;
|
|
87657
87649
|
const getTailState = (sessionID) => {
|
|
87658
87650
|
const existing = tailStates.get(sessionID);
|
|
@@ -87684,7 +87676,7 @@ function createCompactionContextInjector(options) {
|
|
|
87684
87676
|
});
|
|
87685
87677
|
};
|
|
87686
87678
|
const inject = (sessionID) => {
|
|
87687
|
-
let prompt = getCompactionContextPrompt(
|
|
87679
|
+
let prompt = getCompactionContextPrompt();
|
|
87688
87680
|
if (backgroundManager && sessionID) {
|
|
87689
87681
|
const history = backgroundManager.taskHistory.formatForCompaction(sessionID);
|
|
87690
87682
|
if (history) {
|
|
@@ -102939,7 +102931,7 @@ function createRuntimeTmuxConfig(pluginConfig) {
|
|
|
102939
102931
|
function createSessionHooks(args) {
|
|
102940
102932
|
const { ctx, pluginConfig, modelCacheState, modelFallbackControllerAccessor, isHookEnabled, safeHookEnabled } = args;
|
|
102941
102933
|
const safeHook = (hookName, factory) => safeCreateHook(hookName, factory, { enabled: safeHookEnabled });
|
|
102942
|
-
const contextWindowMonitor = isHookEnabled("context-window-monitor") ? safeHook("context-window-monitor", () => createContextWindowMonitorHook(ctx, modelCacheState
|
|
102934
|
+
const contextWindowMonitor = isHookEnabled("context-window-monitor") ? safeHook("context-window-monitor", () => createContextWindowMonitorHook(ctx, modelCacheState)) : null;
|
|
102943
102935
|
const preemptiveCompaction = isHookEnabled("preemptive-compaction") && pluginConfig.experimental?.preemptive_compaction ? safeHook("preemptive-compaction", () => createPreemptiveCompactionHook(ctx, pluginConfig, modelCacheState)) : null;
|
|
102944
102936
|
const sessionRecovery = isHookEnabled("session-recovery") ? safeHook("session-recovery", () => createSessionRecoveryHook(ctx, { experimental: pluginConfig.experimental })) : null;
|
|
102945
102937
|
let sessionNotification = null;
|
|
@@ -103020,7 +103012,7 @@ function createSessionHooks(args) {
|
|
|
103020
103012
|
const editErrorRecovery = isHookEnabled("edit-error-recovery") ? safeHook("edit-error-recovery", () => createEditErrorRecoveryHook(ctx)) : null;
|
|
103021
103013
|
const delegateTaskRetry = isHookEnabled("delegate-task-retry") ? safeHook("delegate-task-retry", () => createDelegateTaskRetryHook(ctx)) : null;
|
|
103022
103014
|
const startWork = isHookEnabled("start-work") ? safeHook("start-work", () => createStartWorkHook(ctx)) : null;
|
|
103023
|
-
const prometheusMdOnly = isHookEnabled("prometheus-md-only") ? safeHook("prometheus-md-only", () => createPrometheusMdOnlyHook(ctx
|
|
103015
|
+
const prometheusMdOnly = isHookEnabled("prometheus-md-only") ? safeHook("prometheus-md-only", () => createPrometheusMdOnlyHook(ctx)) : null;
|
|
103024
103016
|
const sisyphusJuniorNotepad = isHookEnabled("sisyphus-junior-notepad") ? safeHook("sisyphus-junior-notepad", () => createSisyphusJuniorNotepadHook(ctx)) : null;
|
|
103025
103017
|
const noSisyphusGpt = isHookEnabled("no-sisyphus-gpt") ? safeHook("no-sisyphus-gpt", () => createNoSisyphusGptHook(ctx)) : null;
|
|
103026
103018
|
const noHephaestusNonGpt = isHookEnabled("no-hephaestus-non-gpt") ? safeHook("no-hephaestus-non-gpt", () => createNoHephaestusNonGptHook(ctx, {
|
|
@@ -103360,12 +103352,11 @@ function createContinuationHooks(args) {
|
|
|
103360
103352
|
const stopContinuationGuard = isHookEnabled("stop-continuation-guard") ? safeHook("stop-continuation-guard", () => createStopContinuationGuardHook(ctx, {
|
|
103361
103353
|
backgroundManager
|
|
103362
103354
|
})) : null;
|
|
103363
|
-
const compactionContextInjector = isHookEnabled("compaction-context-injector") ? safeHook("compaction-context-injector", () => createCompactionContextInjector({ ctx, backgroundManager
|
|
103355
|
+
const compactionContextInjector = isHookEnabled("compaction-context-injector") ? safeHook("compaction-context-injector", () => createCompactionContextInjector({ ctx, backgroundManager })) : null;
|
|
103364
103356
|
const compactionTodoPreserver = isHookEnabled("compaction-todo-preserver") ? safeHook("compaction-todo-preserver", () => createCompactionTodoPreserverHook(ctx)) : null;
|
|
103365
103357
|
const todoContinuationEnforcer = isHookEnabled("todo-continuation-enforcer") ? safeHook("todo-continuation-enforcer", () => createTodoContinuationEnforcer(ctx, {
|
|
103366
103358
|
backgroundManager,
|
|
103367
|
-
isContinuationStopped: stopContinuationGuard?.isStopped
|
|
103368
|
-
language: pluginConfig.i18n?.language
|
|
103359
|
+
isContinuationStopped: stopContinuationGuard?.isStopped
|
|
103369
103360
|
})) : null;
|
|
103370
103361
|
const unstableAgentBabysitter = isHookEnabled("unstable-agent-babysitter") ? safeHook("unstable-agent-babysitter", () => createUnstableAgentBabysitter({ ctx, backgroundManager, pluginConfig })) : null;
|
|
103371
103362
|
if (sessionRecovery) {
|
|
@@ -103394,8 +103385,7 @@ function createContinuationHooks(args) {
|
|
|
103394
103385
|
backgroundManager,
|
|
103395
103386
|
isContinuationStopped: (sessionID) => stopContinuationGuard?.isStopped(sessionID) ?? false,
|
|
103396
103387
|
agentOverrides: pluginConfig.agents,
|
|
103397
|
-
autoCommit: pluginConfig.start_work?.auto_commit
|
|
103398
|
-
language: pluginConfig.i18n?.language
|
|
103388
|
+
autoCommit: pluginConfig.start_work?.auto_commit
|
|
103399
103389
|
})) : null;
|
|
103400
103390
|
return {
|
|
103401
103391
|
stopContinuationGuard,
|
|
@@ -130774,7 +130764,7 @@ class PostHog extends PostHogBackendClient {
|
|
|
130774
130764
|
// package.json
|
|
130775
130765
|
var package_default = {
|
|
130776
130766
|
name: "@skj1724/oh-my-opencode",
|
|
130777
|
-
version: "3.18.
|
|
130767
|
+
version: "3.18.6",
|
|
130778
130768
|
description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
130779
130769
|
main: "./dist/index.js",
|
|
130780
130770
|
types: "dist/index.d.ts",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skj1724/oh-my-opencode",
|
|
3
|
-
"version": "3.18.
|
|
3
|
+
"version": "3.18.6",
|
|
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",
|