oh-my-opencode-slim 1.1.1 → 1.1.2

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 (61) hide show
  1. package/README.ja-JP.md +638 -0
  2. package/README.ko-KR.md +634 -0
  3. package/README.md +44 -13
  4. package/README.zh-CN.md +627 -0
  5. package/dist/cli/background-subagents.d.ts +13 -0
  6. package/dist/cli/index.js +65 -92
  7. package/dist/cli/skills.d.ts +2 -30
  8. package/dist/cli/types.d.ts +0 -1
  9. package/dist/config/fallback-chains.d.ts +1 -0
  10. package/dist/config/schema.d.ts +7 -0
  11. package/dist/hooks/auto-update-checker/checker.d.ts +7 -1
  12. package/dist/hooks/auto-update-checker/constants.d.ts +1 -0
  13. package/dist/hooks/auto-update-checker/types.d.ts +10 -0
  14. package/dist/hooks/deepwork/index.d.ts +13 -0
  15. package/dist/index.js +300 -121
  16. package/dist/tools/ast-grep/tools.d.ts +1 -1
  17. package/dist/tools/cancel-task.d.ts +16 -0
  18. package/dist/tools/preset-manager.d.ts +6 -7
  19. package/dist/tools/subtask/tools.d.ts +6 -1
  20. package/dist/tui.js +17 -62
  21. package/dist/utils/background-job-board.d.ts +90 -0
  22. package/oh-my-opencode-slim.schema.json +11 -0
  23. package/package.json +6 -3
  24. package/dist/agents/council-master.d.ts +0 -2
  25. package/dist/background/background-manager.d.ts +0 -203
  26. package/dist/background/index.d.ts +0 -3
  27. package/dist/background/multiplexer-session-manager.d.ts +0 -70
  28. package/dist/background/subagent-depth.d.ts +0 -35
  29. package/dist/cli/divoom.d.ts +0 -23
  30. package/dist/goal/index.d.ts +0 -3
  31. package/dist/goal/manager.d.ts +0 -41
  32. package/dist/goal/prompts.d.ts +0 -4
  33. package/dist/goal/store.d.ts +0 -15
  34. package/dist/goal/types.d.ts +0 -28
  35. package/dist/integrations/divoom/index.d.ts +0 -3
  36. package/dist/integrations/divoom/status-manager.d.ts +0 -31
  37. package/dist/integrations/divoom/swift-helper-source.d.ts +0 -1
  38. package/dist/integrations/divoom/swift-transport.d.ts +0 -26
  39. package/dist/integrations/divoom/types.d.ts +0 -41
  40. package/dist/tools/background.d.ts +0 -13
  41. package/dist/tools/fork/command.d.ts +0 -28
  42. package/dist/tools/fork/files.d.ts +0 -33
  43. package/dist/tools/fork/index.d.ts +0 -10
  44. package/dist/tools/fork/state.d.ts +0 -7
  45. package/dist/tools/fork/tools.d.ts +0 -23
  46. package/dist/tools/fork/vendor.d.ts +0 -28
  47. package/dist/tools/handoff/command.d.ts +0 -29
  48. package/dist/tools/handoff/files.d.ts +0 -33
  49. package/dist/tools/handoff/index.d.ts +0 -10
  50. package/dist/tools/handoff/state.d.ts +0 -7
  51. package/dist/tools/handoff/tools.d.ts +0 -23
  52. package/dist/tools/handoff/vendor.d.ts +0 -28
  53. package/dist/tools/lsp/client.d.ts +0 -81
  54. package/dist/tools/lsp/config-store.d.ts +0 -29
  55. package/dist/tools/lsp/config.d.ts +0 -5
  56. package/dist/tools/lsp/constants.d.ts +0 -24
  57. package/dist/tools/lsp/index.d.ts +0 -4
  58. package/dist/tools/lsp/tools.d.ts +0 -5
  59. package/dist/tools/lsp/types.d.ts +0 -45
  60. package/dist/tools/lsp/utils.d.ts +0 -34
  61. package/dist/utils/tmux-debug-log.d.ts +0 -2
