@gendigital/sage-opencode 0.13.0 → 0.15.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.md CHANGED
@@ -38,16 +38,26 @@ Add the plugin to your OpenCode config (`~/.config/opencode/opencode.json`):
38
38
  }
39
39
  ```
40
40
 
41
+ OpenCode v2 (beta) uses the `plugins` key instead — the same package works on both:
42
+
43
+ ```json
44
+ {
45
+ "plugins": ["@gendigital/sage-opencode"]
46
+ }
47
+ ```
48
+
41
49
  Or [build from source](https://github.com/gendigitalinc/sage/blob/main/docs/user-guide.md#opencode).
42
50
 
51
+ For OpenCode v2 source installs, add the built package directory to `plugins` in `opencode.jsonc`. The root `index.js` is required for local directory loading. Verify with `opencode plugin list`; it should show `@gendigital/sage-opencode`.
52
+
43
53
  > To verify it's working, ask your agent to run `echo diagmark_cmd_a75bf229`. Sage should block this harmless canary command.
44
54
 
45
55
  ## What Sage intercepts
46
56
 
47
57
  Sage hooks into OpenCode's plugin system:
48
58
 
49
- - **bash** — shell commands
50
- - **write / edit** — file modifications
59
+ - **bash** (v2: **shell**) — shell commands
60
+ - **write / edit** (v2 also **patch**) — file modifications
51
61
  - **read** — file reads (sensitive paths)
52
62
  - **webfetch** — URL fetches and downloads
53
63
  - **ls / glob / grep** — file system operations
@@ -64,6 +74,8 @@ When your agent makes a tool call, Sage evaluates it and returns a verdict:
64
74
 
65
75
  For `ask` verdicts, Sage blocks the tool call and the agent calls `sage_approve({ actionId })`, which surfaces OpenCode's native approval dialog. If you approve, the agent retries the original tool call.
66
76
 
77
+ On OpenCode v2, `sage_approve` asks through OpenCode's native permission prompt. Approve the `sage_approval` request to allow the flagged call with the same arguments; rejecting it keeps the action blocked. The permission prompt does not save an "always allow" rule. v2 server plugins have no toast API yet, so Sage's notifications (blocked actions, risky skills) go to the Sage operational log instead of the TUI.
78
+
67
79
  Sage is designed to fail open: if anything goes wrong internally, the action proceeds. Your agent is never blocked due to a Sage error.
68
80
 
69
81
  > **Note:** In `paranoid` sensitivity mode, `ask` verdicts are promoted to `deny` on OpenCode. This prevents prompt-injection attacks from auto-approving flagged actions.
@@ -1,6 +1,13 @@
1
1
  /**
2
2
  * OpenCode tool input extraction mapped onto @gendigital/sage-core artifact extractors.
3
+ *
4
+ * Covers both host generations: v1 tools (`bash`, camelCase `filePath`) and v2
5
+ * tools (`shell`, `patch`, `subagent`, `path` for file tools).
3
6
  */
4
7
  import { type Artifact } from "@gendigital/sage-core";
8
+ /** Primary file path argument (`path` on v2, `filePath` on v1). */
9
+ export declare function openCodeFilePath(args: Record<string, unknown>): string;
10
+ /** Both aliases may be present in a malformed or host-transformed call. */
11
+ export declare function openCodePatchTexts(args: Record<string, unknown>): string[];
5
12
  export declare function extractFromOpenCodeTool(toolName: string, args: Record<string, unknown>): Artifact[] | null;
6
13
  //# sourceMappingURL=extractors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACN,KAAK,QAAQ,EAKb,MAAM,uBAAuB,CAAC;AAU/B,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,QAAQ,EAAE,GAAG,IAAI,CA2FnB"}
1
+ {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACN,KAAK,QAAQ,EAOb,MAAM,uBAAuB,CAAC;AAwB/B,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEtE;AA4CD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAM1E;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,QAAQ,EAAE,GAAG,IAAI,CA8GnB"}
@@ -1,16 +1,87 @@
1
1
  /**
2
2
  * OpenCode tool input extraction mapped onto @gendigital/sage-core artifact extractors.
3
+ *
4
+ * Covers both host generations: v1 tools (`bash`, camelCase `filePath`) and v2
5
+ * tools (`shell`, `patch`, `subagent`, `path` for file tools).
3
6
  */
4
- import { extractFromBash, extractFromEdit, extractFromWebFetch, extractFromWrite, } from "@gendigital/sage-core";
7
+ import { extractFromBash, extractFromEdit, extractFromWebFetch, extractFromWrite, extractUrls, MAX_CONTENT_SIZE, } from "@gendigital/sage-core";
5
8
  function asString(value) {
6
9
  return typeof value === "string" ? value : undefined;
7
10
  }
8
11
  function asNumber(value) {
9
12
  return typeof value === "number" ? value : undefined;
10
13
  }
14
+ /**
15
+ * File path arguments, deduplicated: v2 uses `path`, v1 uses `filePath`. The
16
+ * v2 key comes first. A payload carrying both (malformed, adversarial or
17
+ * host-transformed) yields both, so every path the tool might act on gets
18
+ * evaluated instead of Sage guessing which one the host will use.
19
+ */
20
+ function openCodeFilePaths(args) {
21
+ const paths = [];
22
+ for (const value of [asString(args.path), asString(args.filePath)]) {
23
+ if (value && !paths.includes(value))
24
+ paths.push(value);
25
+ }
26
+ return paths;
27
+ }
28
+ /** Primary file path argument (`path` on v2, `filePath` on v1). */
29
+ export function openCodeFilePath(args) {
30
+ return openCodeFilePaths(args)[0] ?? "";
31
+ }
32
+ /** Append artifacts for any secondary file path in an ambiguous payload. */
33
+ function withAlternatePaths(artifacts, args, context) {
34
+ for (const value of openCodeFilePaths(args).slice(1)) {
35
+ artifacts.push({ type: "file_path", value, context });
36
+ }
37
+ return artifacts;
38
+ }
39
+ /**
40
+ * Extract artifacts from a v2 `patch` call. `patchText` uses the
41
+ * `*** Begin Patch` envelope with Add/Update/Delete File headers and
42
+ * optional `*** Move to:` / `*** Rename File:` renames (`old -> new` emits
43
+ * both paths).
44
+ */
45
+ function extractFromPatch(patchText) {
46
+ if (!patchText)
47
+ return null;
48
+ const artifacts = [];
49
+ for (const match of patchText.matchAll(/\*{3}\s+(?:Add|Update|Delete)\s+File:\s*(.+)/g)) {
50
+ const filePath = match[1]?.trim();
51
+ if (filePath)
52
+ artifacts.push({ type: "file_path", value: filePath, context: "edit" });
53
+ }
54
+ for (const match of patchText.matchAll(/\*{3}\s+(?:Move\s+to|Rename\s+File):\s*(.+)/gi)) {
55
+ const raw = match[1]?.trim() ?? "";
56
+ const arrow = raw.indexOf(" -> ");
57
+ const targets = arrow === -1 ? [raw] : [raw.slice(0, arrow), raw.slice(arrow + 4)];
58
+ for (const target of targets) {
59
+ const filePath = target.trim();
60
+ if (filePath)
61
+ artifacts.push({ type: "file_path", value: filePath, context: "edit" });
62
+ }
63
+ }
64
+ const capped = patchText.slice(0, MAX_CONTENT_SIZE);
65
+ for (const url of extractUrls(capped)) {
66
+ artifacts.push({ type: "url", value: url, context: "from_edit_content" });
67
+ }
68
+ if (capped.trim())
69
+ artifacts.push({ type: "content", value: capped, context: "edit" });
70
+ return artifacts.length > 0 ? artifacts : null;
71
+ }
72
+ /** Both aliases may be present in a malformed or host-transformed call. */
73
+ export function openCodePatchTexts(args) {
74
+ const patches = [];
75
+ for (const value of [asString(args.patchText), asString(args.patch)]) {
76
+ if (value !== undefined && !patches.includes(value))
77
+ patches.push(value);
78
+ }
79
+ return patches;
80
+ }
11
81
  export function extractFromOpenCodeTool(toolName, args) {
12
82
  switch (toolName) {
13
- case "bash": {
83
+ case "bash":
84
+ case "shell": {
14
85
  const command = asString(args.command) ?? "";
15
86
  return command ? extractFromBash(command) : null;
16
87
  }
@@ -19,29 +90,26 @@ export function extractFromOpenCodeTool(toolName, args) {
19
90
  return url ? extractFromWebFetch({ url }) : null;
20
91
  }
21
92
  case "write": {
22
- const filePath = asString(args.filePath) ?? "";
93
+ const filePath = openCodeFilePath(args);
23
94
  if (!filePath)
24
95
  return null;
25
- return extractFromWrite({
26
- file_path: filePath,
27
- content: asString(args.content) ?? "",
28
- });
96
+ return withAlternatePaths(extractFromWrite({ file_path: filePath, content: asString(args.content) ?? "" }), args, "write");
29
97
  }
30
98
  case "edit": {
31
- const filePath = asString(args.filePath) ?? "";
99
+ const filePath = openCodeFilePath(args);
32
100
  if (!filePath)
33
101
  return null;
34
- return extractFromEdit({
102
+ return withAlternatePaths(extractFromEdit({
35
103
  file_path: filePath,
36
104
  old_string: asString(args.oldString) ?? "",
37
105
  new_string: asString(args.newString) ?? "",
38
- });
106
+ }), args, "edit");
39
107
  }
40
108
  case "read": {
41
- const filePath = asString(args.filePath) ?? "";
109
+ const filePath = openCodeFilePath(args);
42
110
  if (!filePath)
43
111
  return null;
44
- return [{ type: "file_path", value: filePath, context: "read" }];
112
+ return withAlternatePaths([{ type: "file_path", value: filePath, context: "read" }], args, "read");
45
113
  }
46
114
  case "glob": {
47
115
  const pattern = asString(args.pattern) ?? "";
@@ -84,25 +152,30 @@ export function extractFromOpenCodeTool(toolName, args) {
84
152
  return null;
85
153
  return [{ type: "content", value: joined, context: "question_options" }];
86
154
  }
87
- case "task": {
155
+ case "patch": {
156
+ const artifacts = openCodePatchTexts(args).flatMap((value) => extractFromPatch(value) ?? []);
157
+ return artifacts.length > 0 ? artifacts : null;
158
+ }
159
+ case "task":
160
+ case "subagent": {
88
161
  const prompt = asString(args.prompt) ?? "";
89
162
  const desc = asString(args.description) ?? "";
90
163
  const payload = [desc, prompt].filter(Boolean).join("\n\n");
91
164
  return payload ? [{ type: "content", value: payload, context: "task" }] : null;
92
165
  }
93
166
  case "read_lines": {
94
- const filePath = asString(args.filePath) ?? "";
167
+ const filePath = openCodeFilePath(args);
95
168
  if (!filePath)
96
169
  return null;
97
170
  const offset = asNumber(args.offset);
98
171
  const limit = asNumber(args.limit);
99
- return [
172
+ return withAlternatePaths([
100
173
  {
101
174
  type: "file_path",
102
175
  value: `${filePath}:${offset ?? 1}:${limit ?? 0}`,
103
176
  context: "read_lines",
104
177
  },
105
- ];
178
+ ], args, "read_lines");
106
179
  }
107
180
  default:
108
181
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"extractors.js","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extractors.js","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,29 @@
1
1
  /**
2
2
  * Sage OpenCode plugin.
3
3
  * Intercepts tool calls and uses @gendigital/sage-core to enforce security verdicts.
4
+ *
5
+ * One entry point serves both OpenCode generations:
6
+ * - v1 (`opencode` 1.x) reads `default.server` (the `{ id, server }` module
7
+ * shape) and calls it with `(input, options)`.
8
+ * - v2 (opencode2 / `@opencode-ai/core`) decodes `default` as `{ id, setup }`
9
+ * and calls `setup(context)`; extra keys are ignored by both loaders.
10
+ *
11
+ * The default export must stay a plain object: v2 rejects a function there.
12
+ * Keep every other export a v1 plugin function — legacy v1 loaders call each
13
+ * module export as a plugin and throw on anything else.
4
14
  */
5
15
  import type { Plugin } from "@opencode-ai/plugin";
16
+ import { setupV2 } from "./v2.js";
17
+ /** OpenCode v1 plugin function (`(input, options) => Hooks`). */
6
18
  export declare const SagePlugin: Plugin;
7
- export default SagePlugin;
19
+ /**
20
+ * Dual-host plugin definition: `server` for OpenCode v1, `setup` for v2,
21
+ * both behind the same stable `id`.
22
+ */
23
+ declare const sagePluginModule: {
24
+ id: string;
25
+ server: Plugin;
26
+ setup: typeof setupV2;
27
+ };
28
+ export default sagePluginModule;
8
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAmLlD,eAAO,MAAM,UAAU,EAAE,MAyOxB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAUlD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,iEAAiE;AACjE,eAAO,MAAM,UAAU,EAAE,MA+DxB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;CAIrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}