@synoikia/core 0.1.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 (209) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app.d.ts +79 -0
  3. package/dist/app.js +155 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/approvals/links.d.ts +23 -0
  6. package/dist/approvals/links.js +49 -0
  7. package/dist/approvals/links.js.map +1 -0
  8. package/dist/approvals/service.d.ts +110 -0
  9. package/dist/approvals/service.js +182 -0
  10. package/dist/approvals/service.js.map +1 -0
  11. package/dist/audit-query.d.ts +52 -0
  12. package/dist/audit-query.js +116 -0
  13. package/dist/audit-query.js.map +1 -0
  14. package/dist/audit.d.ts +5 -0
  15. package/dist/audit.js +8 -0
  16. package/dist/audit.js.map +1 -0
  17. package/dist/auth/mcp-auth.d.ts +50 -0
  18. package/dist/auth/mcp-auth.js +160 -0
  19. package/dist/auth/mcp-auth.js.map +1 -0
  20. package/dist/auth/mcp-tokens.d.ts +57 -0
  21. package/dist/auth/mcp-tokens.js +143 -0
  22. package/dist/auth/mcp-tokens.js.map +1 -0
  23. package/dist/auth/oauth.d.ts +188 -0
  24. package/dist/auth/oauth.js +470 -0
  25. package/dist/auth/oauth.js.map +1 -0
  26. package/dist/auth/oidc.d.ts +110 -0
  27. package/dist/auth/oidc.js +221 -0
  28. package/dist/auth/oidc.js.map +1 -0
  29. package/dist/auth/sessions.d.ts +34 -0
  30. package/dist/auth/sessions.js +83 -0
  31. package/dist/auth/sessions.js.map +1 -0
  32. package/dist/auth/throttle.d.ts +31 -0
  33. package/dist/auth/throttle.js +52 -0
  34. package/dist/auth/throttle.js.map +1 -0
  35. package/dist/auth/tokens.d.ts +7 -0
  36. package/dist/auth/tokens.js +40 -0
  37. package/dist/auth/tokens.js.map +1 -0
  38. package/dist/auth/totp.d.ts +14 -0
  39. package/dist/auth/totp.js +81 -0
  40. package/dist/auth/totp.js.map +1 -0
  41. package/dist/auth/users.d.ts +70 -0
  42. package/dist/auth/users.js +296 -0
  43. package/dist/auth/users.js.map +1 -0
  44. package/dist/catalog/groups.d.ts +102 -0
  45. package/dist/catalog/groups.js +363 -0
  46. package/dist/catalog/groups.js.map +1 -0
  47. package/dist/catalog/registry.d.ts +25 -0
  48. package/dist/catalog/registry.js +80 -0
  49. package/dist/catalog/registry.js.map +1 -0
  50. package/dist/catalog/rules.d.ts +128 -0
  51. package/dist/catalog/rules.js +178 -0
  52. package/dist/catalog/rules.js.map +1 -0
  53. package/dist/catalog/sync.d.ts +29 -0
  54. package/dist/catalog/sync.js +222 -0
  55. package/dist/catalog/sync.js.map +1 -0
  56. package/dist/cli.d.ts +3 -0
  57. package/dist/cli.js +83 -0
  58. package/dist/cli.js.map +1 -0
  59. package/dist/config/env.d.ts +40 -0
  60. package/dist/config/env.js +71 -0
  61. package/dist/config/env.js.map +1 -0
  62. package/dist/crypto/index.d.ts +28 -0
  63. package/dist/crypto/index.js +88 -0
  64. package/dist/crypto/index.js.map +1 -0
  65. package/dist/crypto/rotate.d.ts +15 -0
  66. package/dist/crypto/rotate.js +61 -0
  67. package/dist/crypto/rotate.js.map +1 -0
  68. package/dist/db/index.d.ts +17 -0
  69. package/dist/db/index.js +29 -0
  70. package/dist/db/index.js.map +1 -0
  71. package/dist/db/schema.d.ts +4389 -0
  72. package/dist/db/schema.js +372 -0
  73. package/dist/db/schema.js.map +1 -0
  74. package/dist/endpoints/slug.d.ts +3 -0
  75. package/dist/endpoints/slug.js +7 -0
  76. package/dist/endpoints/slug.js.map +1 -0
  77. package/dist/errors.d.ts +16 -0
  78. package/dist/errors.js +29 -0
  79. package/dist/errors.js.map +1 -0
  80. package/dist/events.d.ts +43 -0
  81. package/dist/events.js +16 -0
  82. package/dist/events.js.map +1 -0
  83. package/dist/gate/access.d.ts +47 -0
  84. package/dist/gate/access.js +48 -0
  85. package/dist/gate/access.js.map +1 -0
  86. package/dist/gate/attestation.d.ts +23 -0
  87. package/dist/gate/attestation.js +33 -0
  88. package/dist/gate/attestation.js.map +1 -0
  89. package/dist/gate/canonical.d.ts +3 -0
  90. package/dist/gate/canonical.js +11 -0
  91. package/dist/gate/canonical.js.map +1 -0
  92. package/dist/gate/match.d.ts +67 -0
  93. package/dist/gate/match.js +133 -0
  94. package/dist/gate/match.js.map +1 -0
  95. package/dist/gate/pipeline.d.ts +61 -0
  96. package/dist/gate/pipeline.js +284 -0
  97. package/dist/gate/pipeline.js.map +1 -0
  98. package/dist/gate/preapproval.d.ts +24 -0
  99. package/dist/gate/preapproval.js +48 -0
  100. package/dist/gate/preapproval.js.map +1 -0
  101. package/dist/gate/rate-limit.d.ts +35 -0
  102. package/dist/gate/rate-limit.js +82 -0
  103. package/dist/gate/rate-limit.js.map +1 -0
  104. package/dist/gate/redact.d.ts +23 -0
  105. package/dist/gate/redact.js +87 -0
  106. package/dist/gate/redact.js.map +1 -0
  107. package/dist/http/admin/auth.d.ts +33 -0
  108. package/dist/http/admin/auth.js +338 -0
  109. package/dist/http/admin/auth.js.map +1 -0
  110. package/dist/http/admin/instances.d.ts +5 -0
  111. package/dist/http/admin/instances.js +193 -0
  112. package/dist/http/admin/instances.js.map +1 -0
  113. package/dist/http/admin/system.d.ts +5 -0
  114. package/dist/http/admin/system.js +225 -0
  115. package/dist/http/admin/system.js.map +1 -0
  116. package/dist/http/admin-app.d.ts +9 -0
  117. package/dist/http/admin-app.js +51 -0
  118. package/dist/http/admin-app.js.map +1 -0
  119. package/dist/http/common.d.ts +32 -0
  120. package/dist/http/common.js +80 -0
  121. package/dist/http/common.js.map +1 -0
  122. package/dist/http/mcp/approval-routes.d.ts +11 -0
  123. package/dist/http/mcp/approval-routes.js +117 -0
  124. package/dist/http/mcp/approval-routes.js.map +1 -0
  125. package/dist/http/mcp/endpoint.d.ts +32 -0
  126. package/dist/http/mcp/endpoint.js +293 -0
  127. package/dist/http/mcp/endpoint.js.map +1 -0
  128. package/dist/http/mcp/oauth-routes.d.ts +29 -0
  129. package/dist/http/mcp/oauth-routes.js +465 -0
  130. package/dist/http/mcp/oauth-routes.js.map +1 -0
  131. package/dist/http/mcp/pages.d.ts +63 -0
  132. package/dist/http/mcp/pages.js +200 -0
  133. package/dist/http/mcp/pages.js.map +1 -0
  134. package/dist/http/mcp-app.d.ts +7 -0
  135. package/dist/http/mcp-app.js +30 -0
  136. package/dist/http/mcp-app.js.map +1 -0
  137. package/dist/instances/connection.d.ts +37 -0
  138. package/dist/instances/connection.js +109 -0
  139. package/dist/instances/connection.js.map +1 -0
  140. package/dist/instances/manager.d.ts +313 -0
  141. package/dist/instances/manager.js +600 -0
  142. package/dist/instances/manager.js.map +1 -0
  143. package/dist/instances/settings.d.ts +42 -0
  144. package/dist/instances/settings.js +57 -0
  145. package/dist/instances/settings.js.map +1 -0
  146. package/dist/lenient.d.ts +16 -0
  147. package/dist/lenient.js +51 -0
  148. package/dist/lenient.js.map +1 -0
  149. package/dist/lock.d.ts +28 -0
  150. package/dist/lock.js +77 -0
  151. package/dist/lock.js.map +1 -0
  152. package/dist/main.d.ts +1 -0
  153. package/dist/main.js +38 -0
  154. package/dist/main.js.map +1 -0
  155. package/dist/maintenance.d.ts +10 -0
  156. package/dist/maintenance.js +48 -0
  157. package/dist/maintenance.js.map +1 -0
  158. package/dist/notify/service.d.ts +149 -0
  159. package/dist/notify/service.js +358 -0
  160. package/dist/notify/service.js.map +1 -0
  161. package/dist/plugins/discovery.d.ts +39 -0
  162. package/dist/plugins/discovery.js +157 -0
  163. package/dist/plugins/discovery.js.map +1 -0
  164. package/dist/plugins/minisign.d.ts +25 -0
  165. package/dist/plugins/minisign.js +49 -0
  166. package/dist/plugins/minisign.js.map +1 -0
  167. package/dist/plugins/process.d.ts +55 -0
  168. package/dist/plugins/process.js +162 -0
  169. package/dist/plugins/process.js.map +1 -0
  170. package/dist/plugins/repos.d.ts +198 -0
  171. package/dist/plugins/repos.js +612 -0
  172. package/dist/plugins/repos.js.map +1 -0
  173. package/dist/plugins/supervisor.d.ts +50 -0
  174. package/dist/plugins/supervisor.js +125 -0
  175. package/dist/plugins/supervisor.js.map +1 -0
  176. package/dist/runtime/index.d.ts +28 -0
  177. package/dist/runtime/index.js +248 -0
  178. package/dist/runtime/index.js.map +1 -0
  179. package/dist/sandbox/index.d.ts +53 -0
  180. package/dist/sandbox/index.js +197 -0
  181. package/dist/sandbox/index.js.map +1 -0
  182. package/dist/server.d.ts +16 -0
  183. package/dist/server.js +36 -0
  184. package/dist/server.js.map +1 -0
  185. package/dist/settings.d.ts +43 -0
  186. package/dist/settings.js +99 -0
  187. package/dist/settings.js.map +1 -0
  188. package/dist/testing/index.d.ts +73 -0
  189. package/dist/testing/index.js +174 -0
  190. package/dist/testing/index.js.map +1 -0
  191. package/dist/version.d.ts +2 -0
  192. package/dist/version.js +4 -0
  193. package/dist/version.js.map +1 -0
  194. package/drizzle/0000_init.sql +334 -0
  195. package/drizzle/0001_totp_last_step.sql +1 -0
  196. package/drizzle/0002_access_levels.sql +16 -0
  197. package/drizzle/0003_drop_exclusion_flags.sql +2 -0
  198. package/drizzle/0004_grant_instance_ids.sql +1 -0
  199. package/drizzle/0005_rule_strict_miss.sql +1 -0
  200. package/drizzle/0006_attestation_waived.sql +1 -0
  201. package/drizzle/meta/0000_snapshot.json +2318 -0
  202. package/drizzle/meta/0001_snapshot.json +2325 -0
  203. package/drizzle/meta/0002_snapshot.json +2348 -0
  204. package/drizzle/meta/0003_snapshot.json +2332 -0
  205. package/drizzle/meta/0004_snapshot.json +2339 -0
  206. package/drizzle/meta/0005_snapshot.json +2346 -0
  207. package/drizzle/meta/0006_snapshot.json +2354 -0
  208. package/drizzle/meta/_journal.json +55 -0
  209. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/gate/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ResolvedTarget } from '@synoikia/plugin-sdk';