@@ -0,0 +1,13 @@
1
+ export type BackgroundSubagentsMode = 'ask' | 'yes' | 'no';
2
+ export type ShellKind = 'bash' | 'fish' | 'zsh';
3
+ export declare function isBackgroundSubagentsEnabled(value: string | undefined): boolean;
4
+ export declare function detectShellKind(shell: string | undefined): ShellKind | undefined;
5
+ export declare function detectBackgroundSubagentsTarget(env?: NodeJS.ProcessEnv): string | undefined;
6
+ export declare function getBackgroundSubagentsBlock(targetPath: string): string;
7
+ export declare function manualBackgroundSubagentsInstructions(options?: {
8
+ targetPath?: string;
9
+ shell?: ShellKind;
10
+ }): string;
11
+ export declare function expandHomePath(targetPath: string): string;
12
+ export declare function upsertBackgroundSubagentsBlock(content: string, block: string): string;
13
+ export declare function writeBackgroundSubagentsBlock(targetPath: string): void;
package/dist/cli/index.js CHANGED
@@ -100,7 +100,7 @@ function getConfigSearchDirs() {
100
100
  });
101
101
  }
102
102
  function getOpenCodeConfigPaths() {
103
- const configDir = getDefaultOpenCodeConfigDir();
103
+ const configDir = getConfigDir();
104
104
  return [join(configDir, "opencode.json"), join(configDir, "opencode.jsonc")];
105
105
  }
