@penclipai/adapter-opencode-local 2026.401.0-canary.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +115 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +46 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/execute.d.ts +3 -0
  15. package/dist/server/execute.d.ts.map +1 -0
  16. package/dist/server/execute.js +352 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/index.d.ts +8 -0
  19. package/dist/server/index.d.ts.map +1 -0
  20. package/dist/server/index.js +63 -0
  21. package/dist/server/index.js.map +1 -0
  22. package/dist/server/models.d.ts +20 -0
  23. package/dist/server/models.d.ts.map +1 -0
  24. package/dist/server/models.js +166 -0
  25. package/dist/server/models.js.map +1 -0
  26. package/dist/server/models.test.d.ts +2 -0
  27. package/dist/server/models.test.d.ts.map +1 -0
  28. package/dist/server/models.test.js +22 -0
  29. package/dist/server/models.test.js.map +1 -0
  30. package/dist/server/parse.d.ts +13 -0
  31. package/dist/server/parse.d.ts.map +1 -0
  32. package/dist/server/parse.js +97 -0
  33. package/dist/server/parse.js.map +1 -0
  34. package/dist/server/parse.test.d.ts +2 -0
  35. package/dist/server/parse.test.d.ts.map +1 -0
  36. package/dist/server/parse.test.js +48 -0
  37. package/dist/server/parse.test.js.map +1 -0
  38. package/dist/server/runtime-config.d.ts +11 -0
  39. package/dist/server/runtime-config.d.ts.map +1 -0
  40. package/dist/server/runtime-config.js +75 -0
  41. package/dist/server/runtime-config.js.map +1 -0
  42. package/dist/server/runtime-config.test.d.ts +2 -0
  43. package/dist/server/runtime-config.test.d.ts.map +1 -0
  44. package/dist/server/runtime-config.test.js +60 -0
  45. package/dist/server/runtime-config.test.js.map +1 -0
  46. package/dist/server/skills.d.ts +8 -0
  47. package/dist/server/skills.d.ts.map +1 -0
  48. package/dist/server/skills.js +73 -0
  49. package/dist/server/skills.js.map +1 -0
  50. package/dist/server/test.d.ts +3 -0
  51. package/dist/server/test.d.ts.map +1 -0
  52. package/dist/server/test.js +316 -0
  53. package/dist/server/test.js.map +1 -0
  54. package/dist/ui/build-config.d.ts +3 -0
  55. package/dist/ui/build-config.d.ts.map +1 -0
  56. package/dist/ui/build-config.js +88 -0
  57. package/dist/ui/build-config.js.map +1 -0
  58. package/dist/ui/index.d.ts +3 -0
  59. package/dist/ui/index.d.ts.map +1 -0
  60. package/dist/ui/index.js +3 -0
  61. package/dist/ui/index.js.map +1 -0
  62. package/dist/ui/parse-stdout.d.ts +3 -0
  63. package/dist/ui/parse-stdout.d.ts.map +1 -0
  64. package/dist/ui/parse-stdout.js +141 -0
  65. package/dist/ui/parse-stdout.js.map +1 -0
  66. package/package.json +55 -0
