@stratusagent/permissions 0.10.0 → 0.11.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/dist/commands.d.ts +26 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +120 -4
- package/dist/commands.js.map +1 -1
- package/dist/index.d.ts +64 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +260 -25
- package/dist/index.js.map +1 -1
- package/dist/origins.d.ts +72 -0
- package/dist/origins.d.ts.map +1 -0
- package/dist/origins.js +73 -0
- package/dist/origins.js.map +1 -0
- package/dist/whitelist.d.ts +39 -8
- package/dist/whitelist.d.ts.map +1 -1
- package/dist/whitelist.js +136 -29
- package/dist/whitelist.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { atLeastAsRisky } from '@stratusagent/core';
|
|
7
7
|
import { analyzeCommand, describeCommandScope, findMatchingScope, normalizeCommandScope, SAFE_COMMAND_SCOPES, } from "./commands.js";
|
|
8
|
+
import { describeOriginScope, findMatchingOriginScope, originScopeFor, } from "./origins.js";
|
|
9
|
+
import { WhitelistUnreadableError, } from "./whitelist.js";
|
|
8
10
|
export { analyzeCommand, describeCommandScope, findMatchingScope, matchesScope, normalizeCommandScope, parseCommandScope, sameScope, SAFE_COMMAND_SCOPES, } from "./commands.js";
|
|
9
|
-
export {
|
|
11
|
+
export { describeOriginScope, findMatchingOriginScope, matchesOriginScope, originScopeFor, parseOriginScope, sameOriginScope, } from "./origins.js";
|
|
12
|
+
export { createFileCommandWhitelist, whitelistPathFor, WhitelistUnreadableError, } from "./whitelist.js";
|
|
10
13
|
const YES = new Set(['y', 'yes', 'always', 'a']);
|
|
11
14
|
const ALWAYS = new Set(['always', 'a']);
|
|
12
15
|
const ABORTED = Symbol('aborted');
|
|
@@ -118,7 +121,13 @@ const summarizeInput = (input) => {
|
|
|
118
121
|
* text from a person mid-typing, so it is read leniently and anything that
|
|
119
122
|
* is not recognisably a yes is a no.
|
|
120
123
|
*/
|
|
121
|
-
const awaitPrompt = async (context, ask, command
|
|
124
|
+
const awaitPrompt = async (context, ask, command, origin,
|
|
125
|
+
/**
|
|
126
|
+
* What answering "always" will actually do, decided by the caller — which
|
|
127
|
+
* is the only place that knows. Offering a lifetime the engine will not
|
|
128
|
+
* create is the same defect as hiding one it will.
|
|
129
|
+
*/
|
|
130
|
+
alwaysMeans) => {
|
|
122
131
|
const { call, risk, session } = context;
|
|
123
132
|
// The command, when there is one: for a shell call the tool name is the
|
|
124
133
|
// least interesting half of the question, and an approver shown only
|
|
@@ -130,13 +139,16 @@ const awaitPrompt = async (context, ask, command) => {
|
|
|
130
139
|
// there is no command scope to show, fall back to a compact rendering of
|
|
131
140
|
// the call's input, exactly as the remote (Slack) prompt already does.
|
|
132
141
|
const argumentSummary = command === undefined ? summarizeInput(call.input) : undefined;
|
|
142
|
+
// The origin goes in front of the arguments rather than into them: a
|
|
143
|
+
// selector says nothing about where a click lands, and this is the half
|
|
144
|
+
// of the question "always" widens.
|
|
145
|
+
const acting = origin === undefined ? call.toolName : `${call.toolName} on ${origin}`;
|
|
133
146
|
const what = command !== undefined
|
|
134
147
|
? `${call.toolName}: ${command}`
|
|
135
148
|
: argumentSummary !== undefined
|
|
136
|
-
? `${
|
|
137
|
-
: `${
|
|
138
|
-
const
|
|
139
|
-
const pending = ask(`Allow ${what} for ${session.agent.name}? [y]es / [a]lways (${always}) / [N]o: `);
|
|
149
|
+
? `${acting} (${risk}): ${argumentSummary}`
|
|
150
|
+
: `${acting} (${risk})`;
|
|
151
|
+
const pending = ask(`Allow ${what} for ${session.agent.name}? [y]es / [a]lways (${alwaysMeans}) / [N]o: `);
|
|
140
152
|
// The answer is never read after this point if the turn ends first,
|
|
141
153
|
// so a late yes cannot execute a tool for work that no longer exists.
|
|
142
154
|
pending.catch(() => undefined);
|
|
@@ -161,12 +173,14 @@ const awaitPrompt = async (context, ask, command) => {
|
|
|
161
173
|
* its call was not approved and carry on, not crash on the machinery that
|
|
162
174
|
* was supposed to ask.
|
|
163
175
|
*/
|
|
164
|
-
const awaitRemote = async (context, request) => {
|
|
176
|
+
const awaitRemote = async (context, request, origin, oneShot) => {
|
|
165
177
|
const pending = request({
|
|
166
178
|
session: context.session,
|
|
167
179
|
call: context.call,
|
|
168
180
|
tool: context.tool,
|
|
169
181
|
risk: context.risk,
|
|
182
|
+
...(origin !== undefined ? { origin } : {}),
|
|
183
|
+
...(oneShot ? { oneShot } : {}),
|
|
170
184
|
...(context.parkedAt ? { parkedAt: context.parkedAt } : {}),
|
|
171
185
|
...(context.signal ? { signal: context.signal } : {}),
|
|
172
186
|
}).then((answer) => answer, () => 'deny');
|
|
@@ -183,9 +197,14 @@ const awaitRemote = async (context, request) => {
|
|
|
183
197
|
* after which there is nothing left but asking. A `dangerous` tool skips
|
|
184
198
|
* the scope engine entirely: its risk is a statement about the tool, and no
|
|
185
199
|
* argument shape makes `rm -rf` a read.
|
|
200
|
+
*
|
|
201
|
+
* A tool that names an *origin* (`Tool.originFor`) resolves through the
|
|
202
|
+
* same two grant tiers over a different vocabulary — the site the page is
|
|
203
|
+
* on, rather than the command the call would run. It has no third tier,
|
|
204
|
+
* because there is no origin that is safe to click on out of the box.
|
|
186
205
|
*/
|
|
187
206
|
export const createPermissionPolicy = (options) => {
|
|
188
|
-
const { mode, ask, request, onDecision, commands, destinations } = options;
|
|
207
|
+
const { mode, ask, request, onDecision, commands, destinations, origins } = options;
|
|
189
208
|
if (mode === 'interactive' && !ask) {
|
|
190
209
|
throw new Error('interactive permission mode needs an `ask` function to reach a human.');
|
|
191
210
|
}
|
|
@@ -201,7 +220,9 @@ export const createPermissionPolicy = (options) => {
|
|
|
201
220
|
// with no whitelist store still has to remember an answer for the rest of
|
|
202
221
|
// the session, which is what `always` means at a terminal.
|
|
203
222
|
const sessionScopes = new Map();
|
|
204
|
-
|
|
223
|
+
/** The same tier for origins, and for the same reason. */
|
|
224
|
+
const sessionOrigins = new Map();
|
|
225
|
+
const report = (context, allowed, reason, command, destination, origin) => {
|
|
205
226
|
onDecision?.({
|
|
206
227
|
allowed,
|
|
207
228
|
mode,
|
|
@@ -212,6 +233,7 @@ export const createPermissionPolicy = (options) => {
|
|
|
212
233
|
reason,
|
|
213
234
|
...(command === undefined ? {} : { command }),
|
|
214
235
|
...(destination === undefined ? {} : { destination }),
|
|
236
|
+
...(origin === undefined ? {} : { origin }),
|
|
215
237
|
});
|
|
216
238
|
return allowed;
|
|
217
239
|
};
|
|
@@ -225,8 +247,78 @@ export const createPermissionPolicy = (options) => {
|
|
|
225
247
|
// its arguments. Resolved before anything else so that the tool-wide
|
|
226
248
|
// "always" below can never apply to it: one yes to `git status` must
|
|
227
249
|
// not become a standing yes to every command the shell can run.
|
|
228
|
-
|
|
250
|
+
// A tool that offers more than one scope hook is judged by none of
|
|
251
|
+
// them, and asks like any other gated call.
|
|
252
|
+
//
|
|
253
|
+
// Each hook narrows a call along one axis — what it runs, where it
|
|
254
|
+
// sends, what site it acts on — and each grant answers only its own
|
|
255
|
+
// question. Composing them needs a decision nobody has made: a call
|
|
256
|
+
// with two axes could reasonably need every applicable scope to
|
|
257
|
+
// authorize it, or the narrowest, and picking silently is how a
|
|
258
|
+
// grant on one axis waves through a call unapproved on the other.
|
|
259
|
+
// Falling back to a human is the answer that cannot be wrong while
|
|
260
|
+
// that decision is unmade.
|
|
261
|
+
//
|
|
262
|
+
// Nothing offers two today (`shell.run` a command, `message.send` a
|
|
263
|
+
// destination, `browser.act` an origin), so this changes nothing now
|
|
264
|
+
// — it is here so that adding one cannot quietly open that door. The
|
|
265
|
+
// guard first covered only `commandFor`, and left exactly this hole
|
|
266
|
+
// for `destinationFor`; one rule over all three has no such corner.
|
|
267
|
+
const scopeHooks = [
|
|
268
|
+
context.tool.commandFor,
|
|
269
|
+
context.tool.destinationFor,
|
|
270
|
+
context.tool.originFor,
|
|
271
|
+
].filter((hook) => hook !== undefined).length;
|
|
272
|
+
const singlyScoped = scopeHooks <= 1;
|
|
273
|
+
// Turning the scope engines off is only half of it. The tool-wide
|
|
274
|
+
// "always" is what a tool with no scope at all falls back to, and
|
|
275
|
+
// letting a multi-hook tool reach it would be worse than the hole
|
|
276
|
+
// this rule closed: one yes, and then a session of unattended calls
|
|
277
|
+
// with neither scope consulted. A tool that asked to be judged by a
|
|
278
|
+
// scope does not get to be judged by nothing instead.
|
|
279
|
+
const multiplyScoped = scopeHooks > 1;
|
|
280
|
+
const command = risk === 'gated' && singlyScoped
|
|
281
|
+
? context.tool.commandFor?.(call.input)
|
|
282
|
+
: undefined;
|
|
229
283
|
const analysis = command === undefined ? undefined : analyzeCommand(command);
|
|
284
|
+
// Whether this tool is judged by *where* it acts, and where it is
|
|
285
|
+
// acting right now. `gated` only, for the reason a destination cannot
|
|
286
|
+
// launder a `dangerous` call either: a scope narrows a tool whose
|
|
287
|
+
// risk lives in its arguments, and `dangerous` is a statement about
|
|
288
|
+
// the tool itself.
|
|
289
|
+
//
|
|
290
|
+
// The two are separate on purpose. `scopedByOrigin` is true for any
|
|
291
|
+
// tool that offers the hook, even on a call where it answers nothing
|
|
292
|
+
// — a page that has not loaded, one closed by the idle sweep — and it
|
|
293
|
+
// is what bars the tool-wide "always" below. Without that, a click
|
|
294
|
+
// approved on a page whose origin could not be named would fall back
|
|
295
|
+
// to a standing yes to `browser.act` on every site, which is exactly
|
|
296
|
+
// the grant per-origin scopes exist to replace.
|
|
297
|
+
const scopedByOrigin = risk === 'gated'
|
|
298
|
+
&& singlyScoped
|
|
299
|
+
&& context.tool.originFor !== undefined;
|
|
300
|
+
// The grants first, and where the page is *after* them. Read the
|
|
301
|
+
// other way round, the store's disk read sits between the two, and a
|
|
302
|
+
// page that redirects inside it has a grant for site A allow a click
|
|
303
|
+
// on site B — the same shape as the approval wait below, with a
|
|
304
|
+
// shorter gap and no bound on it at all when the store is somebody
|
|
305
|
+
// else's. There is no await between this read and the match, so the
|
|
306
|
+
// origin a grant is checked against is where the conversation is when
|
|
307
|
+
// the decision is made, not where it was.
|
|
308
|
+
const grantedOrigins = scopedByOrigin
|
|
309
|
+
? [
|
|
310
|
+
...(sessionOrigins.get(session.agent.id) ?? []),
|
|
311
|
+
...(origins?.whitelist ? await origins.whitelist.originsFor(session.agent.id) : []),
|
|
312
|
+
]
|
|
313
|
+
: [];
|
|
314
|
+
const reportedOrigin = scopedByOrigin ? context.tool.originFor?.(session) : undefined;
|
|
315
|
+
// Read through the same normalizer a grant file is read through,
|
|
316
|
+
// rather than taken as written. The hook's contract is an origin, but
|
|
317
|
+
// this is what a grant is compared against — a plugin that hands back
|
|
318
|
+
// a whole page URL should get a grant on its origin, not one that
|
|
319
|
+
// silently never matches anything.
|
|
320
|
+
const originScope = reportedOrigin === undefined ? undefined : originScopeFor(reportedOrigin);
|
|
321
|
+
const origin = originScope?.origin;
|
|
230
322
|
if (analysis) {
|
|
231
323
|
if (analysis.disqualifiedBy) {
|
|
232
324
|
// Never auto-approved, whatever the base command is: a safe scope
|
|
@@ -248,14 +340,23 @@ export const createPermissionPolicy = (options) => {
|
|
|
248
340
|
}
|
|
249
341
|
}
|
|
250
342
|
}
|
|
251
|
-
else if (
|
|
343
|
+
else if (risk !== 'dangerous'
|
|
344
|
+
&& !scopedByOrigin
|
|
345
|
+
&& !multiplyScoped
|
|
346
|
+
&& alwaysAllowed.has(sessionKey(session.id, call.toolName))) {
|
|
252
347
|
return report(context, true, `${call.toolName} was approved for the rest of this session`);
|
|
253
348
|
}
|
|
349
|
+
if (origin !== undefined) {
|
|
350
|
+
const granted = findMatchingOriginScope(origin, grantedOrigins);
|
|
351
|
+
if (granted) {
|
|
352
|
+
return report(context, true, `${call.toolName} acted on the approved site ${describeOriginScope(granted)}`, undefined, undefined, origin);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
254
355
|
// The schedule's destination scope, checked before the headless
|
|
255
356
|
// refusal because an unattended firing is exactly when it applies.
|
|
256
357
|
// `gated` only: a destination cannot launder a `dangerous` call, the
|
|
257
358
|
// same way no argument shape makes `rm -rf` a read.
|
|
258
|
-
if (risk === 'gated' && destinations) {
|
|
359
|
+
if (risk === 'gated' && singlyScoped && destinations) {
|
|
259
360
|
const destination = context.tool.destinationFor?.(call.input);
|
|
260
361
|
if (destination !== undefined
|
|
261
362
|
&& await destinations.isPreauthorized(session, destination)) {
|
|
@@ -263,10 +364,19 @@ export const createPermissionPolicy = (options) => {
|
|
|
263
364
|
}
|
|
264
365
|
}
|
|
265
366
|
if (mode === 'headless') {
|
|
266
|
-
return report(context, false, command
|
|
267
|
-
? `${call.toolName}
|
|
268
|
-
|
|
269
|
-
|
|
367
|
+
return report(context, false, command !== undefined
|
|
368
|
+
? `${call.toolName} was called outside every approved scope`
|
|
369
|
+
+ `${analysis?.base ? ` (${analysis.base})` : ''} and nobody is available to approve it`
|
|
370
|
+
: origin !== undefined
|
|
371
|
+
// Named, because it is the actionable half: an operator
|
|
372
|
+
// reading this at 3am needs to know which site to grant, and
|
|
373
|
+
// an origin carries no path or query to leak while saying so.
|
|
374
|
+
? `${call.toolName} was called on ${origin}, which no approved site covers,`
|
|
375
|
+
+ ' and nobody is available to approve it'
|
|
376
|
+
: scopedByOrigin
|
|
377
|
+
? `${call.toolName} was called on a page with no origin a grant could name,`
|
|
378
|
+
+ ' and nobody is available to approve it'
|
|
379
|
+
: `${call.toolName} is ${risk} and nobody is available to approve it`, command, undefined, origin);
|
|
270
380
|
}
|
|
271
381
|
// An aborted turn must not sit on a prompt: the human would be
|
|
272
382
|
// answering for work that no longer exists, and an answer arriving
|
|
@@ -279,26 +389,121 @@ export const createPermissionPolicy = (options) => {
|
|
|
279
389
|
// refusal is reported — is deliberately shared, so a decision made in
|
|
280
390
|
// Slack and one typed at a terminal cannot drift into meaning
|
|
281
391
|
// different things.
|
|
392
|
+
// Whether answering "always" would remember anything at all, decided
|
|
393
|
+
// here because this is where the answer is: a `dangerous` tool never
|
|
394
|
+
// remembers, and an origin-scoped call with no page has nothing to
|
|
395
|
+
// remember. Both are certain before anyone is asked, so both surfaces
|
|
396
|
+
// can stop offering a grant the engine will not create.
|
|
397
|
+
// A command this parser cannot reduce to a scope — a pipe, a
|
|
398
|
+
// subshell, an unbalanced quote, a refspec delete — is the third
|
|
399
|
+
// one-shot shape, and the oldest: the branch below has always run it
|
|
400
|
+
// once and remembered nothing, because widening to the bare tool
|
|
401
|
+
// would hand the agent every command. Resolved here rather than
|
|
402
|
+
// after the answer so the question can say so; it is a pure function
|
|
403
|
+
// of the analysis, and the branch below reuses this exact value.
|
|
404
|
+
const commandScope = analysis ? normalizeCommandScope(analysis) : undefined;
|
|
405
|
+
const oneShot = risk === 'dangerous'
|
|
406
|
+
|| multiplyScoped
|
|
407
|
+
|| (scopedByOrigin && origin === undefined)
|
|
408
|
+
|| (analysis !== undefined && commandScope === undefined);
|
|
409
|
+
const alwaysMeans = oneShot
|
|
410
|
+
? risk === 'dangerous'
|
|
411
|
+
? 'not remembered — a dangerous tool asks every time'
|
|
412
|
+
: multiplyScoped
|
|
413
|
+
? 'not remembered — this tool names more than one kind of scope'
|
|
414
|
+
: analysis !== undefined
|
|
415
|
+
? 'not remembered — this command cannot be reduced to a scope'
|
|
416
|
+
: 'not remembered — there is no page to grant'
|
|
417
|
+
: command !== undefined
|
|
418
|
+
? 'always this scope'
|
|
419
|
+
: scopedByOrigin
|
|
420
|
+
? 'always this site'
|
|
421
|
+
: 'always this session';
|
|
282
422
|
const answer = mode === 'remote'
|
|
283
|
-
? await awaitRemote(context, request)
|
|
284
|
-
: await awaitPrompt(context, ask, command);
|
|
423
|
+
? await awaitRemote(context, request, origin, oneShot)
|
|
424
|
+
: await awaitPrompt(context, ask, command, origin, alwaysMeans);
|
|
285
425
|
if (answer === ABORTED) {
|
|
286
426
|
return report(context, false, `${call.toolName} was cancelled while awaiting approval`);
|
|
287
427
|
}
|
|
288
428
|
if (answer === 'deny') {
|
|
289
429
|
return report(context, false, mode === 'remote'
|
|
290
430
|
? `${call.toolName} was not approved`
|
|
291
|
-
: `${call.toolName} was refused at the prompt`, command);
|
|
431
|
+
: `${call.toolName} was refused at the prompt`, command, undefined, origin);
|
|
292
432
|
}
|
|
433
|
+
/**
|
|
434
|
+
* Allow — unless the conversation moved out from under the answer.
|
|
435
|
+
*
|
|
436
|
+
* The origin was read before the wait, and the wait is a human's:
|
|
437
|
+
* fifteen minutes by default, unbounded when the timeout is zero. A
|
|
438
|
+
* page that navigates inside it (a redirect, a meta refresh, a
|
|
439
|
+
* script) would have a yes given for site A land a click on site B,
|
|
440
|
+
* with the prompt still naming A. The approver answered a question
|
|
441
|
+
* about a page; if it is not that page any more, there is no answer
|
|
442
|
+
* to act on, and re-asking is not the fix — that is a second question
|
|
443
|
+
* with the same race behind it.
|
|
444
|
+
*
|
|
445
|
+
* Every path out of the approval goes through this, and it is the
|
|
446
|
+
* *last* thing each of them does, because the answer is not the last
|
|
447
|
+
* yield: persisting a grant is a disk write, and a store somebody
|
|
448
|
+
* else wrote has no bound at all. Checking once when the answer
|
|
449
|
+
* arrives would leave exactly that window open. One chokepoint, so a
|
|
450
|
+
* path added later cannot quietly skip it.
|
|
451
|
+
*
|
|
452
|
+
* A grant persisted before the page moved is kept, and that is not a
|
|
453
|
+
* hole: the approver read that site and said always. What must not
|
|
454
|
+
* happen is the *click* landing somewhere they never saw.
|
|
455
|
+
*/
|
|
456
|
+
const allowUnlessMoved = (reason, forCommand) => {
|
|
457
|
+
if (!scopedByOrigin) {
|
|
458
|
+
return report(context, true, reason, forCommand, undefined, origin);
|
|
459
|
+
}
|
|
460
|
+
const settled = originScopeFor(context.tool.originFor?.(session) ?? '')?.origin;
|
|
461
|
+
if (settled === origin) {
|
|
462
|
+
return report(context, true, reason, forCommand, undefined, origin);
|
|
463
|
+
}
|
|
464
|
+
const approvedOn = origin ?? 'a page with no origin';
|
|
465
|
+
return report(context, false, settled === undefined
|
|
466
|
+
? `${call.toolName} was approved on ${approvedOn}, and that page is no longer open`
|
|
467
|
+
+ ' — it did not run'
|
|
468
|
+
: `${call.toolName} was approved on ${approvedOn}, but the conversation is on ${settled} now`
|
|
469
|
+
+ ' — it did not run', undefined, undefined, origin);
|
|
470
|
+
};
|
|
293
471
|
if (answer === 'always') {
|
|
294
|
-
|
|
472
|
+
if (scopedByOrigin) {
|
|
473
|
+
if (!originScope) {
|
|
474
|
+
// No origin to remember — a page that never loaded, or one
|
|
475
|
+
// whose URL has no origin this engine will name. The call runs;
|
|
476
|
+
// nothing is widened. Falling back to the tool-wide grant here
|
|
477
|
+
// would turn "always on this page" into "always on every page",
|
|
478
|
+
// which is the grant this whole engine replaced.
|
|
479
|
+
return allowUnlessMoved(`${call.toolName} was approved once; there is no page origin to remember, so it will ask again`);
|
|
480
|
+
}
|
|
481
|
+
sessionOrigins.set(session.agent.id, [...(sessionOrigins.get(session.agent.id) ?? []), originScope]);
|
|
482
|
+
if (origins?.whitelist) {
|
|
483
|
+
try {
|
|
484
|
+
await origins.whitelist.rememberOrigin(session.agent.id, originScope);
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
if (!(error instanceof WhitelistUnreadableError)) {
|
|
488
|
+
throw error;
|
|
489
|
+
}
|
|
490
|
+
// Same bargain the command half makes: the answer holds for
|
|
491
|
+
// this process, and the file that would carry it past a
|
|
492
|
+
// restart is not written over grants nobody can read.
|
|
493
|
+
return allowUnlessMoved(`${call.toolName} was approved, and ${describeOriginScope(originScope)} is acted on without asking for ${session.agent.id} until the daemon restarts — not saved: ${error.message}`);
|
|
494
|
+
}
|
|
495
|
+
origins.onScopeRemembered?.({ agentId: session.agent.id, scope: originScope });
|
|
496
|
+
}
|
|
497
|
+
return allowUnlessMoved(`${call.toolName} was approved, and ${describeOriginScope(originScope)} is now acted on without asking`);
|
|
498
|
+
}
|
|
499
|
+
const scope = commandScope;
|
|
295
500
|
if (analysis && !scope) {
|
|
296
501
|
// A command this parser could not reduce to a scope — a pipe, a
|
|
297
502
|
// subshell, an unbalanced quote. "Always" must not fall back to
|
|
298
503
|
// the tool-wide grant here: the approver widened one command they
|
|
299
504
|
// read, and remembering `shell.run` instead would hand the agent
|
|
300
505
|
// every command for the rest of the session.
|
|
301
|
-
return
|
|
506
|
+
return allowUnlessMoved(`${call.toolName} was approved once; it cannot be reduced to a scope, so it will ask again`, command);
|
|
302
507
|
}
|
|
303
508
|
if (scope) {
|
|
304
509
|
// A scope, never the command string (useless next time) and never
|
|
@@ -307,15 +512,45 @@ export const createPermissionPolicy = (options) => {
|
|
|
307
512
|
// asks again.
|
|
308
513
|
sessionScopes.set(session.agent.id, [...(sessionScopes.get(session.agent.id) ?? []), scope]);
|
|
309
514
|
if (commands?.whitelist) {
|
|
310
|
-
|
|
515
|
+
try {
|
|
516
|
+
await commands.whitelist.remember(session.agent.id, scope);
|
|
517
|
+
}
|
|
518
|
+
catch (error) {
|
|
519
|
+
if (!(error instanceof WhitelistUnreadableError)) {
|
|
520
|
+
throw error;
|
|
521
|
+
}
|
|
522
|
+
// The answer stands for as long as tier one does — this
|
|
523
|
+
// process, for this agent, which is what the person's
|
|
524
|
+
// "always" means without a file — and the file that would
|
|
525
|
+
// carry it past a restart is not written over grants nobody
|
|
526
|
+
// can read. The line says both.
|
|
527
|
+
return allowUnlessMoved(`${call.toolName} was approved, and "${describeCommandScope(scope)}" runs without asking for ${session.agent.id} until the daemon restarts — not saved: ${error.message}`, command);
|
|
528
|
+
}
|
|
311
529
|
commands.onScopeRemembered?.({ agentId: session.agent.id, scope });
|
|
312
530
|
}
|
|
313
|
-
return
|
|
531
|
+
return allowUnlessMoved(`${call.toolName} was approved, and "${describeCommandScope(scope)}" now runs without asking`, command);
|
|
532
|
+
}
|
|
533
|
+
if (risk === 'dangerous') {
|
|
534
|
+
// The tier means "a human every time, whatever scopes exist", and
|
|
535
|
+
// it kept that name in this change on exactly that basis — no
|
|
536
|
+
// first-party tool is in it any more, so what it is *for* is an
|
|
537
|
+
// operator's `toolRisks` or a plugin manifest saying it about
|
|
538
|
+
// somebody else's code. A session-wide grant made that a promise
|
|
539
|
+
// about the first call only (28 names this and calls tightening
|
|
540
|
+
// it deliberate); it is now what it says.
|
|
541
|
+
return allowUnlessMoved(`${call.toolName} was approved once; a dangerous tool is never remembered, so it will ask again`);
|
|
542
|
+
}
|
|
543
|
+
if (multiplyScoped) {
|
|
544
|
+
// The other half of the multi-hook rule. Storing a tool-wide
|
|
545
|
+
// grant here would be the engine answering "how do two scopes
|
|
546
|
+
// compose?" with "they do not apply", which is the one answer
|
|
547
|
+
// nobody would choose deliberately.
|
|
548
|
+
return allowUnlessMoved(`${call.toolName} was approved once; it names more than one kind of scope, so it will ask again`);
|
|
314
549
|
}
|
|
315
550
|
alwaysAllowed.add(sessionKey(session.id, call.toolName));
|
|
316
|
-
return
|
|
551
|
+
return allowUnlessMoved(`${call.toolName} was approved for the rest of this session`);
|
|
317
552
|
}
|
|
318
|
-
return
|
|
553
|
+
return allowUnlessMoved(`${call.toolName} was approved once`, command);
|
|
319
554
|
},
|
|
320
555
|
};
|
|
321
556
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The origin-scope engine: which *sites* a browser action may be taken on
|
|
3
|
+
* unattended.
|
|
4
|
+
*
|
|
5
|
+
* `ToolRisk` classifies a tool, and that was too coarse for `browser.act`
|
|
6
|
+
* in the same way it is too coarse for a shell — but not for the same
|
|
7
|
+
* reason, and the difference is why this is a second engine rather than a
|
|
8
|
+
* second use of the first. A command string *is* a description of its
|
|
9
|
+
* effect, so `analyzeCommand` can tell `git status` from `rm -rf`. A CSS
|
|
10
|
+
* selector is not: `click("#submit")` is equally "load more results" and
|
|
11
|
+
* "confirm purchase", and a scope written over selectors would mean
|
|
12
|
+
* nothing at all.
|
|
13
|
+
*
|
|
14
|
+
* What is left that an operator can read is *where* the click lands. So a
|
|
15
|
+
* scope here is one origin — `https://app.example.com`, exactly, scheme
|
|
16
|
+
* and host and port — taken from the page the conversation is already on
|
|
17
|
+
* rather than from anything the call said about itself.
|
|
18
|
+
*
|
|
19
|
+
* **This narrows the blast radius; it does not eliminate it.** Acting on
|
|
20
|
+
* `app.example.com` still covers "delete the record" alongside "load more".
|
|
21
|
+
* The claim is only that the radius is now nameable, which is what a
|
|
22
|
+
* single `dangerous` tier gave up on — and the docs say it in those words
|
|
23
|
+
* rather than implying a click became safe.
|
|
24
|
+
*
|
|
25
|
+
* There is deliberately no built-in safe list here, which is the other
|
|
26
|
+
* asymmetry with the command engine. `SAFE_COMMAND_SCOPES` can exist
|
|
27
|
+
* because `git status` is read-only wherever it runs; no origin has that
|
|
28
|
+
* property, since whether clicking on a site is harmless is a fact about
|
|
29
|
+
* the operator's account on it rather than about the site. A first-party
|
|
30
|
+
* list would be this project guessing at somebody's permissions, so every
|
|
31
|
+
* origin an agent may act on unattended was granted by a person — at a
|
|
32
|
+
* prompt, in Slack, or by hand in that agent's whitelist file.
|
|
33
|
+
*/
|
|
34
|
+
/** One narrow permission to act on a site: an origin, and nothing else. */
|
|
35
|
+
export interface OriginScope {
|
|
36
|
+
/**
|
|
37
|
+
* `https://app.example.com`, or `https://app.example.com:8443` when the
|
|
38
|
+
* port is not the scheme's default — the form `originOf` produces, which
|
|
39
|
+
* is the only form this engine ever compares.
|
|
40
|
+
*/
|
|
41
|
+
origin: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The scope a page URL grants, or nothing when the URL has no origin this
|
|
45
|
+
* engine will name (`about:blank`, a `file:` path, an unparseable string).
|
|
46
|
+
*
|
|
47
|
+
* Nothing falls back to a looser grant: a page whose origin cannot be
|
|
48
|
+
* named is a page no scope covers, so the call asks a human and an
|
|
49
|
+
* "always" answered on it is remembered for that call only.
|
|
50
|
+
*/
|
|
51
|
+
export declare const originScopeFor: (rawUrl: string) => OriginScope | undefined;
|
|
52
|
+
/** Whether an action on `origin` falls inside one scope. */
|
|
53
|
+
export declare const matchesOriginScope: (origin: string, scope: OriginScope) => boolean;
|
|
54
|
+
/** The first scope covering this origin, if any covers it. */
|
|
55
|
+
export declare const findMatchingOriginScope: (origin: string, scopes: readonly OriginScope[]) => OriginScope | undefined;
|
|
56
|
+
/** One line an operator can read in a log or a grant listing. */
|
|
57
|
+
export declare const describeOriginScope: (scope: OriginScope) => string;
|
|
58
|
+
/** Whether two scopes permit the same thing, so a whitelist does not grow duplicates. */
|
|
59
|
+
export declare const sameOriginScope: (left: OriginScope, right: OriginScope) => boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Read one scope out of a whitelist file, or refuse it.
|
|
62
|
+
*
|
|
63
|
+
* Re-normalized through `originScopeFor` rather than trusted as written,
|
|
64
|
+
* because this file is hand-editable and a grant is only as good as the
|
|
65
|
+
* comparison it will lose or win. `https://APP.example.com/reports` in the
|
|
66
|
+
* file becomes `https://app.example.com` or it is dropped — a trailing
|
|
67
|
+
* path that silently never matched would read as a grant and behave as
|
|
68
|
+
* none, and a second spelling of an approved host is a second grant nobody
|
|
69
|
+
* wrote.
|
|
70
|
+
*/
|
|
71
|
+
export declare const parseOriginScope: (raw: unknown) => OriginScope | undefined;
|
|
72
|
+
//# sourceMappingURL=origins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origins.d.ts","sourceRoot":"","sources":["../src/origins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,WAAW,GAAG,SAG7D,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,EAAE,OAAO,WAAW,KAAG,OAC/C,CAAC;AAE1B,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,GAClC,QAAQ,MAAM,EACd,QAAQ,SAAS,WAAW,EAAE,KAC7B,WAAW,GAAG,SAAsE,CAAC;AAExF,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,GAAI,OAAO,WAAW,KAAG,MAAsB,CAAC;AAEhF,yFAAyF;AACzF,eAAO,MAAM,eAAe,GAAI,MAAM,WAAW,EAAE,OAAO,WAAW,KAAG,OAC1C,CAAC;AAE/B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,OAAO,KAAG,WAAW,GAAG,SAM7D,CAAC"}
|
package/dist/origins.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The origin-scope engine: which *sites* a browser action may be taken on
|
|
3
|
+
* unattended.
|
|
4
|
+
*
|
|
5
|
+
* `ToolRisk` classifies a tool, and that was too coarse for `browser.act`
|
|
6
|
+
* in the same way it is too coarse for a shell — but not for the same
|
|
7
|
+
* reason, and the difference is why this is a second engine rather than a
|
|
8
|
+
* second use of the first. A command string *is* a description of its
|
|
9
|
+
* effect, so `analyzeCommand` can tell `git status` from `rm -rf`. A CSS
|
|
10
|
+
* selector is not: `click("#submit")` is equally "load more results" and
|
|
11
|
+
* "confirm purchase", and a scope written over selectors would mean
|
|
12
|
+
* nothing at all.
|
|
13
|
+
*
|
|
14
|
+
* What is left that an operator can read is *where* the click lands. So a
|
|
15
|
+
* scope here is one origin — `https://app.example.com`, exactly, scheme
|
|
16
|
+
* and host and port — taken from the page the conversation is already on
|
|
17
|
+
* rather than from anything the call said about itself.
|
|
18
|
+
*
|
|
19
|
+
* **This narrows the blast radius; it does not eliminate it.** Acting on
|
|
20
|
+
* `app.example.com` still covers "delete the record" alongside "load more".
|
|
21
|
+
* The claim is only that the radius is now nameable, which is what a
|
|
22
|
+
* single `dangerous` tier gave up on — and the docs say it in those words
|
|
23
|
+
* rather than implying a click became safe.
|
|
24
|
+
*
|
|
25
|
+
* There is deliberately no built-in safe list here, which is the other
|
|
26
|
+
* asymmetry with the command engine. `SAFE_COMMAND_SCOPES` can exist
|
|
27
|
+
* because `git status` is read-only wherever it runs; no origin has that
|
|
28
|
+
* property, since whether clicking on a site is harmless is a fact about
|
|
29
|
+
* the operator's account on it rather than about the site. A first-party
|
|
30
|
+
* list would be this project guessing at somebody's permissions, so every
|
|
31
|
+
* origin an agent may act on unattended was granted by a person — at a
|
|
32
|
+
* prompt, in Slack, or by hand in that agent's whitelist file.
|
|
33
|
+
*/
|
|
34
|
+
import { originOf } from '@stratusagent/core';
|
|
35
|
+
/**
|
|
36
|
+
* The scope a page URL grants, or nothing when the URL has no origin this
|
|
37
|
+
* engine will name (`about:blank`, a `file:` path, an unparseable string).
|
|
38
|
+
*
|
|
39
|
+
* Nothing falls back to a looser grant: a page whose origin cannot be
|
|
40
|
+
* named is a page no scope covers, so the call asks a human and an
|
|
41
|
+
* "always" answered on it is remembered for that call only.
|
|
42
|
+
*/
|
|
43
|
+
export const originScopeFor = (rawUrl) => {
|
|
44
|
+
const origin = originOf(rawUrl);
|
|
45
|
+
return origin === undefined ? undefined : { origin };
|
|
46
|
+
};
|
|
47
|
+
/** Whether an action on `origin` falls inside one scope. */
|
|
48
|
+
export const matchesOriginScope = (origin, scope) => scope.origin === origin;
|
|
49
|
+
/** The first scope covering this origin, if any covers it. */
|
|
50
|
+
export const findMatchingOriginScope = (origin, scopes) => scopes.find((scope) => matchesOriginScope(origin, scope));
|
|
51
|
+
/** One line an operator can read in a log or a grant listing. */
|
|
52
|
+
export const describeOriginScope = (scope) => scope.origin;
|
|
53
|
+
/** Whether two scopes permit the same thing, so a whitelist does not grow duplicates. */
|
|
54
|
+
export const sameOriginScope = (left, right) => left.origin === right.origin;
|
|
55
|
+
/**
|
|
56
|
+
* Read one scope out of a whitelist file, or refuse it.
|
|
57
|
+
*
|
|
58
|
+
* Re-normalized through `originScopeFor` rather than trusted as written,
|
|
59
|
+
* because this file is hand-editable and a grant is only as good as the
|
|
60
|
+
* comparison it will lose or win. `https://APP.example.com/reports` in the
|
|
61
|
+
* file becomes `https://app.example.com` or it is dropped — a trailing
|
|
62
|
+
* path that silently never matched would read as a grant and behave as
|
|
63
|
+
* none, and a second spelling of an approved host is a second grant nobody
|
|
64
|
+
* wrote.
|
|
65
|
+
*/
|
|
66
|
+
export const parseOriginScope = (raw) => {
|
|
67
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const origin = raw.origin;
|
|
71
|
+
return typeof origin === 'string' ? originScopeFor(origin) : undefined;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=origins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origins.js","sourceRoot":"","sources":["../src/origins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAY9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAA2B,EAAE;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,KAAkB,EAAW,EAAE,CAChF,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;AAE1B,8DAA8D;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,MAAc,EACd,MAA8B,EACL,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAExF,iEAAiE;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAEhF,yFAAyF;AACzF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAiB,EAAE,KAAkB,EAAW,EAAE,CAChF,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;AAE/B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAY,EAA2B,EAAE;IACxE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAI,GAA+B,CAAC,MAAM,CAAC;IACvD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC,CAAC"}
|