toolroll 0.9.49 → 0.9.51

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli-http.js +3 -0
  3. package/dist/flow-triggers.js +7 -0
  4. package/dist/mcp-http.js +6 -11
  5. package/dist/mcp-oauth.d.ts +1 -1
  6. package/dist/mcp-oauth.js +8 -23
  7. package/dist/mcp-person.d.ts +0 -9
  8. package/dist/mcp-person.js +2 -1
  9. package/dist/operate.d.ts +1 -1
  10. package/dist/operate.js +9 -2
  11. package/dist/request-budget.d.ts +5 -2
  12. package/dist/request-budget.js +7 -3
  13. package/dist/scope.d.ts +1 -0
  14. package/dist/scope.js +19 -9
  15. package/dist/serve.d.ts +2 -605
  16. package/dist/serve.js +434 -23789
  17. package/dist/server/chat.d.ts +41 -0
  18. package/dist/server/chat.js +1458 -0
  19. package/dist/server/edge-refusal.d.ts +5 -0
  20. package/dist/server/edge-refusal.js +56 -0
  21. package/dist/server/flows.d.ts +12 -0
  22. package/dist/server/flows.js +832 -0
  23. package/dist/server/guards.d.ts +72 -0
  24. package/dist/server/guards.js +357 -0
  25. package/dist/server/handler-context.d.ts +22 -0
  26. package/dist/server/handler-context.js +1 -0
  27. package/dist/server/handler-registry.d.ts +21 -0
  28. package/dist/server/handler-registry.js +34 -0
  29. package/dist/server/pages-assets.d.ts +10 -0
  30. package/dist/server/pages-assets.js +103 -0
  31. package/dist/server/pages.d.ts +11 -0
  32. package/dist/server/pages.js +910 -0
  33. package/dist/server/people-tokens.d.ts +20 -0
  34. package/dist/server/people-tokens.js +693 -0
  35. package/dist/server/remote-hooks.d.ts +29 -0
  36. package/dist/server/remote-hooks.js +130 -0
  37. package/dist/server/remote.d.ts +59 -0
  38. package/dist/server/remote.js +200 -0
  39. package/dist/server/route-policy.d.ts +18 -0
  40. package/dist/server/route-policy.js +30 -0
  41. package/dist/server/route-table.d.ts +74 -0
  42. package/dist/server/route-table.js +350 -0
  43. package/dist/server/runtime.d.ts +280 -0
  44. package/dist/server/runtime.js +25 -0
  45. package/dist/server/settings.d.ts +22 -0
  46. package/dist/server/settings.js +2388 -0
  47. package/dist/server/shared.d.ts +3334 -0
  48. package/dist/server/shared.js +12708 -0
  49. package/dist/server/task-views.d.ts +82 -0
  50. package/dist/server/task-views.js +1099 -0
  51. package/dist/server/tasks.d.ts +87 -0
  52. package/dist/server/tasks.js +3579 -0
  53. package/dist/session-http.js +3 -0
  54. package/dist/sign-in-guard.d.ts +41 -16
  55. package/dist/sign-in-guard.js +147 -24
  56. package/dist/source-key.d.ts +2 -0
  57. package/dist/source-key.js +49 -0
  58. package/dist/team-http.d.ts +8 -1
  59. package/dist/team-http.js +9 -2
  60. package/dist/teams.js +3 -0
  61. package/package.json +1 -1