106
106
  function getConfigJson() {
@@ -373,6 +373,9 @@ var TodoContinuationConfigSchema = z2.object({
373
373
  autoEnable: z2.boolean().default(false).describe("Automatically enable auto-continue when the orchestrator session has enough todos"),
374
374
  autoEnableThreshold: z2.number().int().min(1).max(50).default(4).describe("Number of todos that triggers auto-enable (only used when autoEnable is true)")
375
375
  });
376
+ var SubtaskConfigSchema = z2.object({
377
+ timeoutMs: z2.number().int().min(0).max(24 * 60 * 60 * 1000).optional().describe("Subtask worker timeout in ms. 0 disables the timeout. Defaults to 300000 (5 minutes).")
378
+ });
376
379
  var FailoverConfigSchema = z2.object({
377
380
  enabled: z2.boolean().default(true),
378
381
  timeoutMs: z2.number().min(0).default(15000),
@@ -420,6 +423,7 @@ var PluginConfigSchema = z2.object({
420
423
  sessionManager: SessionManagerConfigSchema.optional(),
421
424
  divoom: DivoomConfigSchema.optional(),
422
425
  todoContinuation: TodoContinuationConfigSchema.optional(),
426
+ subtask: SubtaskConfigSchema.optional(),
423
427
  fallback: FailoverConfigSchema.optional(),
424
428
  council: CouncilConfigSchema.optional()
425
429
  }).superRefine((value, ctx) => {
@@ -515,56 +519,6 @@ function installCustomSkill(skill) {
515
519
  }
516
520
  }
517
521
 
518
- // src/cli/skills.ts
519
- import { spawnSync } from "node:child_process";
520
- var RECOMMENDED_SKILLS = [
521
- {
522
- name: "agent-browser",
523
- repo: "https://github.com/vercel-labs/agent-browser",
524
- skillName: "agent-browser",
525
- allowedAgents: ["designer"],
526
- description: "High-performance browser automation",
527
- postInstallCommands: [
528
- "npm install -g agent-browser",
529
- "agent-browser install"
530
- ]
531
- }
532
- ];
533
- function installSkill(skill) {
534
- const args = [
535
- "skills",
536
- "add",
537
- skill.repo,
538
- "--skill",
539
- skill.skillName,
540
- "-a",
541
- "opencode",
542
- "-y",
543
- "--global"
544
- ];
545
- try {
546
- const result = spawnSync("npx", args, { stdio: "inherit" });
547
- if (result.status !== 0) {
548
- return false;
549
- }
550
- if (skill.postInstallCommands && skill.postInstallCommands.length > 0) {
551
- console.log(`Running post-install commands for ${skill.name}...`);
552
- for (const cmd of skill.postInstallCommands) {
553
- console.log(`> ${cmd}`);
554
- const [command, ...cmdArgs] = cmd.split(" ");
555
- const cmdResult = spawnSync(command, cmdArgs, { stdio: "inherit" });
556
- if (cmdResult.status !== 0) {
557
- console.warn(`Post-install command failed: ${cmd}`);
558
- }
559
- }
560
- }
561
- return true;
562
- } catch (error) {
563
- console.error(`Failed to install skill: ${skill.name}`, error);
564
- return false;
565
- }
566
- }
567
-
568
522
  // src/cli/providers.ts
569
523
  var SCHEMA_URL = "https://unpkg.com/oh-my-opencode-slim@latest/oh-my-opencode-slim.schema.json";
570
524
  var GENERATED_PRESETS = ["openai", "opencode-go"];
@@ -637,12 +591,8 @@ function generateLiteConfig(installConfig) {
637
591
  const createAgentConfig = (agentName, modelInfo) => {
638
592
  const isOrchestrator = agentName === "orchestrator";
639
593
  const skills = isOrchestrator ? ["*"] : [
640
- ...RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName),
641
594
  ...CUSTOM_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.name)
642
595
  ];
643
- if (agentName === "designer" && !skills.includes("agent-browser")) {
644
- skills.push("agent-browser");
645
- }
646
596
  return {
647
597
  model: modelInfo.model,
648
598
  variant: modelInfo.variant,
@@ -673,6 +623,12 @@ function generateLiteConfig(installConfig) {
673
623
 
674
624
  // src/cli/config-io.ts
675
625
  var PACKAGE_NAME = "oh-my-opencode-slim";
626
+ var DEFAULT_OPENCODE_AGENTS_TO_DISABLE = [
627
+ "build",
628
+ "explore",
629
+ "general",
630
+ "plan"
631
+ ];
676
632
  function isString(value) {
677
633
  return typeof value === "string";
678
634
  }
@@ -753,17 +709,49 @@ function getPluginEntry() {
753
709
  return PACKAGE_NAME;
754
710
  }
755
711
  }
756
- function getOpenCodePluginCacheDir() {
712
+ function getPinnedVersionFromConfig() {
713
+ try {
714
+ const { config } = parseConfig(getExistingConfigPath());
715
+ if (!config)
716
+ return;
717
+ for (const entry of getPlugins(config)) {
718
+ const spec = getPluginSpec(entry);
719
+ if (!spec)
720
+ continue;
721
+ if (spec === PACKAGE_NAME)
722
+ return;
723
+ if (spec.startsWith(`${PACKAGE_NAME}@`)) {
724
+ const version = spec.slice(PACKAGE_NAME.length + 1);
725
+ if (version && version !== "latest")
726
+ return version;
727
+ }
728
+ }
729
+ } catch {}
730
+ return;
731
+ }
732
+ function getVersionFromPackageRoot(packageRoot) {
733
+ try {
734
+ const packageJsonPath = join3(packageRoot, "package.json");
735
+ if (!existsSync3(packageJsonPath))
736
+ return;
737
+ const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
738
+ return pkg.version;
739
+ } catch {
740
+ return;
741
+ }
742
+ }
743
+ function getOpenCodePluginCacheDir(version) {
757
744
  const cacheDir = process.env.XDG_CACHE_HOME?.trim() || join3(homedir2(), ".cache");
758
- return join3(cacheDir, "opencode", "packages", `${PACKAGE_NAME}@latest`);
745
+ const suffix = version ? `${PACKAGE_NAME}@${version}` : `${PACKAGE_NAME}@latest`;
746
+ return join3(cacheDir, "opencode", "packages", suffix);
759
747
  }
760
- function writeOpenCodePluginCacheManifest(cacheDir) {
748
+ function writeOpenCodePluginCacheManifest(cacheDir, version = "latest") {
761
749
  try {
762
750
  writeFileSync(join3(cacheDir, "package.json"), JSON.stringify({
763
751
  name: `${PACKAGE_NAME}-cache`,
764
752
  private: true,
765
753
  dependencies: {
766
- [PACKAGE_NAME]: "latest"
754
+ [PACKAGE_NAME]: version
767
755
  }
768
756
  }, null, 2));
769
757
  return null;
@@ -811,7 +799,10 @@ async function warmOpenCodePluginCache() {
811
799
  if (!packageRoot || !isPackageManagerInstall(packageRoot)) {
812
800
  return null;
813
801
  }
814
- const cacheDir = getOpenCodePluginCacheDir();
802
+ const pinnedVersion = getPinnedVersionFromConfig();
803
+ const runningVersion = getVersionFromPackageRoot(packageRoot);
804
+ const cacheVersion = pinnedVersion ?? runningVersion;
805
+ const cacheDir = getOpenCodePluginCacheDir(cacheVersion);
815
806
  try {
816
807
  mkdirSync3(cacheDir, { recursive: true });
817
808
  } catch (err) {
@@ -821,7 +812,7 @@ async function warmOpenCodePluginCache() {
821
812
  error: `Failed to create OpenCode cache directory: ${err}`
822
813
  };
823
814
  }
824
- const manifestError = writeOpenCodePluginCacheManifest(cacheDir);
815
+ const manifestError = writeOpenCodePluginCacheManifest(cacheDir, cacheVersion);
825
816
  if (manifestError)
826
817
  return manifestError;
827
818
  try {
@@ -1004,8 +995,13 @@ function disableDefaultAgents() {
1004
995
  }
1005
996
  const config = parsedConfig ?? {};
1006
997
  const agent = config.agent ?? {};
1007
- agent.explore = { disable: true };
1008
- agent.general = { disable: true };
998
+ for (const agentName of DEFAULT_OPENCODE_AGENTS_TO_DISABLE) {
999
+ const existing = agent[agentName];
1000
+ agent[agentName] = {
1001
+ ...existing && typeof existing === "object" && !Array.isArray(existing) ? existing : {},
1002
+ disable: true
1003
+ };
1004
+ }
1009
1005
  config.agent = agent;
1010
1006
  writeConfig(configPath, config);
1011
1007
  return { success: true, configPath };
@@ -1136,7 +1132,8 @@ function mergePluginConfigs(base, override) {
1136
1132
  sessionManager: deepMerge(base.sessionManager, override.sessionManager),
1137
1133
  divoom: deepMerge(base.divoom, override.divoom),
1138
1134
  fallback: deepMerge(base.fallback, override.fallback),
1139
- council: deepMerge(base.council, override.council)
1135
+ council: deepMerge(base.council, override.council),
1136
+ subtask: deepMerge(base.subtask, override.subtask)
1140
1137
  };
1141
1138
  }
1142
1139
  function deepMerge(base, override) {
@@ -1355,13 +1352,13 @@ Options:
1355
1352
  import { existsSync as existsSync5 } from "node:fs";
1356
1353
  import { createInterface } from "node:readline/promises";
1357
1354
  // src/cli/system.ts
1358
- import { spawnSync as spawnSync2 } from "node:child_process";
1355
+ import { spawnSync } from "node:child_process";
1359
1356
  import { statSync as statSync4 } from "node:fs";
1360
1357
  var cachedOpenCodePath = null;
1361
1358
  function resolvePathCommand(command) {
1362
1359
  try {
1363
1360
  const resolver = process.platform === "win32" ? "where" : "which";
1364
- const result = spawnSync2(resolver, [command], {
1361
+ const result = spawnSync(resolver, [command], {
1365
1362
  encoding: "utf-8",
1366
1363
  stdio: ["ignore", "pipe", "ignore"]
1367
1364
  });
@@ -1376,7 +1373,7 @@ function resolvePathCommand(command) {
1376
1373
  }
1377
1374
  function canExecute(command, args) {
1378
1375
  try {
1379
- const result = spawnSync2(command, args, {
1376
+ const result = spawnSync(command, args, {
1380
1377
  stdio: "ignore"
1381
1378
  });
1382
1379
  return result.status === 0;
@@ -1578,8 +1575,6 @@ async function runInstall(config) {
1578
1575
  const isUpdate = detected.isInstalled;
1579
1576
  printHeader(isUpdate);
1580
1577
  let totalSteps = 6;
1581
- if (config.installSkills)
1582
- totalSteps += 1;
1583
1578
  if (config.installCustomSkills)
1584
1579
  totalSteps += 1;
1585
1580
  totalSteps += 1;
@@ -1658,27 +1653,6 @@ ${JSON.stringify(liteConfig, null, 2)}
1658
1653
  return 1;
1659
1654
  }
1660
1655
  }
1661
- if (config.installSkills) {
1662
- printStep(step++, totalSteps, "Installing recommended skills...");
1663
- if (config.dryRun) {
1664
- printInfo("Dry run mode - would install skills:");
1665
- for (const skill of RECOMMENDED_SKILLS) {
1666
- printInfo(` - ${skill.name}`);
1667
- }
1668
- } else {
1669
- let skillsInstalled = 0;
1670
- for (const skill of RECOMMENDED_SKILLS) {
1671
- printInfo(`Installing ${skill.name}...`);
1672
- if (installSkill(skill)) {
1673
- printSuccess(`Installed: ${skill.name}`);
1674
- skillsInstalled++;
1675
- } else {
1676
- printInfo(`Skipped: ${skill.name} (already installed)`);
1677
- }
1678
- }
1679
- printSuccess(`${skillsInstalled}/${RECOMMENDED_SKILLS.length} skills processed`);
1680
- }
1681
- }
1682
1656
  if (config.installCustomSkills) {
1683
1657
  printStep(step++, totalSteps, "Installing custom skills...");
1684
1658
  if (config.dryRun) {
@@ -1735,7 +1709,6 @@ ${JSON.stringify(liteConfig, null, 2)}
1735
1709
  async function install(args) {
1736
1710
  const config = {
1737
1711
  hasTmux: false,
1738
- installSkills: args.skills === "yes",
1739
1712
  installCustomSkills: args.skills === "yes",
1740
1713
  preset: args.preset,
1741
1714
  promptForStar: args.tui,
@@ -1792,7 +1765,7 @@ Usage:
1792
1765
  bunx oh-my-opencode-slim doctor [OPTIONS]
1793
1766
 
1794
1767
  Options:
1795
- --skills=yes|no Install recommended and bundled skills (default: yes)
1768
+ --skills=yes|no Install bundled skills (default: yes)
1796
1769
  --preset=<name> Active generated config preset (default: openai)
1797
1770
  --no-tui Non-interactive mode
1798
1771
  --dry-run Simulate install without writing files
@@ -1,20 +1,3 @@
1
- /**
2
- * A recommended skill to install via `npx skills add`.
3
- */
4
- export interface RecommendedSkill {
5
- /** Human-readable name for prompts */
6
- name: string;
7
- /** GitHub repo URL for `npx skills add` */
8
- repo: string;
9
- /** Skill name within the repo (--skill flag) */
10
- skillName: string;
11
- /** List of agents that should auto-allow this skill */
12
- allowedAgents: string[];
13
- /** Description shown to user during install */
14
- description: string;
15
- /** Optional commands to run after the skill is added */
16
- postInstallCommands?: string[];
17
- }
18
1
  /**
19
2
  * A skill that is managed externally (e.g. user-installed) and needs
20
3
  * permission grants but is NOT installed by this plugin's CLI.
@@ -27,26 +10,15 @@ export interface PermissionOnlySkill {
27
10
  /** Human-readable description (for documentation only) */
28
11
  description: string;
29
12
  }
30
- /**
31
- * List of recommended skills.
32
- * Add new skills here to include them in the installation flow.
33
- */
34
- export declare const RECOMMENDED_SKILLS: RecommendedSkill[];
35
13
  /**
36
14
  * Skills managed externally (not installed by this plugin's CLI).
37
15
  * Entries here only affect agent permission grants — nothing is installed.
38
16
  */
39
17
  export declare const PERMISSION_ONLY_SKILLS: PermissionOnlySkill[];
40
18
  /**
41
- * Install a skill using `npx skills add`.
42
- * @param skill - The skill to install
43
- * @returns True if installation succeeded, false otherwise
44
- */
45
- export declare function installSkill(skill: RecommendedSkill): boolean;
46
- /**
47
- * Get permission presets for a specific agent based on recommended skills.
19
+ * Get permission presets for a specific agent based on bundled skills.
48
20
  * @param agentName - The name of the agent
49
- * @param skillList - Optional explicit list of skills to allow (overrides recommendations)
21
+ * @param skillList - Optional explicit list of skills to allow (overrides defaults)
50
22
  * @returns Permission rules for the skill permission type
51
23
  */
52
24
  export declare function getSkillPermissionsForAgent(agentName: string, skillList?: string[]): Record<string, 'allow' | 'ask' | 'deny'>;
@@ -14,7 +14,6 @@ export interface OpenCodeConfig {
14
14
  }
15
15
  export interface InstallConfig {
16
16
  hasTmux: boolean;
17
- installSkills: boolean;
18
17
  installCustomSkills: boolean;
19
18
  preset?: string;
20
19
  promptForStar?: boolean;
@@ -0,0 +1 @@
1
+ export declare function normalizeFallbackChainsForPreset(chains: Record<string, string[] | undefined>, presetName: string | null | undefined): Record<string, string[]>;
@@ -183,6 +183,10 @@ export declare const TodoContinuationConfigSchema: z.ZodObject<{
183
183
  autoEnableThreshold: z.ZodDefault<z.ZodNumber>;
184
184
  }, z.core.$strip>;
185
185
  export type TodoContinuationConfig = z.infer<typeof TodoContinuationConfigSchema>;
186
+ export declare const SubtaskConfigSchema: z.ZodObject<{
187
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
188
+ }, z.core.$strip>;
189
+ export type SubtaskConfig = z.infer<typeof SubtaskConfigSchema>;
186
190
  export declare const FailoverConfigSchema: z.ZodObject<{
187
191
  enabled: z.ZodDefault<z.ZodBoolean>;
188
192
  timeoutMs: z.ZodDefault<z.ZodNumber>;
@@ -338,6 +342,9 @@ export declare const PluginConfigSchema: z.ZodObject<{
338
342
  autoEnable: z.ZodDefault<z.ZodBoolean>;
339
343
  autoEnableThreshold: z.ZodDefault<z.ZodNumber>;
340
344
  }, z.core.$strip>>;
345
+ subtask: z.ZodOptional<z.ZodObject<{
346
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
347
+ }, z.core.$strip>>;
341
348
  fallback: z.ZodOptional<z.ZodObject<{
342
349
  enabled: z.ZodDefault<z.ZodBoolean>;
343
350
  timeoutMs: z.ZodDefault<z.ZodNumber>;
@@ -1,4 +1,4 @@
1
- import type { PluginEntryInfo } from './types';
1
+ import type { CompatibleVersionResult, PluginEntryInfo } from './types';
2
2
  /**
3
3
  * Extracts the update channel (latest, alpha, beta, etc.) from a version string.
4
4
  * @param version The version or tag to analyze.
@@ -30,3 +30,9 @@ export declare function updatePinnedVersion(configPath: string, oldEntry: string
30
30
  * Fetches the latest version for a specific channel from the NPM registry.
31
31
  */
32
32
  export declare function getLatestVersion(channel?: string): Promise<string | null>;
33
+ /**
34
+ * Resolves the newest version that is safe for the current install to use.
35
+ * Auto-update never crosses major versions; newer majors are surfaced as a
36
+ * manual migration notification instead.
37
+ */
38
+ export declare function getLatestCompatibleVersion(currentVersion: string, channel?: string): Promise<CompatibleVersionResult>;
@@ -1,5 +1,6 @@
1
1
  export declare const PACKAGE_NAME = "oh-my-opencode-slim";
2
2
  export declare const NPM_REGISTRY_URL = "https://registry.npmjs.org/-/package/oh-my-opencode-slim/dist-tags";
3
+ export declare const NPM_PACKAGE_URL = "https://registry.npmjs.org/oh-my-opencode-slim";
3
4
  export declare const NPM_FETCH_TIMEOUT = 5000;
4
5
  /** The directory used by OpenCode to cache node_modules for plugins. */
5
6
  export declare const CACHE_DIR: string;
@@ -2,6 +2,16 @@ export interface NpmDistTags {
2
2
  latest: string;
3
3
  [key: string]: string;
4
4
  }
5
+ export interface NpmPackageMetadata {
6
+ 'dist-tags'?: NpmDistTags;
7
+ versions?: Record<string, unknown>;
8
+ }
9
+ export interface CompatibleVersionResult {
10
+ latestVersion: string | null;
11
+ latestMajorVersion: string | null;
12
+ blockedByMajor: boolean;
13
+ unsafeReason?: 'unparseable-current-version';
14
+ }
5
15
  export interface OpencodeConfig {
6
16
  plugin?: unknown[];
7
17
  [key: string]: unknown;
@@ -0,0 +1,13 @@
1
+ export declare function createDeepworkCommandHook(): {
2
+ registerCommand: (config: Record<string, unknown>) => void;
3
+ handleCommandExecuteBefore: (input: {
4
+ command: string;
5
+ sessionID: string;
6
+ arguments: string;
7
+ }, output: {
8
+ parts: Array<{
9
+ type: string;
10
+ text?: string;
11
+ }>;
12
+ }) => Promise<void>;
13
+ };