@gendigital/sage-opencode 0.14.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 +14 -2
- package/dist/extractors.d.ts +7 -0
- package/dist/extractors.d.ts.map +1 -1
- package/dist/extractors.js +89 -16
- package/dist/extractors.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -320
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.cjs +42 -10
- package/dist/mcp-server.cjs.map +4 -4
- package/dist/plugin-discovery.d.ts +7 -0
- package/dist/plugin-discovery.d.ts.map +1 -1
- package/dist/plugin-discovery.js +46 -11
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/shared.d.ts +63 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +352 -0
- package/dist/shared.js.map +1 -0
- package/dist/tool-handler.d.ts +6 -0
- package/dist/tool-handler.d.ts.map +1 -1
- package/dist/tool-handler.js +22 -4
- package/dist/tool-handler.js.map +1 -1
- package/dist/v2-types.d.ts +95 -0
- package/dist/v2-types.d.ts.map +1 -0
- package/dist/v2-types.js +10 -0
- package/dist/v2-types.js.map +1 -0
- package/dist/v2.d.ts +24 -0
- package/dist/v2.d.ts.map +1 -0
- package/dist/v2.js +151 -0
- package/dist/v2.js.map +1 -0
- package/index.js +3 -0
- package/package.json +4 -3
- package/resources/threats/credentials.yaml +1 -1
- package/resources/threats/dummy.yaml +37 -4
- package/resources/threats/prompt-injection.yaml +13 -0
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.
|
package/dist/extractors.d.ts
CHANGED
|
@@ -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
|
package/dist/extractors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/extractors.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 "
|
|
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 =
|
|
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;
|
package/dist/extractors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractors.js","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"AAAA
|
|
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
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|