2
+ import type { Db } from '../db/index.js';
3
+ export type PreApprovalOutcome = {
4
+ kind: 'auto_approved';
5
+ ruleId: string;
6
+ }
7
+ /** Rules matched but all were at their rate limit: the call falls back to a human (TN §3.5). */
8
+ | {
9
+ kind: 'rate_limited';
10
+ ruleIds: string[];
11
+ } | {
12
+ kind: 'no_match';
13
+ };
14
+ /**
15
+ * Finds an enabled, unexpired rule for the operation whose match holds and which has rate budget left,
16
+ * and records the hit, all in one transaction so concurrent calls can't overshoot a limit. Callers
17
+ * must never pass a locked operation (design §5.2 step 6); rules on locked ops are also disabled at sync.
18
+ */
19
+ export declare function evaluatePreApproval(db: Db, input: {
20
+ instanceId: string;
21
+ operationId: string;
22
+ params: unknown;
23
+ targets: readonly ResolvedTarget[];
24
+ }, now?: Date): PreApprovalOutcome;
@@ -0,0 +1,48 @@
1
+ import { and, asc, count, eq, gt } from 'drizzle-orm';
2
+ import { preApprovalHits, preApprovalRules } from '../db/schema.js';
3
+ import { conditionsHold, coversAllParams, MatchSchema } from './match.js';
4
+ /**
5
+ * Finds an enabled, unexpired rule for the operation whose match holds and which has rate budget left,
6
+ * and records the hit, all in one transaction so concurrent calls can't overshoot a limit. Callers
7
+ * must never pass a locked operation (design §5.2 step 6); rules on locked ops are also disabled at sync.
8
+ */
9
+ export function evaluatePreApproval(db, input, now = new Date()) {
10
+ return db.transaction((tx) => {
11
+ const rules = tx
12
+ .select()
13
+ .from(preApprovalRules)
14
+ .where(and(eq(preApprovalRules.instanceId, input.instanceId), eq(preApprovalRules.operationId, input.operationId), eq(preApprovalRules.enabled, true)))
15
+ .orderBy(asc(preApprovalRules.createdAt))
16
+ .all();
17
+ const limited = [];
18
+ for (const rule of rules) {
19
+ if (rule.expiresAt && rule.expiresAt.getTime() <= now.getTime())
20
+ continue;
21
+ const match = MatchSchema.safeParse(rule.match);
22
+ if (!match.success || !conditionsHold(match.data, { params: input.params, targets: input.targets }))
23
+ continue;
24
+ if (!coversAllParams(match.data, input.params)) {
25
+ // It would have matched before strict matching: remember it so the rule list can say why.
26
+ tx.update(preApprovalRules).set({ strictMissAt: now }).where(eq(preApprovalRules.id, rule.id)).run();
27
+ continue;
28
+ }
29
+ if (rule.rateLimit != null) {
30
+ const windowMs = (rule.windowSeconds ?? 3600) * 1000;
31
+ const used = tx
32
+ .select({ n: count() })
33
+ .from(preApprovalHits)
34
+ .where(and(eq(preApprovalHits.ruleId, rule.id), gt(preApprovalHits.occurredAt, new Date(now.getTime() - windowMs))))
35
+ .get()?.n ?? 0;
36
+ if (used >= rule.rateLimit) {
37
+ limited.push(rule.id);
38
+ continue;
39
+ }
40
+ }
41
+ tx.insert(preApprovalHits).values({ ruleId: rule.id, occurredAt: now }).run();
42
+ tx.update(preApprovalRules).set({ lastTriggeredAt: now }).where(eq(preApprovalRules.id, rule.id)).run();
43
+ return { kind: 'auto_approved', ruleId: rule.id };
44
+ }
45
+ return limited.length > 0 ? { kind: 'rate_limited', ruleIds: limited } : { kind: 'no_match' };
46
+ });
47
+ }
48
+ //# sourceMappingURL=preapproval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preapproval.js","sourceRoot":"","sources":["../../src/gate/preapproval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Sliding windows of hit timestamps per key, bounded in memory: keys whose window has passed are
3
+ * dropped, and past `maxKeys` the keys with the fewest hits go first. Callers keyed by anything a client
4
+ * chooses (usernames, IPs, principals) can't grow it without limit.
5
+ */
6
+ export declare class HitWindows {
7
+ private readonly now;
8
+ private readonly maxKeys;
9
+ private readonly map;
10
+ constructor(now?: () => number, maxKeys?: number);
11
+ get size(): number;
12
+ /** Hits for `key` within the window (oldest first). */
13
+ recent(key: string, windowMs: number): number[];
14
+ add(key: string, windowMs: number): number[];
15
+ delete(key: string): void;
16
+ /**
17
+ * Drops keys whose window has passed, then the keys with the fewest hits (oldest first among equals),
18
+ * down to 90% of the cap. A flood of one-off keys therefore can't push out a key that is close to or
19
+ * at its limit, such as a username that is locked out.
20
+ */
21
+ private prune;
22
+ }
23
+ /**
24
+ * In-memory sliding-window limiter for per-instance execute/write caps (design §5.2). Separate from
25
+ * pre-approval rule limits, which are persisted in `pre_approval_hits`.
26
+ */
27
+ export declare class SlidingWindowLimiter {
28
+ private readonly hits;
29
+ constructor(now?: () => number, maxKeys?: number);
30
+ get size(): number;
31
+ /** Whether one more hit would fit, without recording it. */
32
+ allows(key: string, limit: number, windowMs: number): boolean;
33
+ /** Records a hit and returns true if it fits within `limit` per `windowMs`; otherwise records nothing. */
34
+ take(key: string, limit: number, windowMs: number): boolean;
35
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Sliding windows of hit timestamps per key, bounded in memory: keys whose window has passed are
3
+ * dropped, and past `maxKeys` the keys with the fewest hits go first. Callers keyed by anything a client
4
+ * chooses (usernames, IPs, principals) can't grow it without limit.
5
+ */
6
+ export class HitWindows {
7
+ now;
8
+ maxKeys;
9
+ map = new Map();
10
+ constructor(now = Date.now, maxKeys = 10_000) {
11
+ this.now = now;
12
+ this.maxKeys = maxKeys;
13
+ }
14
+ get size() {
15
+ return this.map.size;
16
+ }
17
+ /** Hits for `key` within the window (oldest first). */
18
+ recent(key, windowMs) {
19
+ const entry = this.map.get(key);
20
+ if (!entry)
21
+ return [];
22
+ const t = this.now();
23
+ const hits = entry.hits.filter((h) => h > t - windowMs);
24
+ this.map.delete(key);
25
+ if (hits.length)
26
+ this.map.set(key, { hits, windowMs }); // re-insert: most recently used last
27
+ return hits;
28
+ }
29
+ add(key, windowMs) {
30
+ const hits = [...this.recent(key, windowMs), this.now()];
31
+ this.map.set(key, { hits, windowMs });
32
+ if (this.map.size > this.maxKeys)
33
+ this.prune();
34
+ return hits;
35
+ }
36
+ delete(key) {
37
+ this.map.delete(key);
38
+ }
39
+ /**
40
+ * Drops keys whose window has passed, then the keys with the fewest hits (oldest first among equals),
41
+ * down to 90% of the cap. A flood of one-off keys therefore can't push out a key that is close to or
42
+ * at its limit, such as a username that is locked out.
43
+ */
44
+ prune() {
45
+ const t = this.now();
46
+ for (const [k, e] of this.map)
47
+ if (e.hits.at(-1) <= t - e.windowMs)
48
+ this.map.delete(k);
49
+ const target = Math.floor(this.maxKeys * 0.9);
50
+ if (this.map.size <= target)
51
+ return;
52
+ const byHits = [...this.map].map(([k, e], order) => ({ k, n: e.hits.length, order }));
53
+ byHits.sort((a, b) => a.n - b.n || a.order - b.order);
54
+ for (const { k } of byHits.slice(0, this.map.size - target))
55
+ this.map.delete(k);
56
+ }
57
+ }
58
+ /**
59
+ * In-memory sliding-window limiter for per-instance execute/write caps (design §5.2). Separate from
60
+ * pre-approval rule limits, which are persisted in `pre_approval_hits`.
61
+ */
62
+ export class SlidingWindowLimiter {
63
+ hits;
64
+ constructor(now = Date.now, maxKeys) {
65
+ this.hits = new HitWindows(now, maxKeys);
66
+ }
67
+ get size() {
68
+ return this.hits.size;
69
+ }
70
+ /** Whether one more hit would fit, without recording it. */
71
+ allows(key, limit, windowMs) {
72
+ return this.hits.recent(key, windowMs).length < limit;
73
+ }
74
+ /** Records a hit and returns true if it fits within `limit` per `windowMs`; otherwise records nothing. */
75
+ take(key, limit, windowMs) {
76
+ if (this.hits.recent(key, windowMs).length >= limit)
77
+ return false;
78
+ this.hits.add(key, windowMs);
79
+ return true;
80
+ }
81
+ }
82
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/gate/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,UAAU;IAIF;IACA;IAJF,GAAG,GAAG,IAAI,GAAG,EAAgD,CAAC;IAE/E,YACmB,MAAoB,IAAI,CAAC,GAAG,EAC5B,UAAU,MAAM;QADhB,QAAG,GAAH,GAAG,CAAyB;QAC5B,YAAO,GAAP,OAAO,CAAS;IAChC,CAAC;IAEJ,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,GAAW,EAAE,QAAgB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,qCAAqC;QAC7F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,QAAgB;QAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACK,KAAK;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM;YAAE,OAAO;QACpC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACd,IAAI,CAAa;IAElC,YAAY,MAAoB,IAAI,CAAC,GAAG,EAAE,OAAgB;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,4DAA4D;IAC5D,MAAM,CAAC,GAAW,EAAE,KAAa,EAAE,QAAgB;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;IACxD,CAAC;IAED,0GAA0G;IAC1G,IAAI,CAAC,GAAW,EAAE,KAAa,EAAE,QAAgB;QAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Redaction (design §5.5): replaces values under sensitive keys before anything reaches the model,
3
+ * the audit log, pending approvals or the portal. Keys match case-insensitively, ignoring `_`/`-`,
4
+ * so `apiKey`, `api_key` and `API-KEY` are one rule.
5
+ *
6
+ * A key matches a rule exactly, or by containing it (`db_password`, `X-Api-Key`, `ssh_private_key`);
7
+ * rules shorter than five characters (`pass`, `pwd`) only match as the key's last word (`smtp_pass`,
8
+ * `authPass`), so words like `bypass` or `passive` stay visible. Under a contained match, booleans and numbers stay visible
9
+ * (`password_set: true`, `max_tokens: 4096`); under an exact match every non-empty value is hidden.
10
+ */
11
+ export declare const REDACTED = "[REDACTED]";
12
+ export declare const GLOBAL_SENSITIVE_KEYS: string[];
13
+ export type Redactor = <T>(value: T) => T;
14
+ export declare function createRedactor(...keyLists: (readonly string[] | undefined)[]): Redactor;
15
+ /**
16
+ * The redactor for one instance: values under sensitive keys, plus the instance's actual secret values
17
+ * wherever they appear inside a string (log lines, previews, error messages, notification text), since
18
+ * text has no keys to go by.
19
+ */
20
+ export declare function createInstanceRedactor(opts: {
21
+ keyLists: (readonly string[] | undefined)[];
22
+ secretValues?: readonly string[];
23
+ }): Redactor;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Redaction (design §5.5): replaces values under sensitive keys before anything reaches the model,
3
+ * the audit log, pending approvals or the portal. Keys match case-insensitively, ignoring `_`/`-`,
4
+ * so `apiKey`, `api_key` and `API-KEY` are one rule.
5
+ *
6
+ * A key matches a rule exactly, or by containing it (`db_password`, `X-Api-Key`, `ssh_private_key`);
7
+ * rules shorter than five characters (`pass`, `pwd`) only match as the key's last word (`smtp_pass`,
8
+ * `authPass`), so words like `bypass` or `passive` stay visible. Under a contained match, booleans and numbers stay visible
9
+ * (`password_set: true`, `max_tokens: 4096`); under an exact match every non-empty value is hidden.
10
+ */
11
+ export const REDACTED = '[REDACTED]';
12
+ export const GLOBAL_SENSITIVE_KEYS = [
13
+ 'password',
14
+ 'passphrase',
15
+ 'secret',
16
+ 'token',
17
+ 'apiKey',
18
+ 'privateKey',
19
+ 'bindpw',
20
+ 'authPass',
21
+ 'accessToken',
22
+ 'refreshToken',
23
+ 'clientSecret',
24
+ 'authorization',
25
+ 'credential',
26
+ 'cookie',
27
+ 'passwd',
28
+ 'pass',
29
+ 'pwd',
30
+ ];
31
+ const normalize = (key) => key.toLowerCase().replace(/[_-]/g, '');
32
+ /** Secret values shorter than this are not scrubbed from text: too likely to match ordinary words. */
33
+ const MIN_SCRUB_LENGTH = 6;
34
+ export function createRedactor(...keyLists) {
35
+ return createInstanceRedactor({ keyLists });
36
+ }
37
+ /**
38
+ * The redactor for one instance: values under sensitive keys, plus the instance's actual secret values
39
+ * wherever they appear inside a string (log lines, previews, error messages, notification text), since
40
+ * text has no keys to go by.
41
+ */
42
+ export function createInstanceRedactor(opts) {
43
+ const keys = new Set(opts.keyLists.flatMap((l) => l ?? []).map(normalize));
44
+ const rules = [...keys].filter((k) => k !== '');
45
+ /** 'exact' hides any value; 'contains' hides strings, objects and arrays only. */
46
+ const sensitivity = (key) => {
47
+ const k = normalize(key);
48
+ if (keys.has(k))
49
+ return 'exact';
50
+ const last = key
51
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
52
+ .toLowerCase()
53
+ .split(/[\s_.-]+/)
54
+ .at(-1);
55
+ return rules.some((r) => (r.length >= 5 ? k.includes(r) : last === r)) ? 'contains' : null;
56
+ };
57
+ const hide = (key, v) => {
58
+ if (v === null || v === undefined || v === '')
59
+ return false;
60
+ const how = sensitivity(key);
61
+ return how === 'exact' || (how === 'contains' && typeof v !== 'boolean' && typeof v !== 'number');
62
+ };
63
+ const needles = [
64
+ ...new Set((opts.secretValues ?? [])
65
+ .filter((v) => typeof v === 'string' && v.length >= MIN_SCRUB_LENGTH)
66
+ .flatMap((v) => [v, encodeURIComponent(v), JSON.stringify(v).slice(1, -1)])),
67
+ ].sort((a, b) => b.length - a.length);
68
+ const scrub = (text) => (needles.length ? needles.reduce((t, n) => t.split(n).join(REDACTED), text) : text);
69
+ const walk = (value, seen) => {
70
+ if (typeof value === 'string')
71
+ return scrub(value);
72
+ if (value === null || typeof value !== 'object')
73
+ return value;
74
+ if (seen.has(value))
75
+ return '[Circular]';
76
+ seen.add(value);
77
+ if (Array.isArray(value))
78
+ return value.map((v) => walk(v, seen));
79
+ const out = {};
80
+ for (const [k, v] of Object.entries(value)) {
81
+ out[scrub(k)] = hide(k, v) ? REDACTED : walk(v, seen);
82
+ }
83
+ return out;
84
+ };
85
+ return (value) => walk(value, new WeakSet());
86
+ }
87
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/gate/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Hono, MiddlewareHandler } from 'hono';
2
+ import type { AppContext } from '../../app.js';
3
+ import type { SessionLimits } from '../../auth/sessions.js';
4
+ import type { UserRow } from '../../auth/users.js';
5
+ /**
6
+ * Admin portal authentication over HTTP (design §6.1): session cookie, double-submit CSRF token plus
7
+ * Origin check on every state-changing request, login with an optional TOTP step, OIDC sign-in.
8
+ */
9
+ export type AdminEnv = {
10
+ Variables: {
11
+ user: UserRow;
12
+ sessionRaw: string;
13
+ };
14
+ };
15
+ export declare const CSRF_COOKIE = "syn_csrf";
16
+ export declare const CSRF_HEADER = "x-csrf-token";
17
+ export declare function sessionLimits(ctx: AppContext): SessionLimits;
18
+ export declare function localLoginEnabled(ctx: AppContext): boolean;
19
+ /**
20
+ * While local login is off (setting, not the env override), single sign-on is the only way in: refuse
21
+ * any change that would leave it off or with no enabled user linked to it (design §6.1).
22
+ */
23
+ export declare function assertSsoRemains(ctx: AppContext, change: {
24
+ oidcOff?: boolean;
25
+ losingUser?: string;
26
+ }): void;
27
+ /** Local-password users must have TOTP when the admin requires it (OIDC-only users rely on the IdP). */
28
+ export declare function mustEnrollTotp(ctx: AppContext, user: UserRow): boolean;
29
+ /** CSRF: double-submit token + Origin check for every state-changing request under /api and /auth. */
30
+ export declare function csrfGuard(ctx: AppContext): MiddlewareHandler;
31
+ export declare function requireUser(ctx: AppContext): MiddlewareHandler<AdminEnv>;
32
+ export declare function registerAuthRoutes(app: Hono<AdminEnv>, ctx: AppContext): void;
33
+ export declare function registerProfileRoutes(app: Hono<AdminEnv>, ctx: AppContext): void;