toolroll 0.9.49 → 0.9.50
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/CHANGELOG.md +8 -0
- package/dist/cli-http.js +3 -0
- package/dist/flow-triggers.js +7 -0
- package/dist/mcp-http.js +6 -11
- package/dist/mcp-oauth.js +5 -21
- package/dist/mcp-person.d.ts +0 -9
- package/dist/mcp-person.js +2 -1
- package/dist/operate.js +4 -1
- package/dist/serve.d.ts +2 -605
- package/dist/serve.js +423 -23783
- package/dist/server/chat.d.ts +41 -0
- package/dist/server/chat.js +1458 -0
- package/dist/server/edge-refusal.d.ts +5 -0
- package/dist/server/edge-refusal.js +56 -0
- package/dist/server/flows.d.ts +12 -0
- package/dist/server/flows.js +832 -0
- package/dist/server/guards.d.ts +72 -0
- package/dist/server/guards.js +357 -0
- package/dist/server/handler-context.d.ts +22 -0
- package/dist/server/handler-context.js +1 -0
- package/dist/server/handler-registry.d.ts +21 -0
- package/dist/server/handler-registry.js +34 -0
- package/dist/server/pages-assets.d.ts +10 -0
- package/dist/server/pages-assets.js +103 -0
- package/dist/server/pages.d.ts +11 -0
- package/dist/server/pages.js +910 -0
- package/dist/server/people-tokens.d.ts +20 -0
- package/dist/server/people-tokens.js +694 -0
- package/dist/server/remote-hooks.d.ts +29 -0
- package/dist/server/remote-hooks.js +130 -0
- package/dist/server/remote.d.ts +59 -0
- package/dist/server/remote.js +185 -0
- package/dist/server/route-policy.d.ts +18 -0
- package/dist/server/route-policy.js +30 -0
- package/dist/server/route-table.d.ts +74 -0
- package/dist/server/route-table.js +350 -0
- package/dist/server/runtime.d.ts +280 -0
- package/dist/server/runtime.js +25 -0
- package/dist/server/settings.d.ts +22 -0
- package/dist/server/settings.js +2388 -0
- package/dist/server/shared.d.ts +3334 -0
- package/dist/server/shared.js +12708 -0
- package/dist/server/task-views.d.ts +82 -0
- package/dist/server/task-views.js +1099 -0
- package/dist/server/tasks.d.ts +87 -0
- package/dist/server/tasks.js +3579 -0
- package/dist/session-http.js +3 -0
- package/dist/team-http.d.ts +5 -1
- package/dist/team-http.js +6 -2
- package/dist/teams.js +3 -0
- package/package.json +1 -1
package/dist/session-http.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { adapterPolicy } from "./server/route-policy.js";
|
|
1
2
|
import { SESSION_REQUEST_BYTES, SESSION_RESPONSE_BYTES, isSessionResponse, sessionDescriptor, validateSessionRequest, } from './session-contract.js';
|
|
2
3
|
import { limitWords } from './request-budget.js';
|
|
3
4
|
function readBody(request) {
|
|
@@ -122,6 +123,8 @@ export async function handleSessionHttp(request, response, options) {
|
|
|
122
123
|
}
|
|
123
124
|
if (options.admitAuthenticated && refuseAdmission(options.admitAuthenticated(request, actor)))
|
|
124
125
|
return true;
|
|
126
|
+
if (!adapterPolicy({ caller: "bearer", capability: "act" }, spec.mutation ? "act" : "read").ok)
|
|
127
|
+
return reject(403, "forbidden", "Current operator access is required.");
|
|
125
128
|
const media = request.headers['content-type']?.split(';')[0]?.trim().toLowerCase();
|
|
126
129
|
if (media !== 'application/json')
|
|
127
130
|
return reject(415, 'unsupported-media-type', 'Send the session request as application/json.');
|
package/dist/team-http.d.ts
CHANGED
|
@@ -2,8 +2,12 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
|
2
2
|
import { type TeamActor, type TeamExecute } from './team-contract.js';
|
|
3
3
|
import { type Admission } from './request-budget.js';
|
|
4
4
|
export declare const TEAM_REQUEST_BYTES: number;
|
|
5
|
+
/** Account role belongs to HTTP authentication; API tokens carry their own scope. */
|
|
6
|
+
export type TeamHttpActor = TeamActor & {
|
|
7
|
+
role?: 'approver' | 'viewer';
|
|
8
|
+
};
|
|
5
9
|
export type TeamHttpOptions = {
|
|
6
|
-
authenticate: (request: IncomingMessage) =>
|
|
10
|
+
authenticate: (request: IncomingMessage) => TeamHttpActor | null | Promise<TeamHttpActor | null>;
|
|
7
11
|
/** Recheck the original credential/session and current account, without extending idle expiry. */
|
|
8
12
|
revalidate: (request: IncomingMessage, actor: TeamActor) => boolean;
|
|
9
13
|
authorizeMutation: (request: IncomingMessage, actor: TeamActor) => boolean;
|
package/dist/team-http.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { adapterPolicy } from "./server/route-policy.js";
|
|
2
|
+
import { TEAM_OPERATIONS, TEAM_MUTATIONS, teamScopeAllows } from './team-contract.js';
|
|
2
3
|
import { limitWords } from './request-budget.js';
|
|
3
4
|
export const TEAM_REQUEST_BYTES = 64 * 1024;
|
|
4
5
|
const failure = (code, message) => ({ version: 1, ok: false, code, message });
|
|
@@ -63,6 +64,9 @@ export async function handleTeamHttp(request, response, options) {
|
|
|
63
64
|
return reject(401, 'unauthenticated', 'Sign in to continue.');
|
|
64
65
|
if (options.admitAuthenticated && refuseAdmission(options.admitAuthenticated(request, actor)))
|
|
65
66
|
return true;
|
|
67
|
+
const policyPrincipal = () => ({ caller: request.headers.authorization ? 'bearer' : 'cookie', capability: actor.principal?.scope ?? (actor.role === 'approver' ? 'act' : 'read'), token: actor.principal !== undefined });
|
|
68
|
+
if (!adapterPolicy(policyPrincipal()).ok)
|
|
69
|
+
return reject(403, 'read-only', 'Your token reads only. Use an act token for this.');
|
|
66
70
|
const conversationId = url.searchParams.get('conversation') ?? undefined;
|
|
67
71
|
if (url.pathname === '/api/team/events') {
|
|
68
72
|
if (request.method !== 'GET')
|
|
@@ -147,7 +151,7 @@ export async function handleTeamHttp(request, response, options) {
|
|
|
147
151
|
return reject(405, 'method-not-allowed', 'Use GET or POST.');
|
|
148
152
|
if (!options.revalidate(request, actor))
|
|
149
153
|
return reject(401, 'unauthenticated', 'Sign in to continue.');
|
|
150
|
-
if (!teamScopeAllows(actor, input.operation))
|
|
154
|
+
if (!adapterPolicy(policyPrincipal(), TEAM_MUTATIONS[input.operation] ? "act" : "read").ok || !teamScopeAllows(actor, input.operation))
|
|
151
155
|
return reject(403, 'read-only', 'Your token reads only. Use an act token for this.');
|
|
152
156
|
try {
|
|
153
157
|
const result = await options.execute(actor, input);
|
package/dist/teams.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { adapterPolicy } from "./server/route-policy.js";
|
|
1
2
|
/** Microsoft Teams: the leased delivery loop hosted by the ordinary worker,
|
|
2
3
|
* and the HTTPS receiver the console mounts for the Bot Framework. Teams
|
|
3
4
|
* has no client-initiated socket, so inbound activities arrive over HTTPS
|
|
@@ -37,6 +38,8 @@ export async function handleTeamsHttp(request, response, options) {
|
|
|
37
38
|
const claims = await verifyTeamsToken(request.headers.authorization, credentials.app, options.fetcher ?? fetch);
|
|
38
39
|
if (claims === null)
|
|
39
40
|
return reply(401);
|
|
41
|
+
if (!adapterPolicy({ caller: "service", capability: "none" }).ok)
|
|
42
|
+
return reply(403);
|
|
40
43
|
if (refuseAdmission(options.admitTenant(credentials.tenant)))
|
|
41
44
|
return true;
|
|
42
45
|
if (Number(request.headers["content-length"] ?? 0) > TEAMS_ACTIVITY_BYTES)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "toolroll",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.50",
|
|
4
4
|
"description": "A control plane for unattended coding agents — queue tasks, walk away, come back to pull requests. Agents build in leased worktrees, never touch your default branch, and interrupt you only for decisions that need a human.",
|
|
5
5
|
"directories": {
|
|
6
6
|
"doc": "docs"
|