@superbee/core 0.2.0-pre.20 → 0.2.0-pre.22

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 (60) hide show
  1. package/README.md +50 -0
  2. package/dist/connector-request.d.ts +87 -0
  3. package/dist/connector-request.d.ts.map +1 -0
  4. package/dist/connector-request.js +370 -0
  5. package/dist/connector-request.js.map +1 -0
  6. package/dist/connectors.d.ts +32 -0
  7. package/dist/connectors.d.ts.map +1 -1
  8. package/dist/connectors.js +30 -1
  9. package/dist/connectors.js.map +1 -1
  10. package/dist/recipe-lifecycle/errors.d.ts +3 -1
  11. package/dist/recipe-lifecycle/errors.d.ts.map +1 -1
  12. package/dist/recipe-lifecycle/errors.js.map +1 -1
  13. package/dist/recipe-lifecycle/evolution.d.ts +36 -3
  14. package/dist/recipe-lifecycle/evolution.d.ts.map +1 -1
  15. package/dist/recipe-lifecycle/evolution.js +160 -29
  16. package/dist/recipe-lifecycle/evolution.js.map +1 -1
  17. package/dist/recipe-lifecycle/index.d.ts +7 -5
  18. package/dist/recipe-lifecycle/index.d.ts.map +1 -1
  19. package/dist/recipe-lifecycle/index.js +6 -4
  20. package/dist/recipe-lifecycle/index.js.map +1 -1
  21. package/dist/recipe-lifecycle/install.d.ts +1 -0
  22. package/dist/recipe-lifecycle/install.d.ts.map +1 -1
  23. package/dist/recipe-lifecycle/install.js +25 -10
  24. package/dist/recipe-lifecycle/install.js.map +1 -1
  25. package/dist/recipe-lifecycle/stamp.d.ts +2 -0
  26. package/dist/recipe-lifecycle/stamp.d.ts.map +1 -1
  27. package/dist/recipe-lifecycle/stamp.js +8 -4
  28. package/dist/recipe-lifecycle/stamp.js.map +1 -1
  29. package/dist/source-engine/guard.d.ts +4 -8
  30. package/dist/source-engine/guard.d.ts.map +1 -1
  31. package/dist/source-engine/guard.js +32 -5
  32. package/dist/source-engine/guard.js.map +1 -1
  33. package/dist/source-engine/index.d.ts +2 -0
  34. package/dist/source-engine/index.d.ts.map +1 -1
  35. package/dist/source-engine/index.js +1 -0
  36. package/dist/source-engine/index.js.map +1 -1
  37. package/dist/source-engine/observe.d.ts.map +1 -1
  38. package/dist/source-engine/observe.js +29 -7
  39. package/dist/source-engine/observe.js.map +1 -1
  40. package/dist/source-engine/overlay.d.ts +49 -0
  41. package/dist/source-engine/overlay.d.ts.map +1 -0
  42. package/dist/source-engine/overlay.js +114 -0
  43. package/dist/source-engine/overlay.js.map +1 -0
  44. package/dist/source-engine/types.d.ts +2 -0
  45. package/dist/source-engine/types.d.ts.map +1 -1
  46. package/dist/source-harness/conformance.d.ts.map +1 -1
  47. package/dist/source-harness/conformance.js +13 -12
  48. package/dist/source-harness/conformance.js.map +1 -1
  49. package/dist/source-harness/fixture.d.ts.map +1 -1
  50. package/dist/source-harness/fixture.js +30 -18
  51. package/dist/source-harness/fixture.js.map +1 -1
  52. package/dist/source-profiles/index.d.ts +32 -0
  53. package/dist/source-profiles/index.d.ts.map +1 -0
  54. package/dist/source-profiles/index.js +326 -0
  55. package/dist/source-profiles/index.js.map +1 -0
  56. package/dist/source-profiles/link-header.d.ts +6 -0
  57. package/dist/source-profiles/link-header.d.ts.map +1 -0
  58. package/dist/source-profiles/link-header.js +131 -0
  59. package/dist/source-profiles/link-header.js.map +1 -0
  60. package/package.json +6 -1
package/README.md CHANGED
@@ -998,3 +998,53 @@ transaction or authorization boundary is added.
998
998
  The packed proof runs the public workflow over `MemoryBackend` in Node and a browser bundle without
999
999
  Node globals. This proves source/package availability. Hosted provisioning routes, MCP modeling
1000
1000
  tools, and publication of a core version remain separate adoption and release decisions.
