@tagma/sdk 0.7.102 → 0.7.103
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 +10 -3
- package/dist/drivers/opencode.d.ts.map +1 -1
- package/dist/drivers/opencode.js +62 -1
- package/dist/drivers/opencode.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -220,13 +220,20 @@ Each hook value can be a single command string or an array of commands.
|
|
|
220
220
|
|
|
221
221
|
| Field | Type | Default | Description |
|
|
222
222
|
| --------- | --------- | ------- | -------------------------------------------------- |
|
|
223
|
-
| `read` | `boolean` |
|
|
224
|
-
| `write` | `boolean` |
|
|
225
|
-
| `execute` | `boolean` |
|
|
223
|
+
| `read` | `boolean` | `true` | Allow the AI driver/agent to read files |
|
|
224
|
+
| `write` | `boolean` | `false` | Allow the AI driver/agent to write files |
|
|
225
|
+
| `execute` | `boolean` | `false` | Allow the AI driver/agent to execute tool commands |
|
|
226
226
|
|
|
227
227
|
`permissions` are passed to AI drivers that support them. They do not sandbox
|
|
228
228
|
YAML `command` tasks; command tasks execute through the host shell.
|
|
229
229
|
|
|
230
|
+
The built-in OpenCode driver maps denied capabilities to a task-scoped OpenCode policy. In
|
|
231
|
+
particular, `execute: false` disables Bash and delegated agents for that task. This is tool-policy
|
|
232
|
+
enforcement, not an operating-system sandbox: when `execute: true` grants a host shell, that shell
|
|
233
|
+
can itself read and write files regardless of the `read` and `write` bits. Prefer the monotonic
|
|
234
|
+
tiers none, read-only, read/write without shell, or full access. Third-party drivers must document
|
|
235
|
+
whether and how they enforce these fields.
|
|
236
|
+
|
|
230
237
|
### Inheritance
|
|
231
238
|
|
|
232
239
|
Fields are inherited top-down: **pipeline -> track -> task**. A value set at a lower level overrides the inherited value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/drivers/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/drivers/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAQb,MAAM,cAAc,CAAC;AAoFtB,eAAO,MAAM,cAAc,EAAE,YAkM5B,CAAC"}
|
package/dist/drivers/opencode.js
CHANGED
|
@@ -1,4 +1,45 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
const DEFAULT_MODEL = 'opencode/big-pickle';
|
|
3
|
+
const TAGMA_PIPELINE_TASK_AGENT_PREFIX = 'tagma-pipeline-task-';
|
|
4
|
+
const DEFAULT_PERMISSIONS = { read: true, write: false, execute: false };
|
|
5
|
+
function buildPermissionRestrictions(permissions) {
|
|
6
|
+
const policy = {};
|
|
7
|
+
if (!permissions.read) {
|
|
8
|
+
for (const tool of ['read', 'glob', 'grep', 'list', 'lsp', 'skill'])
|
|
9
|
+
policy[tool] = 'deny';
|
|
10
|
+
}
|
|
11
|
+
if (!permissions.write) {
|
|
12
|
+
policy.edit = 'deny';
|
|
13
|
+
// These Editor-managed authoring tools can persist chat staging state and
|
|
14
|
+
// are not ordinary pipeline-task capabilities.
|
|
15
|
+
policy.tagma_yaml_skeleton = 'deny';
|
|
16
|
+
policy.tagma_placement_plan = 'deny';
|
|
17
|
+
policy.tagma_trial_plan = 'deny';
|
|
18
|
+
}
|
|
19
|
+
if (!permissions.execute)
|
|
20
|
+
policy.bash = 'deny';
|
|
21
|
+
// A delegated agent has its own tool policy, so allowing `task` would let a
|
|
22
|
+
// restricted prompt escape the current task's read/write/execute envelope.
|
|
23
|
+
if (!permissions.read || !permissions.write || !permissions.execute)
|
|
24
|
+
policy.task = 'deny';
|
|
25
|
+
return policy;
|
|
26
|
+
}
|
|
27
|
+
function buildRestrictedTaskEnv(restrictions, taskAgentName) {
|
|
28
|
+
const config = {
|
|
29
|
+
default_agent: taskAgentName,
|
|
30
|
+
agent: {
|
|
31
|
+
[taskAgentName]: {
|
|
32
|
+
description: 'Execute one Tagma pipeline prompt task with task-scoped permissions.',
|
|
33
|
+
mode: 'primary',
|
|
34
|
+
permission: restrictions,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
OPENCODE_PERMISSION: JSON.stringify(restrictions),
|
|
40
|
+
OPENCODE_CONFIG_CONTENT: JSON.stringify(config),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
2
43
|
// NOTE on Windows multi-line prompts: `opencode` resolves to `opencode.cmd`,
|
|
3
44
|
// an npm-generated batch wrapper. cmd.exe silently truncates argv elements
|
|
4
45
|
// at the first newline, so a multi-line prompt reaches the model as only
|
|
@@ -46,6 +87,9 @@ export const OpenCodeDriver = {
|
|
|
46
87
|
sessionResume: true, // supports --session
|
|
47
88
|
systemPrompt: false, // no --system-prompt flag; prepend to prompt instead
|
|
48
89
|
outputFormat: true, // supports --format json
|
|
90
|
+
// Standard OpenCode tools are restricted below. Keep this coarse capability
|
|
91
|
+
// false because arbitrary project/MCP tools are outside Tagma's three-bit
|
|
92
|
+
// permission vocabulary and must not be advertised as fully sandboxed.
|
|
49
93
|
enforcesPermissions: false,
|
|
50
94
|
},
|
|
51
95
|
resolveModel() {
|
|
@@ -63,6 +107,12 @@ export const OpenCodeDriver = {
|
|
|
63
107
|
? EFFORT_TO_VARIANT[rawEffort]
|
|
64
108
|
: rawEffort
|
|
65
109
|
: null;
|
|
110
|
+
const permissions = task.permissions ?? track.permissions ?? DEFAULT_PERMISSIONS;
|
|
111
|
+
const permissionRestrictions = buildPermissionRestrictions(permissions);
|
|
112
|
+
const restricted = Object.keys(permissionRestrictions).length > 0;
|
|
113
|
+
const taskAgentName = restricted
|
|
114
|
+
? `${TAGMA_PIPELINE_TASK_AGENT_PREFIX}${randomUUID().replaceAll('-', '')}`
|
|
115
|
+
: null;
|
|
66
116
|
let prompt = task.prompt;
|
|
67
117
|
// agent_profile has no dedicated flag; prepend to prompt
|
|
68
118
|
const profile = task.agent_profile ?? track.agent_profile;
|
|
@@ -106,13 +156,24 @@ export const OpenCodeDriver = {
|
|
|
106
156
|
if (variant) {
|
|
107
157
|
args.push('--variant', variant);
|
|
108
158
|
}
|
|
159
|
+
// OpenCode applies agent-specific rules after its top-level permission
|
|
160
|
+
// policy. Select a Tagma-owned agent carrying the same deny policy so a
|
|
161
|
+
// user-defined build agent cannot turn a denied tool back on.
|
|
162
|
+
if (taskAgentName)
|
|
163
|
+
args.push('--agent', taskAgentName);
|
|
109
164
|
// session resume (must appear before --)
|
|
110
165
|
if (sessionId) {
|
|
111
166
|
args.push('--session', sessionId);
|
|
112
167
|
}
|
|
113
168
|
// `--` (POSIX end-of-options) isolates prompt from flag parsing
|
|
114
169
|
args.push('--', prompt);
|
|
115
|
-
return {
|
|
170
|
+
return {
|
|
171
|
+
args,
|
|
172
|
+
cwd: task.cwd ?? ctx.workDir,
|
|
173
|
+
...(taskAgentName
|
|
174
|
+
? { env: buildRestrictedTaskEnv(permissionRestrictions, taskAgentName) }
|
|
175
|
+
: {}),
|
|
176
|
+
};
|
|
116
177
|
},
|
|
117
178
|
parseResult(stdout) {
|
|
118
179
|
// opencode --format json emits NDJSON: one JSON object per line
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/drivers/opencode.ts"],"names":[],"mappings":"AAUA,MAAM,aAAa,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/drivers/opencode.ts"],"names":[],"mappings":"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"}
|