@@ -0,0 +1,60 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { prepareOpenCodeRuntimeConfig } from "./runtime-config.js";
6
+ const cleanupPaths = new Set();
7
+ afterEach(async () => {
8
+ await Promise.all([...cleanupPaths].map(async (filepath) => {
9
+ await fs.rm(filepath, { recursive: true, force: true });
10
+ cleanupPaths.delete(filepath);
11
+ }));
12
+ });
13
+ async function makeConfigHome(initialConfig) {
14
+ const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-opencode-test-"));
15
+ cleanupPaths.add(root);
16
+ const configDir = path.join(root, "opencode");
17
+ await fs.mkdir(configDir, { recursive: true });
18
+ if (initialConfig) {
19
+ await fs.writeFile(path.join(configDir, "opencode.json"), `${JSON.stringify(initialConfig, null, 2)}\n`, "utf8");
20
+ }
21
+ return root;
22
+ }
23
+ describe("prepareOpenCodeRuntimeConfig", () => {
24
+ it("injects an external_directory allow rule by default", async () => {
25
+ const configHome = await makeConfigHome({
26
+ permission: {
27
+ read: "allow",
28
+ },
29
+ theme: "system",
30
+ });
31
+ const prepared = await prepareOpenCodeRuntimeConfig({
32
+ env: { XDG_CONFIG_HOME: configHome },
33
+ config: {},
34
+ });
35
+ cleanupPaths.add(prepared.env.XDG_CONFIG_HOME);
36
+ expect(prepared.env.XDG_CONFIG_HOME).not.toBe(configHome);
37
+ const runtimeConfig = JSON.parse(await fs.readFile(path.join(prepared.env.XDG_CONFIG_HOME, "opencode", "opencode.json"), "utf8"));
38
+ expect(runtimeConfig).toMatchObject({
39
+ theme: "system",
40
+ permission: {
41
+ read: "allow",
42
+ external_directory: "allow",
43
+ },
44
+ });
45
+ await prepared.cleanup();
46
+ cleanupPaths.delete(prepared.env.XDG_CONFIG_HOME);
47
+ await expect(fs.access(prepared.env.XDG_CONFIG_HOME)).rejects.toThrow();
48
+ });
49
+ it("respects explicit opt-out", async () => {
50
+ const configHome = await makeConfigHome();
51
+ const prepared = await prepareOpenCodeRuntimeConfig({
52
+ env: { XDG_CONFIG_HOME: configHome },
53
+ config: { dangerouslySkipPermissions: false },
54
+ });
55
+ expect(prepared.env).toEqual({ XDG_CONFIG_HOME: configHome });
56
+ expect(prepared.notes).toEqual([]);
57
+ await prepared.cleanup();
58
+ });
59
+ });
60
+ //# sourceMappingURL=runtime-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-config.test.js","sourceRoot":"","sources":["../../src/server/runtime-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AAEvC,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,cAAc,CAAC,aAAuC;IACnE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAClF,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EACrC,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC7C,MAAM,CACP,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;YACtC,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;aACd;YACD,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC;YAClD,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE;YACpC,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAE/C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,MAAM,EAAE,CAAC,QAAQ,CACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,eAAe,CAAC,EACpE,MAAM,CACP,CACyB,CAAC;QAC7B,MAAM,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC;YAClC,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;gBACb,kBAAkB,EAAE,OAAO;aAC5B;SACF,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC;YAClD,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE;YACpC,MAAM,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE;SAC9C,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AdapterSkillContext, AdapterSkillSnapshot } from "@penclipai/adapter-utils";
2
+ export declare function listOpenCodeSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
3
+ export declare function syncOpenCodeSkills(ctx: AdapterSkillContext, desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
4
+ export declare function resolveOpenCodeDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
5
+ key: string;
6
+ required?: boolean;
7
+ }>): string[];
8
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AA+ClC,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEhG;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
@@ -0,0 +1,73 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { buildPersistentSkillSnapshot, ensurePaperclipSkillSymlink, readPaperclipRuntimeSkillEntries, readInstalledSkillTargets, resolvePaperclipDesiredSkillNames, } from "@penclipai/adapter-utils/server-utils";
6
+ const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
7
+ function asString(value) {
8
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
9
+ }
10
+ function resolveOpenCodeSkillsHome(config) {
11
+ const env = typeof config.env === "object" && config.env !== null && !Array.isArray(config.env)
12
+ ? config.env
13
+ : {};
14
+ const configuredHome = asString(env.HOME);
15
+ const home = configuredHome ? path.resolve(configuredHome) : os.homedir();
16
+ return path.join(home, ".claude", "skills");
17
+ }
18
+ async function buildOpenCodeSkillSnapshot(config) {
19
+ const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);
20
+ const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);
21
+ const skillsHome = resolveOpenCodeSkillsHome(config);
22
+ const installed = await readInstalledSkillTargets(skillsHome);
23
+ return buildPersistentSkillSnapshot({
24
+ adapterType: "opencode_local",
25
+ availableEntries,
26
+ desiredSkills,
27
+ installed,
28
+ skillsHome,
29
+ locationLabel: "~/.claude/skills",
30
+ installedDetail: "Installed in the shared Claude/OpenCode skills home.",
31
+ missingDetail: "Configured but not currently linked into the shared Claude/OpenCode skills home.",
32
+ externalConflictDetail: "Skill name is occupied by an external installation in the shared skills home.",
33
+ externalDetail: "Installed outside Paperclip management in the shared skills home.",
34
+ warnings: [
35
+ "OpenCode currently uses the shared Claude skills home (~/.claude/skills).",
36
+ ],
37
+ });
38
+ }
39
+ export async function listOpenCodeSkills(ctx) {
40
+ return buildOpenCodeSkillSnapshot(ctx.config);
41
+ }
42
+ export async function syncOpenCodeSkills(ctx, desiredSkills) {
43
+ const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);
44
+ const desiredSet = new Set([
45
+ ...desiredSkills,
46
+ ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),
47
+ ]);
48
+ const skillsHome = resolveOpenCodeSkillsHome(ctx.config);
49
+ await fs.mkdir(skillsHome, { recursive: true });
50
+ const installed = await readInstalledSkillTargets(skillsHome);
51
+ const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));
52
+ for (const available of availableEntries) {
53
+ if (!desiredSet.has(available.key))
54
+ continue;
55
+ const target = path.join(skillsHome, available.runtimeName);
56
+ await ensurePaperclipSkillSymlink(available.source, target);
57
+ }
58
+ for (const [name, installedEntry] of installed.entries()) {
59
+ const available = availableByRuntimeName.get(name);
60
+ if (!available)
61
+ continue;
62
+ if (desiredSet.has(available.key))
63
+ continue;
64
+ if (installedEntry.targetPath !== available.source)
65
+ continue;
66
+ await fs.unlink(path.join(skillsHome, name)).catch(() => { });
67
+ }
68
+ return buildOpenCodeSkillSnapshot(ctx.config);
69
+ }
70
+ export function resolveOpenCodeDesiredSkillNames(config, availableEntries) {
71
+ return resolvePaperclipDesiredSkillNames(config, availableEntries);
72
+ }
73
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@penclipai/adapter-utils";
2
+ export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,0BAA0B,CAAC;AAkDlC,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAsRvC"}
@@ -0,0 +1,316 @@
1
+ import { asBoolean, asString, asStringArray, parseObject, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, runChildProcess, } from "@penclipai/adapter-utils/server-utils";
2
+ import { discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable } from "./models.js";
3
+ import { parseOpenCodeJsonl } from "./parse.js";
4
+ import { prepareOpenCodeRuntimeConfig } from "./runtime-config.js";
5
+ function summarizeStatus(checks) {
6
+ if (checks.some((check) => check.level === "error"))
7
+ return "fail";
8
+ if (checks.some((check) => check.level === "warn"))
9
+ return "warn";
10
+ return "pass";
11
+ }
12
+ function firstNonEmptyLine(text) {
13
+ return (text
14
+ .split(/\r?\n/)
15
+ .map((line) => line.trim())
16
+ .find(Boolean) ?? "");
17
+ }
18
+ function summarizeProbeDetail(stdout, stderr, parsedError) {
19
+ const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
20
+ if (!raw)
21
+ return null;
22
+ const clean = raw.replace(/\s+/g, " ").trim();
23
+ const max = 240;
24
+ return clean.length > max ? `${clean.slice(0, max - 1)}...` : clean;
25
+ }
26
+ function normalizeEnv(input) {
27
+ if (typeof input !== "object" || input === null || Array.isArray(input))
28
+ return {};
29
+ const env = {};
30
+ for (const [key, value] of Object.entries(input)) {
31
+ if (typeof value === "string")
32
+ env[key] = value;
33
+ }
34
+ return env;
35
+ }
36
+ const OPENCODE_AUTH_REQUIRED_RE = /(?:auth(?:entication)?\s+required|api\s*key|invalid\s*api\s*key|not\s+logged\s+in|opencode\s+auth\s+login|free\s+usage\s+exceeded)/i;
37
+ export async function testEnvironment(ctx) {
38
+ const checks = [];
39
+ const config = parseObject(ctx.config);
40
+ const command = asString(config.command, "opencode");
41
+ const cwd = asString(config.cwd, process.cwd());
42
+ try {
43
+ await ensureAbsoluteDirectory(cwd, { createIfMissing: false });
44
+ checks.push({
45
+ code: "opencode_cwd_valid",
46
+ level: "info",
47
+ message: `Working directory is valid: ${cwd}`,
48
+ });
49
+ }
50
+ catch (err) {
51
+ checks.push({
52
+ code: "opencode_cwd_invalid",
53
+ level: "error",
54
+ message: err instanceof Error ? err.message : "Invalid working directory",
55
+ detail: cwd,
56
+ });
57
+ }
58
+ const envConfig = parseObject(config.env);
59
+ const env = {};
60
+ for (const [key, value] of Object.entries(envConfig)) {
61
+ if (typeof value === "string")
62
+ env[key] = value;
63
+ }
64
+ const openaiKeyOverride = "OPENAI_API_KEY" in envConfig ? asString(envConfig.OPENAI_API_KEY, "") : null;
65
+ if (openaiKeyOverride !== null && openaiKeyOverride.trim() === "") {
66
+ checks.push({
67
+ code: "opencode_openai_api_key_missing",
68
+ level: "warn",
69
+ message: "OPENAI_API_KEY override is empty.",
70
+ hint: "The OPENAI_API_KEY override is empty. Set a valid key or remove the override.",
71
+ });
72
+ }
73
+ // Prevent OpenCode from writing an opencode.json into the working directory.
74
+ env.OPENCODE_DISABLE_PROJECT_CONFIG = "true";
75
+ const preparedRuntimeConfig = await prepareOpenCodeRuntimeConfig({ env, config });
76
+ if (asBoolean(config.dangerouslySkipPermissions, true)) {
77
+ checks.push({
78
+ code: "opencode_headless_permissions_enabled",
79
+ level: "info",
80
+ message: "Headless OpenCode external-directory permissions are auto-approved for unattended runs.",
81
+ });
82
+ }
83
+ try {
84
+ const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...preparedRuntimeConfig.env }));
85
+ const cwdInvalid = checks.some((check) => check.code === "opencode_cwd_invalid");
86
+ if (cwdInvalid) {
87
+ checks.push({
88
+ code: "opencode_command_skipped",
89
+ level: "warn",
90
+ message: "Skipped command check because working directory validation failed.",
91
+ detail: command,
92
+ });
93
+ }
94
+ else {
95
+ try {
96
+ await ensureCommandResolvable(command, cwd, runtimeEnv);
97
+ checks.push({
98
+ code: "opencode_command_resolvable",
99
+ level: "info",
100
+ message: `Command is executable: ${command}`,
101
+ });
102
+ }
103
+ catch (err) {
104
+ checks.push({
105
+ code: "opencode_command_unresolvable",
106
+ level: "error",
107
+ message: err instanceof Error ? err.message : "Command is not executable",
108
+ detail: command,
109
+ });
110
+ }
111
+ }
112
+ const canRunProbe = checks.every((check) => check.code !== "opencode_cwd_invalid" && check.code !== "opencode_command_unresolvable");
113
+ let modelValidationPassed = false;
114
+ const configuredModel = asString(config.model, "").trim();
115
+ if (canRunProbe && configuredModel) {
116
+ try {
117
+ const discovered = await discoverOpenCodeModels({ command, cwd, env: runtimeEnv });
118
+ if (discovered.length > 0) {
119
+ checks.push({
120
+ code: "opencode_models_discovered",
121
+ level: "info",
122
+ message: `Discovered ${discovered.length} model(s) from OpenCode providers.`,
123
+ });
124
+ }
125
+ else {
126
+ checks.push({
127
+ code: "opencode_models_empty",
128
+ level: "error",
129
+ message: "OpenCode returned no models.",
130
+ hint: "Run `opencode models` and verify provider authentication.",
131
+ });
132
+ }
133
+ }
134
+ catch (err) {
135
+ const errMsg = err instanceof Error ? err.message : String(err);
136
+ if (/ProviderModelNotFoundError/i.test(errMsg)) {
137
+ checks.push({
138
+ code: "opencode_hello_probe_model_unavailable",
139
+ level: "warn",
140
+ message: "The configured model was not found by the provider.",
141
+ detail: errMsg,
142
+ hint: "Run `opencode models` and choose an available provider/model ID.",
143
+ });
144
+ }
145
+ else {
146
+ checks.push({
147
+ code: "opencode_models_discovery_failed",
148
+ level: "error",
149
+ message: errMsg || "OpenCode model discovery failed.",
150
+ hint: "Run `opencode models` manually to verify provider auth and config.",
151
+ });
152
+ }
153
+ }
154
+ }
155
+ else if (canRunProbe && !configuredModel) {
156
+ try {
157
+ const discovered = await discoverOpenCodeModels({ command, cwd, env: runtimeEnv });
158
+ if (discovered.length > 0) {
159
+ checks.push({
160
+ code: "opencode_models_discovered",
161
+ level: "info",
162
+ message: `Discovered ${discovered.length} model(s) from OpenCode providers.`,
163
+ });
164
+ }
165
+ }
166
+ catch (err) {
167
+ const errMsg = err instanceof Error ? err.message : String(err);
168
+ if (/ProviderModelNotFoundError/i.test(errMsg)) {
169
+ checks.push({
170
+ code: "opencode_hello_probe_model_unavailable",
171
+ level: "warn",
172
+ message: "The configured model was not found by the provider.",
173
+ detail: errMsg,
174
+ hint: "Run `opencode models` and choose an available provider/model ID.",
175
+ });
176
+ }
177
+ else {
178
+ checks.push({
179
+ code: "opencode_models_discovery_failed",
180
+ level: "warn",
181
+ message: errMsg || "OpenCode model discovery failed (best-effort, no model configured).",
182
+ hint: "Run `opencode models` manually to verify provider auth and config.",
183
+ });
184
+ }
185
+ }
186
+ }
187
+ const modelUnavailable = checks.some((check) => check.code === "opencode_hello_probe_model_unavailable");
188
+ if (!configuredModel && !modelUnavailable) {
189
+ // No model configured – skip model requirement if no model-related checks exist
190
+ }
191
+ else if (configuredModel && canRunProbe) {
192
+ try {
193
+ await ensureOpenCodeModelConfiguredAndAvailable({
194
+ model: configuredModel,
195
+ command,
196
+ cwd,
197
+ env: runtimeEnv,
198
+ });
199
+ checks.push({
200
+ code: "opencode_model_configured",
201
+ level: "info",
202
+ message: `Configured model: ${configuredModel}`,
203
+ });
204
+ modelValidationPassed = true;
205
+ }
206
+ catch (err) {
207
+ checks.push({
208
+ code: "opencode_model_invalid",
209
+ level: "error",
210
+ message: err instanceof Error ? err.message : "Configured model is unavailable.",
211
+ hint: "Run `opencode models` and choose a currently available provider/model ID.",
212
+ });
213
+ }
214
+ }
215
+ if (canRunProbe && modelValidationPassed) {
216
+ const extraArgs = (() => {
217
+ const fromExtraArgs = asStringArray(config.extraArgs);
218
+ if (fromExtraArgs.length > 0)
219
+ return fromExtraArgs;
220
+ return asStringArray(config.args);
221
+ })();
222
+ const variant = asString(config.variant, "").trim();
223
+ const probeModel = configuredModel;
224
+ const args = ["run", "--format", "json"];
225
+ args.push("--model", probeModel);
226
+ if (variant)
227
+ args.push("--variant", variant);
228
+ if (extraArgs.length > 0)
229
+ args.push(...extraArgs);
230
+ try {
231
+ const probe = await runChildProcess(`opencode-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`, command, args, {
232
+ cwd,
233
+ env: runtimeEnv,
234
+ timeoutSec: 60,
235
+ graceSec: 5,
236
+ stdin: "Respond with hello.",
237
+ onLog: async () => { },
238
+ });
239
+ const parsed = parseOpenCodeJsonl(probe.stdout);
240
+ const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
241
+ const authEvidence = `${parsed.errorMessage ?? ""}\n${probe.stdout}\n${probe.stderr}`.trim();
242
+ if (probe.timedOut) {
243
+ checks.push({
244
+ code: "opencode_hello_probe_timed_out",
245
+ level: "warn",
246
+ message: "OpenCode hello probe timed out.",
247
+ hint: "Retry the probe. If this persists, run OpenCode manually in this working directory.",
248
+ });
249
+ }
250
+ else if ((probe.exitCode ?? 1) === 0 && !parsed.errorMessage) {
251
+ const summary = parsed.summary.trim();
252
+ const hasHello = /\bhello\b/i.test(summary);
253
+ checks.push({
254
+ code: hasHello ? "opencode_hello_probe_passed" : "opencode_hello_probe_unexpected_output",
255
+ level: hasHello ? "info" : "warn",
256
+ message: hasHello
257
+ ? "OpenCode hello probe succeeded."
258
+ : "OpenCode probe ran but did not return `hello` as expected.",
259
+ ...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
260
+ ...(hasHello
261
+ ? {}
262
+ : {
263
+ hint: "Run `opencode run --format json` manually and prompt `Respond with hello` to inspect output.",
264
+ }),
265
+ });
266
+ }
267
+ else if (/ProviderModelNotFoundError/i.test(authEvidence)) {
268
+ checks.push({
269
+ code: "opencode_hello_probe_model_unavailable",
270
+ level: "warn",
271
+ message: "The configured model was not found by the provider.",
272
+ ...(detail ? { detail } : {}),
273
+ hint: "Run `opencode models` and choose an available provider/model ID.",
274
+ });
275
+ }
276
+ else if (OPENCODE_AUTH_REQUIRED_RE.test(authEvidence)) {
277
+ checks.push({
278
+ code: "opencode_hello_probe_auth_required",
279
+ level: "warn",
280
+ message: "OpenCode is installed, but provider authentication is not ready.",
281
+ ...(detail ? { detail } : {}),
282
+ hint: "Run `opencode auth login` or set provider credentials, then retry the probe.",
283
+ });
284
+ }
285
+ else {
286
+ checks.push({
287
+ code: "opencode_hello_probe_failed",
288
+ level: "error",
289
+ message: "OpenCode hello probe failed.",
290
+ ...(detail ? { detail } : {}),
291
+ hint: "Run `opencode run --format json` manually in this working directory to debug.",
292
+ });
293
+ }
294
+ }
295
+ catch (err) {
296
+ checks.push({
297
+ code: "opencode_hello_probe_failed",
298
+ level: "error",
299
+ message: "OpenCode hello probe failed.",
300
+ detail: err instanceof Error ? err.message : String(err),
301
+ hint: "Run `opencode run --format json` manually in this working directory to debug.",
302
+ });
303
+ }
304
+ }
305
+ }
306
+ finally {
307
+ await preparedRuntimeConfig.cleanup();
308
+ }
309
+ return {
310
+ adapterType: ctx.adapterType,
311
+ status: summarizeStatus(checks),
312
+ checks,
313
+ testedAt: new Date().toISOString(),
314
+ };
315
+ }
316
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CreateConfigValues } from "@penclipai/adapter-utils";
2
+ export declare function buildOpenCodeLocalConfig(v: CreateConfigValues): Record<string, unknown>;
3
+ //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAoDnE,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwBvF"}
@@ -0,0 +1,88 @@
1
+ function parseCommaArgs(value) {
2
+ return value
3
+ .split(",")
4
+ .map((item) => item.trim())
5
+ .filter(Boolean);
6
+ }
7
+ function parseEnvVars(text) {
8
+ const env = {};
9
+ for (const line of text.split(/\r?\n/)) {
10
+ const trimmed = line.trim();
11
+ if (!trimmed || trimmed.startsWith("#"))
12
+ continue;
13
+ const eq = trimmed.indexOf("=");
14
+ if (eq <= 0)
15
+ continue;
16
+ const key = trimmed.slice(0, eq).trim();
17
+ const value = trimmed.slice(eq + 1);
18
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
19
+ continue;
20
+ env[key] = value;
21
+ }
22
+ return env;
23
+ }
24
+ function parseEnvBindings(bindings) {
25
+ if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings))
26
+ return {};
27
+ const env = {};
28
+ for (const [key, raw] of Object.entries(bindings)) {
29
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
30
+ continue;
31
+ if (typeof raw === "string") {
32
+ env[key] = { type: "plain", value: raw };
33
+ continue;
34
+ }
35
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
36
+ continue;
37
+ const rec = raw;
38
+ if (rec.type === "plain" && typeof rec.value === "string") {
39
+ env[key] = { type: "plain", value: rec.value };
40
+ continue;
41
+ }
42
+ if (rec.type === "secret_ref" && typeof rec.secretId === "string") {
43
+ env[key] = {
44
+ type: "secret_ref",
45
+ secretId: rec.secretId,
46
+ ...(typeof rec.version === "number" || rec.version === "latest"
47
+ ? { version: rec.version }
48
+ : {}),
49
+ };
50
+ }
51
+ }
52
+ return env;
53
+ }
54
+ export function buildOpenCodeLocalConfig(v) {
55
+ const ac = {};
56
+ if (v.cwd)
57
+ ac.cwd = v.cwd;
58
+ if (v.instructionsFilePath)
59
+ ac.instructionsFilePath = v.instructionsFilePath;
60
+ if (v.promptTemplate)
61
+ ac.promptTemplate = v.promptTemplate;
62
+ if (v.bootstrapPrompt)
63
+ ac.bootstrapPromptTemplate = v.bootstrapPrompt;
64
+ if (v.model)
65
+ ac.model = v.model;
66
+ if (v.thinkingEffort)
67
+ ac.variant = v.thinkingEffort;
68
+ ac.dangerouslySkipPermissions = v.dangerouslySkipPermissions;
69
+ // OpenCode sessions can run until the CLI exits naturally; keep timeout disabled (0)
70
+ // and rely on graceSec for termination handling when a timeout is configured elsewhere.
71
+ ac.timeoutSec = 0;
72
+ ac.graceSec = 20;
73
+ const env = parseEnvBindings(v.envBindings);
74
+ const legacy = parseEnvVars(v.envVars);
75
+ for (const [key, value] of Object.entries(legacy)) {
76
+ if (!Object.prototype.hasOwnProperty.call(env, key)) {
77
+ env[key] = { type: "plain", value };
78
+ }
79
+ }
80
+ if (Object.keys(env).length > 0)
81
+ ac.env = env;
82
+ if (v.command)
83
+ ac.command = v.command;
84
+ if (v.extraArgs)
85
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
86
+ return ac;
87
+ }
88
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenCodeStdoutLine } from "./parse-stdout.js";
2
+ export { buildOpenCodeLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenCodeStdoutLine } from "./parse-stdout.js";
2
+ export { buildOpenCodeLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@penclipai/adapter-utils";
2
+ export declare function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEntry[];
3
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAsFhE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAiEnF"}