1001
+
1002
+
1003
+ ## Declarative JSON sources
1004
+
1005
+ `@superbee/core/source-profiles` exports `getSourceProfile(id)`, frozen `SOURCE_PROFILES` metadata,
1006
+ and `restJsonProfile` (version 1). The profile accepts a parsed `ConnectorSource` as its spec;
1007
+ `source.request` describes provider data, while `source.fields` maps normalized paths to Kind fields.
1008
+ It runs only through `observeSource` and the caller's recorded or credential-injecting transport.
1009
+ Installing a Connector does not run it.
1010
+
1011
+ The optional, pinned request block requires `host`, `method`, `path` and `items` (empty string for
1012
+ a root array). `query`, `body` and `headers` contain scalar literals or whole `{binding}`, `{cursor}`,
1013
+ `{page}` and `{watermark}` values. Path placeholders occupy whole segments. `request.fields` maps
1014
+ normalized dotted paths to `{from, type?}` or `{const}`; types are `text`, `integer`, `date`
1015
+ (ISO timestamp), `epoch-date` (seconds to ISO timestamp), and `url` (HTTP(S)). Presence-only `skip`
1016
+ rules count skipped records. No executable expressions or synthesis are supported.
1017
+
1018
+ Paging kinds are `none`, `cursor`, `link-header`, `offset` and `page-number`. Cursor paging uses
1019
+ `cursor_path` (opaque token, placed through `query`) or `next_path` (URL). Numeric paging requires
1020
+ `size` and `page_param` or `offset_param`, and restarts from the beginning after interruption.
1021
+ `watermark: {field, param, overlap_seconds}` applies overlap between passes and keeps the pass's
1022
+ starting watermark fixed across pages. `complete` is `always`, `never`, or `{when_path, equals}`;
1023
+ the engine additionally requires an uninterrupted complete-mode pass before counting absences.
1024
+ Optional `errors` sets (`deferred`, `credential_refused`, `not_found`) and `rate.requests` narrow
1025
+ the run's status interpretation and request budget.
1026
+
1027
+ Existing declaration pins without a request block remain unchanged. Credentialed engine consumers
1028
+ must now supply a request declaration: `declaration_required` refuses a missing one before any
1029
+ transport call. Parsing and installation remain inert. Provider read paths, read-shaped POST paths,
1030
+ headers and paging forms are core-owned, deeply frozen, and revalidated at every run; caller rules
1031
+ can only narrow them. Callback URL/response views are isolated from execution; changing a view
1032
+ cannot rewrite the request. Core rechecks its private run authority after narrowing callbacks.
1033
+ Keyless legacy profiles retain the declared-domain and robots rules.
1034
+
1035
+ GitHub's repository issues GET, version header and alternate numeric pagination form follow
1036
+ [issues documentation](https://docs.github.com/en/rest/issues/issues) and
1037
+ [pagination documentation](https://docs.github.com/en/rest/using-the-rest-api/using-pagination-in-the-rest-api).
1038
+ Numeric `/repositories/{id}/issues` paging additionally requires first-page repository metadata
1039
+ that proves the id belongs to the bound owner/repository and stays fixed for that pass. The issues
1040
+ listing does not guarantee that metadata; a Link alone cannot establish it. Without proof the
1041
+ engine refuses that alternate form. Its metadata proof is scoped to the current run, so resuming
1042
+ an interrupted alternate numeric URL in a later run also refuses; restart from the bound path.
1043
+ The conditional metadata test is not live-provider
1044
+ qualification. Same bound `/repos/{owner}/{repo}/issues` pagination remains usable.
1045
+
1046
+ GraphQL declarations use the real `graphql` syntax parser: one query operation, no variable defaults,
1047
+ and bound String/ID inputs. GraphQL execution is deferred to the later GraphQL profile slice:
1048
+ `graphql_scope_unsupported` refuses even a well-formed read body before transport. Syntax alone
1049
+ does not establish resource-scoped traversal. Mutations and malformed extension bodies are refused
1050
+ by the engine wrapper; caller hooks cannot enable them.
@@ -0,0 +1,87 @@
1
+ import { type Connector, type ConnectorSource, type BoundFeed } from "./connectors.js";
2
+ import type { RequestRules, ProfileResponse } from "./source-engine/types.js";
3
+ export type Scalar = string | number | boolean | null;
4
+ export interface ConnectorRequest {
5
+ host: string;
6
+ method: "GET" | "POST";
7
+ path: string;
8
+ query?: Record<string, Scalar>;
9
+ body?: Record<string, Scalar>;
10
+ headers?: Record<string, string>;
11
+ items: string;
12
+ skip?: Array<{
13
+ path: string;
14
+ present: true;
15
+ }>;
16
+ fields?: Record<string, {
17
+ from?: string;
18
+ type?: "text" | "integer" | "date" | "epoch-date" | "url";
19
+ const?: Scalar;
20
+ }>;
21
+ paging?: {
22
+ kind: "none" | "cursor" | "link-header" | "offset" | "page-number";
23
+ cursor_path?: string;
24
+ next_path?: string;
25
+ size_param?: string;
26
+ size?: number;
27
+ page_param?: string;
28
+ offset_param?: string;
29
+ };
30
+ watermark?: {
31
+ field: string;
32
+ param: string;
33
+ overlap_seconds: number;
34
+ };
35
+ complete?: "always" | "never" | {
36
+ when_path: string;
37
+ equals: Scalar;
38
+ };
39
+ errors?: {
40
+ deferred?: number[];
41
+ credential_refused?: number[];
42
+ not_found?: number[];
43
+ };
44
+ rate?: {
45
+ requests: number;
46
+ };
47
+ graphql?: {
48
+ query: string;
49
+ variables: Record<string, Scalar>;
50
+ items?: string;
51
+ page_info?: string;
52
+ };
53
+ }
54
+ declare const githubRules: Readonly<{
55
+ read_paths: readonly string[];
56
+ read_posts: readonly Readonly<{
57
+ path: "/graphql";
58
+ graphql: true;
59
+ }>[];
60
+ headers: readonly string[];
61
+ paging_query: readonly string[];
62
+ paging_cursors: Readonly<{
63
+ after: 2048;
64
+ }>;
65
+ next: readonly Readonly<{
66
+ path: "/repositories/{id}/issues";
67
+ id_path: "repository.id";
68
+ }>[];
69
+ }>;
70
+ export declare const AUTH_PROVIDER_REQUEST_RULES: Readonly<Record<string, typeof githubRules>>;
71
+ export declare function providerRequestRules(auth: Connector["auth"]): typeof githubRules | undefined;
72
+ export declare const object: (v: unknown) => v is Record<string, unknown>;
73
+ export declare const placeholders: (s: string) => string[];
74
+ /** A parsed single query, with all string/id inputs supplied by bound variables. */
75
+ export declare function graphqlReadProblem(query: unknown, variables: unknown, parameters?: Readonly<Record<string, string>> | null): string | undefined;
76
+ export declare function validateConnectorRequest(source: Pick<ConnectorSource, "request" | "identity">, connector?: Pick<Connector, "auth" | "domains">): Array<{
77
+ path: string;
78
+ message: string;
79
+ }>;
80
+ export declare function readPath(value: unknown, path: string): unknown;
81
+ export declare function renderRequestValue(value: Scalar, parameters: Readonly<Record<string, string>>, dynamic: Record<string, string>): Scalar;
82
+ /** Guard-owned rules. Caller hooks may narrow these rules but cannot widen them. */
83
+ export declare function declarationRequestRules(connector: Pick<Connector, "auth" | "domains">, bound: BoundFeed): RequestRules & {
84
+ response(response: ProfileResponse): void;
85
+ };
86
+ export {};
87
+ //# sourceMappingURL=connector-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-request.d.ts","sourceRoot":"","sources":["../src/connector-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACpH,MAAM,CAAC,EAAE;QAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IACxM,SAAS,CAAC,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IACpE,MAAM,CAAC,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC;IACpF,IAAI,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAAC;IAC1B,OAAO,CAAC,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;CAClG;AAED,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAUf,CAAC;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,CAAwC,CAAC;AAC9H,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,WAAW,GAAG,SAAS,CAE5F;AACD,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAA6D,CAAC;AAI7H,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,MAAM,EAAqE,CAAC;AAErH,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CA2B/I;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAuGvL;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ9D;AACD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAMvI;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,YAAY,GAAG;IAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;CAAC,CAsEpK"}
@@ -0,0 +1,370 @@
1
+ /** Closed declarative request grammar and provider-owned read scope. */
2
+ import { parse, visit, Kind } from "graphql/language/index.js";
3
+ import { CONNECTOR_KEYS, credentialHosts } from "./connectors.js";
4
+ const githubRules = Object.freeze({
5
+ // GitHub Docs: REST issues/list-repository-issues, REST pagination, forming GraphQL calls.
6
+ read_paths: Object.freeze(["/repos/{owner}/{repo}/issues", "/graphql"]),
7
+ read_posts: Object.freeze([Object.freeze({ path: "/graphql", graphql: true })]),
8
+ headers: Object.freeze(["x-github-api-version"]),
9
+ paging_query: Object.freeze(["page", "per_page"]),
10
+ // REST Link URLs may carry opaque before/after cursors. Only observed forward issues paging
11
+ // is admitted here; cursor text grants no path, filter or template authority.
12
+ paging_cursors: Object.freeze({ after: 2048 }),
13
+ next: Object.freeze([Object.freeze({ path: "/repositories/{id}/issues", id_path: "repository.id" })]),
14
+ });
15
+ export const AUTH_PROVIDER_REQUEST_RULES = Object.freeze({ github: githubRules });
16
+ export function providerRequestRules(auth) {
17
+ return AUTH_PROVIDER_REQUEST_RULES[auth.kind === "github-app" ? "github" : auth.provider ?? ""];
18
+ }
19
+ export const object = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
20
+ const safeName = (s) => /^[A-Za-z_][A-Za-z0-9_-]*$/.test(s) && !["__proto__", "prototype", "constructor"].includes(s);
21
+ const dotted = (s) => typeof s === "string" && s.length <= 512 && (s === "" || s.split(".").every(safeName));
22
+ const scalar = (v) => v === null || typeof v === "string" || typeof v === "boolean" || typeof v === "number" && Number.isFinite(v);
23
+ export const placeholders = (s) => [...s.matchAll(/\{([A-Za-z][A-Za-z0-9_]*)\}/g)].map(m => m[1]);
24
+ /** A parsed single query, with all string/id inputs supplied by bound variables. */
25
+ export function graphqlReadProblem(query, variables, parameters) {
26
+ if (typeof query !== "string" || query.length > 65536 || !object(variables))
27
+ return "GraphQL requires a query and variables mapping";
28
+ try {
29
+ const ast = parse(query, { maxTokens: 5000 });
30
+ const ops = ast.definitions.filter(d => d.kind === Kind.OPERATION_DEFINITION);
31
+ if (ops.length !== 1 || ops[0].operation !== "query" || ast.definitions.some(d => d.kind !== Kind.OPERATION_DEFINITION && d.kind !== Kind.FRAGMENT_DEFINITION))
32
+ return "GraphQL requires exactly one query operation";
33
+ let problem;
34
+ const names = new Set();
35
+ visit(ast, {
36
+ StringValue() { problem = "GraphQL string arguments must use bound variables"; },
37
+ VariableDefinition(node) {
38
+ names.add(node.variable.name.value);
39
+ if (node.defaultValue)
40
+ problem = "GraphQL variable defaults are refused";
41
+ let type = node.type;
42
+ while (type.kind !== Kind.NAMED_TYPE)
43
+ type = type.type;
44
+ const value = variables[node.variable.name.value];
45
+ if (!scalar(value))
46
+ problem = "GraphQL variables must be scalar";
47
+ if (type.name.value === "String" || type.name.value === "ID") {
48
+ if (parameters) {
49
+ if (typeof value !== "string" || !Object.values(parameters).includes(value))
50
+ problem = "GraphQL string/id variables must equal a bound value";
51
+ }
52
+ else if (parameters !== null && (typeof value !== "string" || !/^\{(?:[A-Za-z][A-Za-z0-9_]*|cursor)\}$/.test(value)))
53
+ problem = "GraphQL string/id variables must be one binding placeholder or cursor";
54
+ }
55
+ },
56
+ });
57
+ if (Object.keys(variables).some(n => !names.has(n)))
58
+ return "GraphQL variables must be declared";
59
+ return problem;
60
+ }
61
+ catch {
62
+ return "GraphQL query syntax is invalid";
63
+ }
64
+ }
65
+ export function validateConnectorRequest(source, connector) {
66
+ const errors = [];
67
+ const fail = (path, message) => { errors.push({ path: `/request${path}`, message }); };
68
+ const closed = (block, value, path) => {
69
+ if (!object(value)) {
70
+ fail(path, "must be a mapping");
71
+ return false;
72
+ }
73
+ for (const key of Object.keys(value))
74
+ if (!CONNECTOR_KEYS[block].includes(key))
75
+ fail(`${path}/${key}`, `unknown ${block} key`);
76
+ return true;
77
+ };
78
+ const r = source.request;
79
+ if (!closed("request", r, ""))
80
+ return errors;
81
+ const params = placeholders(source.identity.resource);
82
+ const allowed = new Set([...params, "cursor", "watermark", "page"]);
83
+ const template = (v, path, pathMode = false) => {
84
+ if (!scalar(v)) {
85
+ fail(path, "must be a scalar literal or placeholder");
86
+ return;
87
+ }
88
+ if (typeof v !== "string")
89
+ return;
90
+ if (v.length > 8192 || /%7[bd]/i.test(v))
91
+ fail(path, "encoded braces or oversized template refused");
92
+ const without = v.replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/g, (_, n) => { if (!allowed.has(n))
93
+ fail(path, "unknown placeholder"); return "x"; });
94
+ if (/[{}]/.test(without))
95
+ fail(path, "nested or malformed placeholder");
96
+ if (!pathMode && placeholders(v).length && !/^\{[A-Za-z][A-Za-z0-9_]*\}$/.test(v))
97
+ fail(path, "placeholder must be the entire value");
98
+ };
99
+ if (typeof r.host !== "string" || !/^[a-z0-9.-]+$/.test(r.host))
100
+ fail("/host", "must be a lowercase hostname");
101
+ if (r.method !== "GET" && r.method !== "POST")
102
+ fail("/method", "must be GET or reviewed read-shaped POST");
103
+ if (typeof r.path !== "string" || !r.path.startsWith("/") || r.path.startsWith("//") || /[?#\\]/.test(r.path))
104
+ fail("/path", "must be an absolute path template without query or fragment");
105
+ else {
106
+ template(r.path, "/path", true);
107
+ for (const segment of r.path.split("/")) {
108
+ let decoded = segment;
109
+ try {
110
+ decoded = decodeURIComponent(segment);
111
+ }
112
+ catch {
113
+ fail("/path", "invalid encoding");
114
+ }
115
+ if (decoded === "." || decoded === ".." || /[/\\]/.test(decoded))
116
+ fail("/path", "dot segments and encoded separators refused");
117
+ if (/[{}]/.test(segment) && !/^\{[A-Za-z][A-Za-z0-9_]*\}$/.test(segment))
118
+ fail("/path", "path placeholder must be an entire segment");
119
+ }
120
+ }
121
+ for (const key of ["query", "body", "headers"])
122
+ if (r[key] !== undefined) {
123
+ if (!object(r[key]))
124
+ fail(`/${key}`, "must be a scalar mapping");
125
+ else
126
+ for (const [name, value] of Object.entries(r[key])) {
127
+ if (!safeName(name))
128
+ fail(`/${key}/${name}`, "invalid map key");
129
+ template(value, `/${key}/${name}`);
130
+ }
131
+ }
132
+ if (r.method === "GET" && r.body !== undefined)
133
+ fail("/body", "GET has no body");
134
+ if (!dotted(r.items))
135
+ fail("/items", "must be a dotted array path, or empty for the root array");
136
+ if (r.skip !== undefined) {
137
+ if (!Array.isArray(r.skip))
138
+ fail("/skip", "must be a list");
139
+ else
140
+ r.skip.forEach((s, i) => { if (closed("skip", s, `/skip/${i}`) && (!dotted(s.path) || s.path === "" || s.present !== true))
141
+ fail(`/skip/${i}`, "requires path and present: true"); });
142
+ }
143
+ if (r.fields !== undefined) {
144
+ if (!object(r.fields))
145
+ fail("/fields", "must be a mapping");
146
+ else {
147
+ const paths = new Set(Object.keys(r.fields));
148
+ for (const path of paths) {
149
+ const segments = path.split(".");
150
+ if (segments.some((_segment, index) => index > 0 && paths.has(segments.slice(0, index).join("."))))
151
+ fail(`/fields/${path}`, "normalized output paths must not overlap an ancestor path");
152
+ }
153
+ }
154
+ if (object(r.fields))
155
+ for (const [name, field] of Object.entries(r.fields)) {
156
+ if (!dotted(name) || !name) {
157
+ fail(`/fields/${name}`, "invalid normalized record path");
158
+ continue;
159
+ }
160
+ if (!closed("transform", field, `/fields/${name}`))
161
+ continue;
162
+ if (field.from !== undefined && (!dotted(field.from) || !field.from))
163
+ fail(`/fields/${name}/from`, "requires dotted record path");
164
+ if (field.from === undefined && !Object.hasOwn(field, "const"))
165
+ fail(`/fields/${name}`, "requires from or const");
166
+ if (Object.hasOwn(field, "const") && (!scalar(field.const) || field.from !== undefined || field.type !== undefined))
167
+ fail(`/fields/${name}/const`, "const is a scalar and excludes from/type");
168
+ if (field.type !== undefined && !["text", "integer", "date", "epoch-date", "url"].includes(field.type))
169
+ fail(`/fields/${name}/type`, "unknown scalar transform");
170
+ }
171
+ }
172
+ if (r.paging !== undefined && closed("paging", r.paging, "/paging")) {
173
+ const p = r.paging;
174
+ if (!["none", "cursor", "link-header", "offset", "page-number"].includes(p.kind))
175
+ fail("/paging/kind", "unknown paging kind");
176
+ for (const key of ["cursor_path", "next_path"])
177
+ if (p[key] !== undefined && (!dotted(p[key]) || !p[key]))
178
+ fail(`/paging/${key}`, "must be a dotted path");
179
+ for (const key of ["size_param", "page_param", "offset_param"])
180
+ if (p[key] !== undefined && !safeName(p[key]))
181
+ fail(`/paging/${key}`, "must be a parameter name");
182
+ if (p.size !== undefined && (!Number.isSafeInteger(p.size) || p.size < 1 || p.size > 10000))
183
+ fail("/paging/size", "must be an integer from 1 to 10000");
184
+ if ((p.kind === "offset" || p.kind === "page-number") && (!p.size || !(p.kind === "offset" ? p.offset_param : p.page_param)))
185
+ fail("/paging", "numeric paging requires size and its parameter");
186
+ if (p.kind === "cursor" && !p.cursor_path && !p.next_path)
187
+ fail("/paging", "cursor paging requires cursor_path or next_path");
188
+ }
189
+ if (r.watermark !== undefined && closed("watermark", r.watermark, "/watermark")) {
190
+ if (!dotted(r.watermark.field) || !r.watermark.field || typeof r.watermark.param !== "string" || !safeName(r.watermark.param) || !Number.isSafeInteger(r.watermark.overlap_seconds) || r.watermark.overlap_seconds < 0)
191
+ fail("/watermark", "requires field, param and nonnegative overlap_seconds");
192
+ }
193
+ if (r.complete !== undefined && r.complete !== "always" && r.complete !== "never") {
194
+ if (closed("complete", r.complete, "/complete") && (!dotted(r.complete.when_path) || !scalar(r.complete.equals)))
195
+ fail("/complete", "requires when_path and scalar equals");
196
+ }
197
+ if (r.errors !== undefined && closed("errors", r.errors, "/errors")) {
198
+ const seen = new Set();
199
+ for (const [key, list] of Object.entries(r.errors)) {
200
+ if (!Array.isArray(list) || !list.every(s => Number.isInteger(s) && s >= 400 && s <= 599 && !seen.has(s) && !!seen.add(s)))
201
+ fail(`/errors/${key}`, "requires disjoint HTTP error status sets");
202
+ }
203
+ }
204
+ if (r.rate !== undefined && closed("rate", r.rate, "/rate") && (!Number.isSafeInteger(r.rate.requests) || r.rate.requests < 1))
205
+ fail("/rate/requests", "requires a positive integer");
206
+ if (r.graphql !== undefined && closed("graphql", r.graphql, "/graphql")) {
207
+ const problem = graphqlReadProblem(r.graphql.query, r.graphql.variables);
208
+ if (problem)
209
+ fail("/graphql", problem);
210
+ if (r.method !== "POST" || r.body !== undefined)
211
+ fail("/graphql", "requires POST without a body map");
212
+ if (object(r.graphql.variables))
213
+ for (const [k, v] of Object.entries(r.graphql.variables))
214
+ template(v, `/graphql/variables/${k}`);
215
+ }
216
+ const mentions = JSON.stringify([r.path, r.query, r.body, r.graphql?.variables]);
217
+ for (const p of params)
218
+ if (!mentions.includes(`{${p}}`))
219
+ fail("", "every resource binding placeholder must appear in the request");
220
+ if (connector) {
221
+ const credential = credentialHosts(connector.auth).includes(r.host);
222
+ const row = providerRequestRules(connector.auth);
223
+ if (!credential && !connector.domains.includes(r.host))
224
+ fail("/host", "host is not declared");
225
+ if (credential && !row?.read_paths.includes(r.path))
226
+ fail("/path", "path is outside the provider read_paths");
227
+ if (r.method === "POST" && (!credential || !row?.read_posts.some(p => p.path === r.path)))
228
+ fail("/method", "POST is outside provider read_posts");
229
+ if (r.path === "/graphql" && !r.graphql)
230
+ fail("/graphql", "GraphQL path requires a parsed query declaration");
231
+ for (const name of Object.keys(r.headers ?? {}))
232
+ if (name !== name.toLowerCase() || name !== "accept" && !row?.headers.includes(name))
233
+ fail(`/headers/${name}`, "header is outside the provider allowlist");
234
+ }
235
+ return errors;
236
+ }
237
+ export function readPath(value, path) {
238
+ let next = value;
239
+ if (!path)
240
+ return next;
241
+ for (const name of path.split(".")) {
242
+ if (!safeName(name) || !object(next) || !Object.hasOwn(next, name))
243
+ return undefined;
244
+ next = next[name];
245
+ }
246
+ return next;
247
+ }
248
+ export function renderRequestValue(value, parameters, dynamic) {
249
+ return typeof value === "string" ? value.replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/g, (_, n) => {
250
+ const result = parameters[n] ?? dynamic[n];
251
+ if (result === undefined)
252
+ throw new Error("missing request binding");
253
+ return result;
254
+ }) : value;
255
+ }
256
+ /** Guard-owned rules. Caller hooks may narrow these rules but cannot widen them. */
257
+ export function declarationRequestRules(connector, bound) {
258
+ const request = bound.source.request;
259
+ const row = providerRequestRules(connector.auth);
260
+ const parameters = bound.parameters;
261
+ const bindingsValid = placeholders(bound.source.identity.resource).every(name => typeof parameters[name] === "string" && parameters[name] !== "" && parameters[name] !== "." && parameters[name] !== "..");
262
+ let repositoryId;
263
+ const expectedPath = request.path.replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/g, (_, n) => encodeURIComponent(parameters[n] ?? ""));
264
+ const valuesPresent = (url, body) => {
265
+ let bodyValues = [];
266
+ if (body)
267
+ try {
268
+ const parsed = JSON.parse(body);
269
+ if (object(parsed))
270
+ bodyValues = object(parsed.variables) ? Object.values(parsed.variables) : Object.values(parsed);
271
+ }
272
+ catch {
273
+ return false;
274
+ }
275
+ const actual = [...url.pathname.split("/").map(v => { try {
276
+ return decodeURIComponent(v);
277
+ }
278
+ catch {
279
+ return "";
280
+ } }), ...url.searchParams.values(), ...bodyValues];
281
+ return Object.values(parameters).every(value => actual.includes(value));
282
+ };
283
+ const nextPath = (url) => repositoryId !== undefined && row?.next.some(form => url.pathname === form.path.replace("{id}", repositoryId)) === true;
284
+ const queryAllowed = (url) => {
285
+ const p = request.paging;
286
+ const cursors = p?.kind === "link-header" ? row?.paging_cursors ?? {} : {};
287
+ const dynamic = new Set([p?.size_param, p?.page_param, p?.offset_param, request.watermark?.param, ...(p?.kind === "link-header" ? row?.paging_query ?? [] : []), ...Object.keys(cursors)]);
288
+ for (const [name, value] of url.searchParams) {
289
+ if (Object.hasOwn(cursors, name) && (url.searchParams.getAll(name).length !== 1 || value.length > cursors[name] || !/^[\x21-\x7e]+$/.test(value)))
290
+ return false;
291
+ if (dynamic.has(name))
292
+ continue;
293
+ const declared = request.query?.[name];
294
+ if (declared === undefined)
295
+ return false;
296
+ if (typeof declared === "string" && /^\{(?:cursor|page|watermark)\}$/.test(declared))
297
+ continue;
298
+ try {
299
+ if (String(renderRequestValue(declared, parameters, {})) !== value)
300
+ return false;
301
+ }
302
+ catch {
303
+ return false;
304
+ }
305
+ }
306
+ for (const [name, value] of Object.entries(request.query ?? {})) {
307
+ if (typeof value === "string" && /^\{(?:cursor|page|watermark)\}$/.test(value))
308
+ continue;
309
+ try {
310
+ if (url.searchParams.getAll(name).length !== 1 || url.searchParams.get(name) !== String(renderRequestValue(value, parameters, {})))
311
+ return false;
312
+ }
313
+ catch {
314
+ return false;
315
+ }
316
+ }
317
+ return true;
318
+ };
319
+ return {
320
+ header: name => name === "accept" || row?.headers.includes(name) === true,
321
+ url(url, hop) {
322
+ if (!bindingsValid || url.hostname !== request.host || hop.method !== request.method || !queryAllowed(url))
323
+ return false;
324
+ if (url.pathname === expectedPath)
325
+ return request.method === "POST" || valuesPresent(url);
326
+ return request.method === "GET" && (request.paging?.kind === "link-header" || !!request.paging?.next_path) && nextPath(url);
327
+ },
328
+ post(url, body) {
329
+ const post = row?.read_posts.find(p => p.path === request.path);
330
+ if (!post || url.pathname !== expectedPath || !valuesPresent(url, body))
331
+ return false;
332
+ if (post.graphql) {
333
+ try {
334
+ const parsed = JSON.parse(body ?? "");
335
+ if (!object(parsed) || Object.keys(parsed).some(k => k !== "query" && k !== "variables"))
336
+ return false;
337
+ // The body must execute the pinned declaration, so aliases/fragments cannot broaden its resource scope.
338
+ const cursorVariables = Object.fromEntries(Object.entries(request.graphql?.variables ?? {}).filter(([, value]) => value === "{cursor}").map(([name]) => [name, object(parsed.variables) ? String(parsed.variables[name]) : ""]));
339
+ return parsed.query === request.graphql?.query && !graphqlReadProblem(parsed.query, parsed.variables, { ...parameters, ...cursorVariables });
340
+ }
341
+ catch {
342
+ return false;
343
+ }
344
+ }
345
+ return true;
346
+ },
347
+ response(response) {
348
+ if (repositoryId !== undefined || response.url !== undefined && new URL(response.url).pathname !== expectedPath)
349
+ return;
350
+ let parsed;
351
+ try {
352
+ parsed = JSON.parse(response.body);
353
+ }
354
+ catch {
355
+ return;
356
+ }
357
+ const records = readPath(parsed, request.items);
358
+ if (!Array.isArray(records))
359
+ return;
360
+ const resource = `https://${request.host}/repos/${parameters.owner}/${parameters.repo}`;
361
+ const ids = records.flatMap(record => {
362
+ const repository = readPath(record, "repository");
363
+ return object(repository) && Number.isSafeInteger(repository.id) && Number(repository.id) > 0 && (repository.url === resource || repository.full_name === `${parameters.owner}/${parameters.repo}`) ? [String(repository.id)] : [];
364
+ });
365
+ if (ids.length === records.length && ids.length && ids.every(id => id === ids[0]))
366
+ repositoryId = ids[0];
367
+ },
368
+ };
369
+ }
370
+ //# sourceMappingURL=connector-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-request.js","sourceRoot":"","sources":["../src/connector-request.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,23 @@
1
+ /**
2
+ * `@superbee/core/connectors`: target-agnostic Connector declarations.
3
+ *
4
+ * A Connector is a `type: Connector` document under `connectors/` that says what an integration
5
+ * is: the credential kind (whose hosts come only from core's {@link AUTH_PROVIDERS} table, never
6
+ * from the document), keyless `domains`, `record_sources` that map normalized records onto one
7
+ * target Kind's fields, and actions and events as declared shapes. The document holds no authority:
8
+ * nothing here fetches, executes or receives. {@link parseConnectorDoc} is the one parser, every
9
+ * nested block is closed by {@link CONNECTOR_KEYS}, and {@link connectorPinDigest} reads the same
10
+ * table, so a key cannot be accepted without being pinned.
11
+ *
12
+ * The mapping contract is code: {@link mapRecord} never lets a mapping gap erase a stored value (an
13
+ * unobserved field is carried, an unmapped value is kept or refuses the record, and only an
14
+ * explicit empty value clears an optional field); {@link changeBetween} builds the record-overlay
15
+ * change; {@link findingsFor} turns diagnostics into findings for `planFindings`.
16
+ * Storage-neutral: no Node globals or builtins.
17
+ */
18
+ import { type ConnectorRequest } from "./connector-request.js";
19
+ export { AUTH_PROVIDER_REQUEST_RULES, validateConnectorRequest, readPath as readSourcePath, renderRequestValue } from "./connector-request.js";
20
+ export type { ConnectorRequest } from "./connector-request.js";
1
21
  import { type KindConvention, type KindRegistry } from "./kinds.js";
2
22
  import type { Finding, OverlayPolicy, RecordChange } from "./record-overlay/types.js";
3
23
  import type { ConceptId, Frontmatter, OkfDocument } from "./types.js";
@@ -18,6 +38,15 @@ export declare const AUTH_PROVIDERS: Readonly<Record<string, readonly string[]>>
18
38
  export declare const CONNECTOR_KEYS: Readonly<{
19
39
  auth: readonly string[];
20
40
  source: readonly string[];
41
+ request: readonly string[];
42
+ paging: readonly string[];
43
+ watermark: readonly string[];
44
+ errors: readonly string[];
45
+ rate: readonly string[];
46
+ graphql: readonly string[];
47
+ transform: readonly string[];
48
+ skip: readonly string[];
49
+ complete: readonly string[];
21
50
  identity: readonly string[];
22
51
  mapping: readonly string[];
23
52
  action: readonly string[];
@@ -70,6 +99,7 @@ export interface ConnectorSource {
70
99
  /** Target field to mapping; the keys are the fields a Source Feed may own. */
71
100
  fields: Record<string, ConnectorMapping>;
72
101
  completeness: "complete" | "partial";
102
+ request?: ConnectorRequest;
73
103
  }
74
104
  export interface ConnectorInput {
75
105
  type: "string" | "text" | "integer" | "boolean";
@@ -124,6 +154,8 @@ export declare function parseConnectorDoc(doc: OkfDocument, ctx?: {
124
154
  }): ConnectorParseResult;
125
155
  /** The Kind rules over a bundle's registry; a source whose target Kind is not declared is refused. */
126
156
  export declare function checkConnectorAgainstKinds(connector: Connector, kinds: KindRegistry): ConnectorError[];
157
+ /** Detect credential-shaped text without returning or echoing its value. */
158
+ export declare function containsCredentialText(text: string): boolean;
127
159
  /**
128
160
  * The digest a Connection records at enable time: every key {@link CONNECTOR_KEYS} accepts, with
129
161
  * defaults filled and order-free lists sorted, plus the credential hosts core resolves the auth kind