@gate-forge/witness 0.0.0-stage → 0.8.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.
Files changed (123) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +114 -2
  3. package/dist/adapter/contract-suite.d.ts +167 -0
  4. package/dist/adapter/contract-suite.d.ts.map +1 -0
  5. package/dist/adapter/contract-suite.js +348 -0
  6. package/dist/adapter/contract-suite.js.map +1 -0
  7. package/dist/adapter/contract.d.ts +266 -0
  8. package/dist/adapter/contract.d.ts.map +1 -0
  9. package/dist/adapter/contract.js +2 -0
  10. package/dist/adapter/contract.js.map +1 -0
  11. package/dist/adapter/index.d.ts +8 -0
  12. package/dist/adapter/index.d.ts.map +1 -0
  13. package/dist/adapter/index.js +2 -0
  14. package/dist/adapter/index.js.map +1 -0
  15. package/dist/adapter-kit/config.d.ts +163 -0
  16. package/dist/adapter-kit/config.d.ts.map +1 -0
  17. package/dist/adapter-kit/config.js +21 -0
  18. package/dist/adapter-kit/config.js.map +1 -0
  19. package/dist/adapter-kit/define.d.ts +47 -0
  20. package/dist/adapter-kit/define.d.ts.map +1 -0
  21. package/dist/adapter-kit/define.js +336 -0
  22. package/dist/adapter-kit/define.js.map +1 -0
  23. package/dist/adapter-kit/index.d.ts +34 -0
  24. package/dist/adapter-kit/index.d.ts.map +1 -0
  25. package/dist/adapter-kit/index.js +32 -0
  26. package/dist/adapter-kit/index.js.map +1 -0
  27. package/dist/adapter-kit/projection.d.ts +69 -0
  28. package/dist/adapter-kit/projection.d.ts.map +1 -0
  29. package/dist/adapter-kit/projection.js +85 -0
  30. package/dist/adapter-kit/projection.js.map +1 -0
  31. package/dist/adapter-kit/session.d.ts +105 -0
  32. package/dist/adapter-kit/session.d.ts.map +1 -0
  33. package/dist/adapter-kit/session.js +230 -0
  34. package/dist/adapter-kit/session.js.map +1 -0
  35. package/dist/client/witness-client.d.ts +193 -0
  36. package/dist/client/witness-client.d.ts.map +1 -0
  37. package/dist/client/witness-client.js +321 -0
  38. package/dist/client/witness-client.js.map +1 -0
  39. package/dist/constants.d.ts +189 -0
  40. package/dist/constants.d.ts.map +1 -0
  41. package/dist/constants.js +197 -0
  42. package/dist/constants.js.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +20 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/json.d.ts +16 -0
  48. package/dist/json.d.ts.map +1 -0
  49. package/dist/json.js +21 -0
  50. package/dist/json.js.map +1 -0
  51. package/dist/queue/bullmq.d.ts +28 -0
  52. package/dist/queue/bullmq.d.ts.map +1 -0
  53. package/dist/queue/bullmq.js +210 -0
  54. package/dist/queue/bullmq.js.map +1 -0
  55. package/dist/queue/observer.d.ts +130 -0
  56. package/dist/queue/observer.d.ts.map +1 -0
  57. package/dist/queue/observer.js +179 -0
  58. package/dist/queue/observer.js.map +1 -0
  59. package/dist/surface.d.ts +211 -0
  60. package/dist/surface.d.ts.map +1 -0
  61. package/dist/surface.js +268 -0
  62. package/dist/surface.js.map +1 -0
  63. package/dist/witness/adapter-registry.d.ts +92 -0
  64. package/dist/witness/adapter-registry.d.ts.map +1 -0
  65. package/dist/witness/adapter-registry.js +370 -0
  66. package/dist/witness/adapter-registry.js.map +1 -0
  67. package/dist/witness/behavior-request.d.ts +80 -0
  68. package/dist/witness/behavior-request.d.ts.map +1 -0
  69. package/dist/witness/behavior-request.js +335 -0
  70. package/dist/witness/behavior-request.js.map +1 -0
  71. package/dist/witness/behavior.d.ts +52 -0
  72. package/dist/witness/behavior.d.ts.map +1 -0
  73. package/dist/witness/behavior.js +118 -0
  74. package/dist/witness/behavior.js.map +1 -0
  75. package/dist/witness/bin.d.ts +21 -0
  76. package/dist/witness/bin.d.ts.map +1 -0
  77. package/dist/witness/bin.js +254 -0
  78. package/dist/witness/bin.js.map +1 -0
  79. package/dist/witness/browser.d.ts +221 -0
  80. package/dist/witness/browser.d.ts.map +1 -0
  81. package/dist/witness/browser.js +644 -0
  82. package/dist/witness/browser.js.map +1 -0
  83. package/dist/witness/chaos.d.ts +179 -0
  84. package/dist/witness/chaos.d.ts.map +1 -0
  85. package/dist/witness/chaos.js +270 -0
  86. package/dist/witness/chaos.js.map +1 -0
  87. package/dist/witness/classifications.d.ts +42 -0
  88. package/dist/witness/classifications.d.ts.map +1 -0
  89. package/dist/witness/classifications.js +87 -0
  90. package/dist/witness/classifications.js.map +1 -0
  91. package/dist/witness/env-attestation.d.ts +98 -0
  92. package/dist/witness/env-attestation.d.ts.map +1 -0
  93. package/dist/witness/env-attestation.js +202 -0
  94. package/dist/witness/env-attestation.js.map +1 -0
  95. package/dist/witness/fixture-provider.d.ts +89 -0
  96. package/dist/witness/fixture-provider.d.ts.map +1 -0
  97. package/dist/witness/fixture-provider.js +116 -0
  98. package/dist/witness/fixture-provider.js.map +1 -0
  99. package/dist/witness/loopback-pins.d.ts +79 -0
  100. package/dist/witness/loopback-pins.d.ts.map +1 -0
  101. package/dist/witness/loopback-pins.js +244 -0
  102. package/dist/witness/loopback-pins.js.map +1 -0
  103. package/dist/witness/run-options.d.ts +47 -0
  104. package/dist/witness/run-options.d.ts.map +1 -0
  105. package/dist/witness/run-options.js +179 -0
  106. package/dist/witness/run-options.js.map +1 -0
  107. package/dist/witness/server.d.ts +34 -0
  108. package/dist/witness/server.d.ts.map +1 -0
  109. package/dist/witness/server.js +4899 -0
  110. package/dist/witness/server.js.map +1 -0
  111. package/dist/witness/task.d.ts +77 -0
  112. package/dist/witness/task.d.ts.map +1 -0
  113. package/dist/witness/task.js +201 -0
  114. package/dist/witness/task.js.map +1 -0
  115. package/dist/witness/twin-shapes.d.ts +51 -0
  116. package/dist/witness/twin-shapes.d.ts.map +1 -0
  117. package/dist/witness/twin-shapes.js +127 -0
  118. package/dist/witness/twin-shapes.js.map +1 -0
  119. package/dist/witness/types.d.ts +1094 -0
  120. package/dist/witness/types.d.ts.map +1 -0
  121. package/dist/witness/types.js +2 -0
  122. package/dist/witness/types.js.map +1 -0
  123. package/package.json +98 -4