@@ -0,0 +1,5 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { type RouteDeclaration } from './route-table.js';
3
+ export declare function isEdgeAddress(path: string): boolean;
4
+ /** Preserve each transport's refusal envelope without invoking an undeclared adapter. */
5
+ export declare function refuseEdge(request: IncomingMessage, response: ServerResponse, path: string, declared: RouteDeclaration | null): void;
@@ -0,0 +1,56 @@
1
+ import { sessionDescriptor } from '../session-contract.js';
2
+ import { ROUTES } from './route-table.js';
3
+ export function isEdgeAddress(path) {
4
+ return ROUTES.some(row => row.stage === 'edge' && new RegExp(row.pattern).test(path))
5
+ || /^\/(?:oauth|hooks|api\/(?:sessions|team|cli))(?:\/|$)/.test(path)
6
+ || path.startsWith('/.well-known/oauth-');
7
+ }
8
+ /** Preserve each transport's refusal envelope without invoking an undeclared adapter. */
9
+ export function refuseEdge(request, response, path, declared) {
10
+ request.resume();
11
+ response.statusCode = declared ? 405 : 404;
12
+ let type = 'text/plain; charset=utf-8', body = 'No such address.';
13
+ if (path === '/mcp') {
14
+ response.setHeader('allow', 'POST');
15
+ type = 'application/json';
16
+ body = JSON.stringify({ jsonrpc: '2.0', id: null, error: { code: -32000, message: 'the MCP gateway takes POST only — one JSON-RPC message per request' } });
17
+ }
18
+ else if (path.startsWith('/api/sessions/')) {
19
+ const spec = sessionDescriptor(path.split('/')[3] ?? '');
20
+ type = 'application/json';
21
+ response.setHeader('X-Toolroll-Delivery', 'not-sent');
22
+ if (spec)
23
+ response.setHeader('allow', 'POST');
24
+ body = JSON.stringify({ version: 1, ...(spec ? { operation: spec.operation } : {}), ok: false, status: 'rejected', delivery: 'not-sent', retry: spec?.mutation === false ? 'safe-read' : 'never', reason: spec ? 'method-not-allowed' : 'unsupported-operation', message: spec ? 'Session operations require POST.' : 'This session operation is not supported.', nextActions: [] });
25
+ }
26
+ else if (path === '/api/cli' || path.startsWith('/api/team')) {
27
+ type = 'application/json';
28
+ body = JSON.stringify({ ...(path.startsWith('/api/team') ? { version: 1 } : {}), ok: false, code: declared ? 'method-not-allowed' : 'not-found', message: declared ? path === '/api/cli' ? 'Use POST.' : path.endsWith('/events') ? 'Use GET.' : 'Use GET or POST.' : 'No such address.' });
29
+ }
30
+ else if (path.startsWith('/oauth/') || path.startsWith('/.well-known/oauth-')) {
31
+ type = 'application/json';
32
+ body = JSON.stringify({ error: 'invalid_request', error_description: declared ? declared.method === 'POST' ? 'Use POST.' : 'Use GET.' : 'No such address.' });
33
+ }
34
+ else if (path === '/hooks/telegram')
35
+ body = 'no';
36
+ else if (path.startsWith('/hooks/form/')) {
37
+ type = 'text/html; charset=utf-8';
38
+ body = '';
39
+ }
40
+ else if (path.startsWith('/hooks/')) {
41
+ type = 'application/json';
42
+ body = JSON.stringify({ said: declared ? 'Send a POST.' : 'No such address.' });
43
+ }
44
+ else if (path === '/teams/messages') {
45
+ type = 'application/json';
46
+ body = '{}';
47
+ }
48
+ else if (path.startsWith('/assets/')) {
49
+ response.setHeader('allow', 'GET, HEAD');
50
+ body = '';
51
+ }
52
+ response.setHeader('content-type', type);
53
+ response.setHeader('cache-control', 'no-store');
54
+ response.setHeader('x-content-type-options', 'nosniff');
55
+ response.end(body);
56
+ }
@@ -0,0 +1,12 @@
1
+ import type { Registration } from './handler-registry.js';
2
+ import { type ServerResponse } from "node:http";
3
+ import { galleryTemplateOf, type GalleryAnswers } from "../flow-gallery.js";
4
+ import type { HandlerContext } from './handler-context.js';
5
+ import type { ServerRuntime } from './runtime.js';
6
+ import { type Who } from "./shared.js";
7
+ export declare function createFlowsHandlers(runtime: ServerRuntime): {
8
+ registrations: Registration[];
9
+ get: (ctx: HandlerContext) => Promise<void>;
10
+ post: (ctx: HandlerContext) => Promise<void>;
11
+ sendGalleryUse: (response: ServerResponse, who: Who, template: NonNullable<ReturnType<typeof galleryTemplateOf>>, projects: readonly string[], repo: string, given: GalleryAnswers | null, name: string, notice: string | null, said?: string | null) => void;
12
+ };