@@ -0,0 +1,2 @@
1
+ export { CONTRACT_SCENARIOS, contractScenario, runRunnerAdapterContract } from './contract-suite.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Adapter-kit configuration: the reviewed CONFIG a project writes
3
+ * instead of a hand-rolled `read`/`list`/`normalize` triple.
4
+ *
5
+ * The kit is a constructor, never a contract change: what it returns is
6
+ * the frozen pin-#8 `EvidenceAdapter` a hand-written module exports, and
7
+ * a hand-written module keeps working unchanged. Everything here is
8
+ * GET-only — the kit can log in (one POST to a declared login path
9
+ * with credentials named by WITNESS env vars) and then read, but it can
10
+ * never create, update, or delete business state.
11
+ *
12
+ * Design rules carried by these types:
13
+ * - every doubt fails closed with a plain message (a truncated list, an
14
+ * unknown field, a redirect-only path, a cap that hid rows);
15
+ * - `volatileFields` is declared, never inferred: the engine skips the
16
+ * exact-value echo for those keys and says so in the report;
17
+ * - credentials are named by ENV VAR, never inlined, and are read only
18
+ * from the witness process environment.
19
+ */
20
+ /** How one collection read walks its pages. */
21
+ export type PagingKind = 'cursor' | 'page' | 'offset';
22
+ /**
23
+ * Paging declaration for a collection read. Bounded on purpose: a walk
24
+ * that reaches the cap with a next page available is a TRUNCATION, not
25
+ * a complete list, and the kit fails closed instead of returning a
26
+ * partial id set (E11, E27).
27
+ */
28
+ export interface HttpAdapterPaging {
29
+ /** Cursor-, page-number-, or offset-addressed pages. */
30
+ kind: PagingKind;
31
+ /** Rows per page for `page`/`offset` (default 100). */
32
+ pageSize?: number;
33
+ /** Hard page cap for every kind (default 100). */
34
+ maxPages?: number;
35
+ /** Query parameter carrying the page number (default `page`). */
36
+ pageParam?: string;
37
+ /** Query parameter carrying the page size (default `page_size`). */
38
+ pageSizeParam?: string;
39
+ /** Query parameter carrying the offset (default `offset`). */
40
+ offsetParam?: string;
41
+ /** Query parameter carrying the row limit (default `limit`). */
42
+ limitParam?: string;
43
+ }
44
+ /** One named login seat: credentials named by WITNESS env vars. */
45
+ export interface CookieLoginSeat {
46
+ /** Path the one login POST is sent to (absolute path). */
47
+ loginPath: string;
48
+ /**
49
+ * Login request body field -> WITNESS env var holding its value.
50
+ * The values are read from `process.env` at call time and never
51
+ * printed, logged, or written anywhere.
52
+ */
53
+ credentials: Readonly<Record<string, string>>;
54
+ /** Keep only this cookie name from the login response (default: all). */
55
+ cookieName?: string;
56
+ /** Extra headers for the login POST (e.g. `content-type`). */
57
+ headers?: Readonly<Record<string, string>>;
58
+ }
59
+ /** One named bearer seat: a token named by a WITNESS env var. */
60
+ export interface BearerSeat {
61
+ /** WITNESS env var holding the bearer token. */
62
+ tokenEnv: string;
63
+ /** Prefix prepended to the token (default `Bearer`). */
64
+ scheme?: string;
65
+ }
66
+ /** Read authentication for one adapter (witness-side only). */
67
+ export type HttpAdapterAuth = {
68
+ kind: 'none';
69
+ } | {
70
+ kind: 'bearer';
71
+ seats: Readonly<Record<string, BearerSeat>>;
72
+ seat?: string;
73
+ } | {
74
+ kind: 'cookie-login';
75
+ seats: Readonly<Record<string, CookieLoginSeat>>;
76
+ seat?: string;
77
+ };
78
+ /** One kit adapter's whole declaration. */
79
+ export interface HttpAdapterConfig {
80
+ /** Registry identity; must equal the adapter file name. */
81
+ resourceId: string;
82
+ /**
83
+ * By-id read path. A function receives the entity id; a string may
84
+ * carry the `{id}` placeholder. `null` resolves members from the
85
+ * collection read instead.
86
+ */
87
+ readPath?: string | ((id: string) => string) | null;
88
+ /** Key holding the entity inside a by-id response body (default: none). */
89
+ itemWrapper?: string | null;
90
+ /** Collection path, or a `(cursor) => path` function for cursors. */
91
+ listPath?: string | ((cursor: string | undefined) => string) | null;
92
+ /** Key holding the array in a collection body, or a selector. */
93
+ collectionKey?: string | ((body: unknown) => unknown) | null;
94
+ /** Next cursor from a page body (cursor paging only). */
95
+ pageCursor?: (body: unknown) => string | null | undefined;
96
+ /** Paging declaration for the collection walk. */
97
+ paging?: HttpAdapterPaging;
98
+ /**
99
+ * Per-parent fan-out: composes a whole collection from several
100
+ * collections. Receives `readAll(pathFor, shape)` and MUST return the
101
+ * complete member list.
102
+ */
103
+ listCollection?: (readAll: CollectionReader) => Promise<readonly unknown[]>;
104
+ /**
105
+ * Projected business fields. Dotted paths are allowed (`owner.name`)
106
+ * and every declared key is checked against the compiled graph by
107
+ * `gateforge adapters check`.
108
+ */
109
+ fields?: readonly string[];
110
+ /** Projected name -> key the response actually carries. */
111
+ fieldMap?: Readonly<Record<string, string>>;
112
+ /** Key identifying the entity when the row has no `id` (default `id`). */
113
+ entityIdKey?: string;
114
+ /** How removal manifests for this resource. */
115
+ deletion: 'hard' | 'archive';
116
+ /** Target-environment marker the witness compares (GF-13). */
117
+ environmentFingerprint: string;
118
+ /**
119
+ * Fields the SERVER computes on its own. The engine skips the
120
+ * exact-value echo for them and reports the skip — never silently.
121
+ */
122
+ volatileFields?: readonly string[];
123
+ /** Entity-scoped create absence without a collection list. */
124
+ identity?: 'natural-key';
125
+ /** Read authentication (witness environment credentials only). */
126
+ auth?: HttpAdapterAuth;
127
+ /** Base override for THIS adapter's reads. */
128
+ baseUrl?: string;
129
+ /** Optional server probe (contract addition, passed through as-is). */
130
+ probeServer?: (...args: never[]) => unknown;
131
+ /** Optional observe binding (contract addition, passed through as-is). */
132
+ observe?: unknown;
133
+ /** Optional trusted scope observation (contract addition). */
134
+ snapshotScope?: (...args: never[]) => unknown;
135
+ /** Optional completion-barrier observer (contract addition). */
136
+ awaitBarrier?: (...args: never[]) => unknown;
137
+ }
138
+ /** Options a {@link CollectionReader} call accepts. */
139
+ export interface CollectionReadOptions {
140
+ /** Key holding the array in the page body (default: none). */
141
+ collectionKey?: string | ((body: unknown) => unknown) | null;
142
+ /** Next cursor from a page body (cursor paging only). */
143
+ pageCursor?: (body: unknown) => string | null | undefined;
144
+ /** Paging override for this collection. */
145
+ paging?: HttpAdapterPaging;
146
+ /** Page cap override for this collection. */
147
+ maxPages?: number;
148
+ }
149
+ /**
150
+ * Reads one (possibly paged) collection to completion.
151
+ *
152
+ * Args:
153
+ * pathFor: collection path, or a `(cursor) => path` function.
154
+ * options: collection key, cursor extraction, and paging overrides.
155
+ *
156
+ * Returns:
157
+ * Promise<readonly unknown[]>: every member row across all pages.
158
+ * @throws Error when a page is malformed, a cursor repeats, or the walk
159
+ * reaches its cap with rows still unread (a truncated list is never
160
+ * reported as a complete one).
161
+ */
162
+ export type CollectionReader = (pathFor: string | ((cursor: string | undefined) => string), options?: CollectionReadOptions) => Promise<readonly unknown[]>;
163
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/adapter-kit/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Adapter-kit configuration: the reviewed CONFIG a project writes
3
+ * instead of a hand-rolled `read`/`list`/`normalize` triple.
4
+ *
5
+ * The kit is a constructor, never a contract change: what it returns is
6
+ * the frozen pin-#8 `EvidenceAdapter` a hand-written module exports, and
7
+ * a hand-written module keeps working unchanged. Everything here is
8
+ * GET-only — the kit can log in (one POST to a declared login path
9
+ * with credentials named by WITNESS env vars) and then read, but it can
10
+ * never create, update, or delete business state.
11
+ *
12
+ * Design rules carried by these types:
13
+ * - every doubt fails closed with a plain message (a truncated list, an
14
+ * unknown field, a redirect-only path, a cap that hid rows);
15
+ * - `volatileFields` is declared, never inferred: the engine skips the
16
+ * exact-value echo for those keys and says so in the report;
17
+ * - credentials are named by ENV VAR, never inlined, and are read only
18
+ * from the witness process environment.
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/adapter-kit/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `defineHttpAdapter(config)`: the reviewed config → contract-valid
3
+ * adapter constructor.
4
+ *
5
+ * What it buys a project: a correct by-id read, a complete (paged)
6
+ * collection read, a deterministic projection, declared
7
+ * server-computed fields, and witness-side login — from configuration
8
+ * instead of a hand-rolled module. What it never does: trust itself.
9
+ * The returned object is an ordinary pin-#8 adapter; the gate treats a
10
+ * generated adapter exactly like a hand-written one, every doubt fails
11
+ * closed with a plain message, and nothing here can write.
12
+ */
13
+ import type { HttpAdapterConfig } from './config.js';
14
+ import type { EvidenceAdapter, SessionIdentity } from '../witness/types.js';
15
+ /** The context a probe read runs under (the audit passes just a base URL). */
16
+ export type KitProbeContext = {
17
+ baseUrl: string;
18
+ headers?: Record<string, string>;
19
+ /**
20
+ * The session a witnessed read belongs to, and the identity THAT
21
+ * session registered (plan Phase 4b item 3b). A probe (no session)
22
+ * carries neither and reads through the environment seat, exactly as
23
+ * before.
24
+ */
25
+ sessionId?: string;
26
+ sessionIdentity?: SessionIdentity | null;
27
+ };
28
+ /** Default page cap for every bounded collection walk. */
29
+ export declare const DEFAULT_MAX_PAGES = 100;
30
+ /** Default rows per page for page/offset paging. */
31
+ export declare const DEFAULT_PAGE_SIZE = 100;
32
+ /**
33
+ * Builds one contract-valid adapter from reviewed configuration.
34
+ *
35
+ * Args:
36
+ * config: the adapter declaration (paths, projection, paging, auth).
37
+ *
38
+ * Returns:
39
+ * EvidenceAdapter: a frozen pin-#8 adapter. `list` is exported only
40
+ * when the config declares a collection read, so a resource without
41
+ * one honestly reports that the witness cannot pre-observe it.
42
+ * @throws Error when the config can never produce a valid adapter
43
+ * (no read and no list; an unusable projection) — fail closed at
44
+ * write time rather than at gate time.
45
+ */
46
+ export declare function defineHttpAdapter(config: HttpAdapterConfig): EvidenceAdapter;
47
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/adapter-kit/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAGV,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAkB,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE5F,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,oDAAoD;AACpD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AA4CrC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CA8S5E"}
@@ -0,0 +1,336 @@
1
+ import { projectEntity } from './projection.js';
2
+ import { createSessionReader, } from './session.js';
3
+ /** Default page cap for every bounded collection walk. */
4
+ export const DEFAULT_MAX_PAGES = 100;
5
+ /** Default rows per page for page/offset paging. */
6
+ export const DEFAULT_PAGE_SIZE = 100;
7
+ /**
8
+ * Appends a query parameter to a path, preserving what is already there.
9
+ *
10
+ * Args:
11
+ * path: path (with any existing query) to extend.
12
+ * key: query parameter name.
13
+ * value: parameter value.
14
+ *
15
+ * Returns:
16
+ * string: the path with one more query parameter.
17
+ */
18
+ function withQuery(path, key, value) {
19
+ const separator = path.includes('?') ? '&' : '?';
20
+ return `${path}${separator}${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
21
+ }
22
+ /**
23
+ * Applies the declared paging to one page path.
24
+ *
25
+ * Args:
26
+ * basePath: the collection path without paging parameters.
27
+ * paging: the paging declaration.
28
+ * page: 1-based page number.
29
+ *
30
+ * Returns:
31
+ * string: the path for that page.
32
+ */
33
+ function pagedPath(basePath, paging, page) {
34
+ if (paging.kind === 'page') {
35
+ const size = paging.pageSize ?? DEFAULT_PAGE_SIZE;
36
+ let path = withQuery(basePath, paging.pageParam ?? 'page', String(page));
37
+ path = withQuery(path, paging.pageSizeParam ?? 'page_size', String(size));
38
+ return path;
39
+ }
40
+ if (paging.kind === 'offset') {
41
+ const size = paging.pageSize ?? DEFAULT_PAGE_SIZE;
42
+ const offset = withQuery(basePath, paging.offsetParam ?? 'offset', String((page - 1) * size));
43
+ return withQuery(offset, paging.limitParam ?? 'limit', String(size));
44
+ }
45
+ return basePath;
46
+ }
47
+ /**
48
+ * Builds one contract-valid adapter from reviewed configuration.
49
+ *
50
+ * Args:
51
+ * config: the adapter declaration (paths, projection, paging, auth).
52
+ *
53
+ * Returns:
54
+ * EvidenceAdapter: a frozen pin-#8 adapter. `list` is exported only
55
+ * when the config declares a collection read, so a resource without
56
+ * one honestly reports that the witness cannot pre-observe it.
57
+ * @throws Error when the config can never produce a valid adapter
58
+ * (no read and no list; an unusable projection) — fail closed at
59
+ * write time rather than at gate time.
60
+ */
61
+ export function defineHttpAdapter(config) {
62
+ const hasRead = config.readPath !== undefined && config.readPath !== null;
63
+ const hasList = (config.listPath !== undefined && config.listPath !== null) ||
64
+ typeof config.listCollection === 'function';
65
+ if (!hasRead && !hasList) {
66
+ throw new Error(`${config.resourceId}: adapter declares neither readPath nor listPath/listCollection — ` +
67
+ 'an evidence adapter must be able to observe the resource');
68
+ }
69
+ const sessions = new Map();
70
+ // The context of the read in flight: a kit `listCollection` callback
71
+ // receives only the reader, never the witness context.
72
+ let lastCtx = null;
73
+ /**
74
+ * Projects one raw body onto the evidence shape.
75
+ *
76
+ * Args:
77
+ * body: the raw response body.
78
+ *
79
+ * Returns:
80
+ * NormalizedEntity: entity id plus the declared projected fields.
81
+ */
82
+ const normalize = (body) => projectEntity(body, {
83
+ ...(config.fields !== undefined ? { fields: config.fields } : {}),
84
+ ...(config.fieldMap !== undefined ? { fieldMap: config.fieldMap } : {}),
85
+ ...(config.entityIdKey !== undefined ? { entityIdKey: config.entityIdKey } : {}),
86
+ });
87
+ /**
88
+ * Reads one path through the kit transport and returns status+body.
89
+ *
90
+ * Args:
91
+ * ctx: the read context (the witness adapter context, or a
92
+ * probe's base URL).
93
+ * path: absolute path to read.
94
+ *
95
+ * Returns:
96
+ * Promise<KitGetResult>: status, headers, parsed body.
97
+ */
98
+ const request = (ctx, path) => createSessionReader({
99
+ ...(config.auth !== undefined ? { auth: config.auth } : {}),
100
+ resourceId: config.resourceId,
101
+ ctx,
102
+ sessions,
103
+ })(path);
104
+ /**
105
+ * Resolves the declared by-id path for one entity.
106
+ *
107
+ * Args:
108
+ * id: the entity id.
109
+ *
110
+ * Returns:
111
+ * string: the by-id path.
112
+ */
113
+ const pathForId = (id) => {
114
+ if (typeof config.readPath === 'function')
115
+ return config.readPath(id);
116
+ return config.readPath.replaceAll('{id}', encodeURIComponent(id));
117
+ };
118
+ /**
119
+ * The exact path this adapter's first collection read hits (null
120
+ * when it composes one itself).
121
+ *
122
+ * Returns:
123
+ * string | null: the first page path, or null.
124
+ */
125
+ const firstListPath = () => {
126
+ if (config.listCollection !== undefined)
127
+ return null;
128
+ if (config.listPath === undefined || config.listPath === null)
129
+ return null;
130
+ const paging = config.paging ?? { kind: 'page' };
131
+ return typeof config.listPath === 'function'
132
+ ? pagedPath(config.listPath(undefined), paging, 1)
133
+ : pagedPath(config.listPath, paging, 1);
134
+ };
135
+ /**
136
+ * Walks one (possibly paged) collection to completion.
137
+ *
138
+ * Args:
139
+ * ctx: the witness adapter context.
140
+ * pathFor: the collection path, or a `(cursor) => path` function.
141
+ * options: collection key, cursor extraction, paging overrides.
142
+ *
143
+ * Returns:
144
+ * Promise<readonly unknown[]>: every member row across all pages.
145
+ * @throws Error on a malformed page, a repeated cursor, or a walk
146
+ * that reached its cap with rows still unread (never a silent
147
+ * truncation).
148
+ */
149
+ const readAllFor = async (ctx, pathFor, options = {}) => {
150
+ const paging = options.paging ?? config.paging ?? { kind: 'page' };
151
+ const maxPages = options.maxPages ?? paging.maxPages ?? DEFAULT_MAX_PAGES;
152
+ const collectionKey = options.collectionKey === undefined ? (config.collectionKey ?? null) : options.collectionKey;
153
+ const pageCursor = options.pageCursor ?? config.pageCursor;
154
+ const rows = [];
155
+ const seenCursors = new Set();
156
+ let cursor;
157
+ for (let page = 1; page <= maxPages; page += 1) {
158
+ let path;
159
+ if (paging.kind === 'cursor') {
160
+ if (typeof pathFor === 'function')
161
+ path = pathFor(cursor);
162
+ else if (cursor === undefined)
163
+ path = pathFor;
164
+ else
165
+ path = withQuery(pathFor, 'cursor', cursor);
166
+ }
167
+ else {
168
+ const base = typeof pathFor === 'function' ? pathFor(undefined) : pathFor;
169
+ path = pagedPath(base, paging, page);
170
+ }
171
+ const result = await request(ctx, path);
172
+ if (result.status < 200 || result.status >= 300) {
173
+ throw new Error(`${config.resourceId}: collection read GET ${path} -> ${String(result.status)}`);
174
+ }
175
+ const pageRows = typeof collectionKey === 'function'
176
+ ? collectionKey(result.body)
177
+ : collectionKey === null || collectionKey === undefined
178
+ ? result.body
179
+ : result.body?.[collectionKey];
180
+ if (!Array.isArray(pageRows)) {
181
+ throw new Error(`${config.resourceId}: collection read GET ${path} returned no array` +
182
+ (collectionKey === null || collectionKey === undefined
183
+ ? ' (declare collectionKey when the body wraps the rows)'
184
+ : ` under '${String(collectionKey)}'`));
185
+ }
186
+ rows.push(...pageRows);
187
+ if (paging.kind === 'cursor') {
188
+ const next = pageCursor?.(result.body);
189
+ if (next === null || next === undefined)
190
+ return rows;
191
+ const key = String(next);
192
+ // A repeated cursor would loop forever and never prove completeness.
193
+ if (seenCursors.has(key)) {
194
+ throw new Error(`${config.resourceId}: collection cursor repeated ('${key}') — the list would never ` +
195
+ 'be complete');
196
+ }
197
+ seenCursors.add(key);
198
+ cursor = key;
199
+ continue;
200
+ }
201
+ const size = paging.pageSize ?? DEFAULT_PAGE_SIZE;
202
+ // A short page IS the last page.
203
+ if (pageRows.length < size)
204
+ return rows;
205
+ // A full page before the cap: keep walking.
206
+ if (page < maxPages)
207
+ continue;
208
+ // A full page AT the cap means rows are unread, which is a
209
+ // truncation, not a list (E11, E27).
210
+ throw new Error(`${config.resourceId}: result truncated — ${String(rows.length)} row(s) read in ` +
211
+ `${String(maxPages)} page(s) of ${String(size)} and the collection still has more ` +
212
+ '(raise paging.maxPages or fix the collectionKey; a partial id set never proves absence)');
213
+ }
214
+ throw new Error(`${config.resourceId}: collection read reached the ${String(maxPages)}-page cap without a ` +
215
+ 'next page (raise paging.maxPages or fix the cursor)');
216
+ };
217
+ /**
218
+ * GET-only read of one entity.
219
+ *
220
+ * Args:
221
+ * ctx: the witness adapter context.
222
+ * id: the entity id.
223
+ *
224
+ * Returns:
225
+ * Promise<unknown>: the raw entity body, or null when absent (404).
226
+ * @throws Error on any non-2xx other than 404, and on a redirect.
227
+ */
228
+ const read = async (ctx, id) => {
229
+ lastCtx = ctx;
230
+ const wanted = String(id);
231
+ if (hasRead) {
232
+ const path = pathForId(wanted);
233
+ const result = await request(ctx, path);
234
+ if (result.status === 404)
235
+ return null;
236
+ if (result.status < 200 || result.status >= 300) {
237
+ throw new Error(`${config.resourceId}: GET ${path} -> ${String(result.status)}`);
238
+ }
239
+ const member = config.itemWrapper === undefined || config.itemWrapper === null
240
+ ? result.body
241
+ : result.body?.[config.itemWrapper];
242
+ return member === undefined ? null : member;
243
+ }
244
+ // Collection-resolved member: the read path is unknown, so the id is
245
+ // located in the complete collection (GET-only).
246
+ const rows = await listEntities(ctx);
247
+ return (rows.find((row) => normalize(row).entityId === wanted) ?? null);
248
+ };
249
+ /**
250
+ * Reads the whole collection through whichever source is declared.
251
+ *
252
+ * Args:
253
+ * ctx: the witness adapter context.
254
+ *
255
+ * Returns:
256
+ * Promise<readonly unknown[]>: every member row.
257
+ */
258
+ const listEntities = async (ctx) => {
259
+ lastCtx = ctx;
260
+ if (config.listCollection !== undefined) {
261
+ const rows = await config.listCollection((pathFor, options) => readAllFor(ctx, pathFor, options));
262
+ if (!Array.isArray(rows)) {
263
+ throw new Error(`${config.resourceId}: composed collection returned no array — listCollection must ` +
264
+ 'resolve the complete member list');
265
+ }
266
+ return rows;
267
+ }
268
+ return readAllFor(ctx, config.listPath, {});
269
+ };
270
+ const readAll = (pathFor, options) => {
271
+ if (lastCtx === null) {
272
+ throw new Error(`${config.resourceId}: collection read used outside an adapter read/list call`);
273
+ }
274
+ return readAllFor(lastCtx, pathFor, options);
275
+ };
276
+ /**
277
+ * Issues ONE read through this adapter's own transport — seat
278
+ * login, cookie/bearer, one re-login on 401, GET-only — so a probe
279
+ * sees exactly what a witnessed run would. Never writes.
280
+ *
281
+ * Args:
282
+ * ctx: the base URL to read (headers, when the app needs them).
283
+ * id: the entity id to read when there is no collection read.
284
+ *
285
+ * Returns:
286
+ * Promise<KitProbeResult>: the path, status, and headers of that read.
287
+ * @throws KitAuthError when the seat's credentials are absent or
288
+ * rejected; KitRedirectError when the read only works through a
289
+ * redirect.
290
+ */
291
+ const probe = async (ctx, id) => {
292
+ const listPath = firstListPath();
293
+ const path = listPath ?? pathForId(id ?? '0');
294
+ const result = await request(ctx, path);
295
+ return { path, status: result.status, headers: result.headers };
296
+ };
297
+ return Object.freeze({
298
+ resourceId: config.resourceId,
299
+ read,
300
+ // Read-only introspection for `gateforge adapters check --probe`:
301
+ // the exact path this adapter's first read of each kind hits. Not
302
+ // part of the pin-#8 contract; ignored by the witness.
303
+ evidencePaths: {
304
+ read: (id) => (hasRead ? pathForId(id) : null),
305
+ list: () => firstListPath(),
306
+ },
307
+ // Read-only introspection for `gateforge adapters check --probe`:
308
+ // the ONE read this adapter would issue, issued through its own
309
+ // seat, so the probe reports what a witnessed run would see. Not
310
+ // part of the pin-#8 contract; ignored by the witness.
311
+ probe,
312
+ ...(hasList
313
+ ? { list: async (ctx) => [...(await listEntities(ctx))] }
314
+ : {}),
315
+ normalize,
316
+ deletion: config.deletion,
317
+ environmentFingerprint: config.environmentFingerprint,
318
+ ...(config.fields !== undefined ? { fields: [...config.fields] } : {}),
319
+ ...(config.volatileFields !== undefined
320
+ ? { volatileFields: [...config.volatileFields] }
321
+ : {}),
322
+ ...(config.identity !== undefined ? { identity: config.identity } : {}),
323
+ ...(config.baseUrl !== undefined ? { baseUrl: config.baseUrl } : {}),
324
+ ...(config.probeServer !== undefined
325
+ ? { probeServer: config.probeServer }
326
+ : {}),
327
+ ...(config.observe !== undefined ? { observe: config.observe } : {}),
328
+ ...(config.snapshotScope !== undefined
329
+ ? { snapshotScope: config.snapshotScope }
330
+ : {}),
331
+ ...(config.awaitBarrier !== undefined
332
+ ? { awaitBarrier: config.awaitBarrier }
333
+ : {}),
334
+ });
335
+ }
336
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/adapter-kit/define.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `@gate-forge/witness/adapter-kit` — the configuration-first
3
+ * constructor for evidence adapters.
4
+ *
5
+ * A project writes a reviewed config (paths, wrapper keys, projected
6
+ * fields, paging, login seat) and gets a contract-valid adapter:
7
+ *
8
+ * ```js
9
+ * import { defineHttpAdapter } from '@gate-forge/witness/adapter-kit';
10
+ *
11
+ * export default defineHttpAdapter({
12
+ * resourceId: 'tenant.accounts',
13
+ * readPath: (id) => `/api/accounts/${encodeURIComponent(id)}`,
14
+ * listPath: '/api/accounts',
15
+ * collectionKey: 'accounts',
16
+ * paging: { kind: 'page', pageSize: 100 },
17
+ * fields: ['first_name', 'last_name', 'status'],
18
+ * deletion: 'archive',
19
+ * environmentFingerprint: 'loopback-v1',
20
+ * });
21
+ * ```
22
+ *
23
+ * The kit is a convenience, never a shortcut past the gate: what it
24
+ * returns is the frozen pin-#8 adapter, the gate grades a generated
25
+ * adapter exactly like a hand-written one, and a generated file is a
26
+ * STARTING POINT for review — `gateforge adapters scaffold` marks
27
+ * every guess and lists what still needs a human.
28
+ */
29
+ export { defineHttpAdapter, DEFAULT_MAX_PAGES, DEFAULT_PAGE_SIZE } from './define.js';
30
+ export type { KitProbeContext } from './define.js';
31
+ export { firstArrayOf, readPath, projectEntity, type NormalizedEntity, type ProjectionConfig, } from './projection.js';
32
+ export { createSessionReader, KitAuthError, KitRedirectError, type KitAuthFailure, type KitGetResult, type KitProbeResult, type SessionReaderOptions, } from './session.js';
33
+ export type { BearerSeat, CollectionReader, CollectionReadOptions, CookieLoginSeat, HttpAdapterAuth, HttpAdapterConfig, HttpAdapterPaging, PagingKind, } from './config.js';
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter-kit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,GACX,MAAM,aAAa,CAAC"}