@smthrs/kernel 0.0.0-stage → 1.0.0-rc.4

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 (267) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/LICENSE +21 -0
  3. package/README.md +154 -2
  4. package/dist/cjs/CapabilitySet.d.ts +6 -0
  5. package/dist/cjs/CapabilitySet.d.ts.map +1 -0
  6. package/dist/cjs/CapabilitySet.js +19 -0
  7. package/dist/cjs/CapabilitySet.js.map +7 -0
  8. package/dist/cjs/ChildProcessEnvironment.d.ts +60 -0
  9. package/dist/cjs/ChildProcessEnvironment.d.ts.map +1 -0
  10. package/dist/cjs/ChildProcessEnvironment.js +61 -0
  11. package/dist/cjs/ChildProcessEnvironment.js.map +7 -0
  12. package/dist/cjs/ChildProcessSpawner.d.ts +100 -0
  13. package/dist/cjs/ChildProcessSpawner.d.ts.map +1 -0
  14. package/dist/cjs/ChildProcessSpawner.js +291 -0
  15. package/dist/cjs/ChildProcessSpawner.js.map +7 -0
  16. package/dist/cjs/CommandLine.d.ts +173 -0
  17. package/dist/cjs/CommandLine.d.ts.map +1 -0
  18. package/dist/cjs/CommandLine.js +54 -0
  19. package/dist/cjs/CommandLine.js.map +7 -0
  20. package/dist/cjs/ContainedSpawner.d.ts +135 -0
  21. package/dist/cjs/ContainedSpawner.d.ts.map +1 -0
  22. package/dist/cjs/ContainedSpawner.js +141 -0
  23. package/dist/cjs/ContainedSpawner.js.map +7 -0
  24. package/dist/cjs/FileSystem.d.ts +452 -0
  25. package/dist/cjs/FileSystem.d.ts.map +1 -0
  26. package/dist/cjs/FileSystem.js +890 -0
  27. package/dist/cjs/FileSystem.js.map +7 -0
  28. package/dist/cjs/FileSystemBatch.d.ts +94 -0
  29. package/dist/cjs/FileSystemBatch.d.ts.map +1 -0
  30. package/dist/cjs/FileSystemBatch.js +31 -0
  31. package/dist/cjs/FileSystemBatch.js.map +7 -0
  32. package/dist/cjs/GrantEvent.d.ts +240 -0
  33. package/dist/cjs/GrantEvent.d.ts.map +1 -0
  34. package/dist/cjs/GrantEvent.js +115 -0
  35. package/dist/cjs/GrantEvent.js.map +7 -0
  36. package/dist/cjs/GrantStore.d.ts +270 -0
  37. package/dist/cjs/GrantStore.d.ts.map +1 -0
  38. package/dist/cjs/GrantStore.js +857 -0
  39. package/dist/cjs/GrantStore.js.map +7 -0
  40. package/dist/cjs/HostError.d.ts +36 -0
  41. package/dist/cjs/HostError.d.ts.map +1 -0
  42. package/dist/cjs/HostError.js +17 -0
  43. package/dist/cjs/HostError.js.map +7 -0
  44. package/dist/cjs/HostServices.d.ts +101 -0
  45. package/dist/cjs/HostServices.d.ts.map +1 -0
  46. package/dist/cjs/HostServices.js +66 -0
  47. package/dist/cjs/HostServices.js.map +7 -0
  48. package/dist/cjs/HttpClient.d.ts +177 -0
  49. package/dist/cjs/HttpClient.d.ts.map +1 -0
  50. package/dist/cjs/HttpClient.js +217 -0
  51. package/dist/cjs/HttpClient.js.map +7 -0
  52. package/dist/cjs/Jj.d.ts +67 -0
  53. package/dist/cjs/Jj.d.ts.map +1 -0
  54. package/dist/cjs/Jj.js +118 -0
  55. package/dist/cjs/Jj.js.map +7 -0
  56. package/dist/cjs/JournalGrantStore.d.ts +65 -0
  57. package/dist/cjs/JournalGrantStore.d.ts.map +1 -0
  58. package/dist/cjs/JournalGrantStore.js +354 -0
  59. package/dist/cjs/JournalGrantStore.js.map +7 -0
  60. package/dist/cjs/Path.d.ts +37 -0
  61. package/dist/cjs/Path.d.ts.map +1 -0
  62. package/dist/cjs/Path.js +46 -0
  63. package/dist/cjs/Path.js.map +7 -0
  64. package/dist/cjs/ProcessConfinement.d.ts +55 -0
  65. package/dist/cjs/ProcessConfinement.d.ts.map +1 -0
  66. package/dist/cjs/ProcessConfinement.js +94 -0
  67. package/dist/cjs/ProcessConfinement.js.map +7 -0
  68. package/dist/cjs/ProcessLedger.d.ts +260 -0
  69. package/dist/cjs/ProcessLedger.d.ts.map +1 -0
  70. package/dist/cjs/ProcessLedger.js +190 -0
  71. package/dist/cjs/ProcessLedger.js.map +7 -0
  72. package/dist/cjs/Rooted.d.ts +53 -0
  73. package/dist/cjs/Rooted.d.ts.map +1 -0
  74. package/dist/cjs/Rooted.js +101 -0
  75. package/dist/cjs/Rooted.js.map +7 -0
  76. package/dist/cjs/Unreachable.d.ts +27 -0
  77. package/dist/cjs/Unreachable.d.ts.map +1 -0
  78. package/dist/cjs/Unreachable.js +43 -0
  79. package/dist/cjs/Unreachable.js.map +7 -0
  80. package/dist/cjs/Workspace.d.ts +62 -0
  81. package/dist/cjs/Workspace.d.ts.map +1 -0
  82. package/dist/cjs/Workspace.js +35 -0
  83. package/dist/cjs/Workspace.js.map +7 -0
  84. package/dist/cjs/index.d.ts +161 -0
  85. package/dist/cjs/index.d.ts.map +1 -0
  86. package/dist/cjs/index.js +73 -0
  87. package/dist/cjs/index.js.map +7 -0
  88. package/dist/cjs/internal/Containment.d.ts +24 -0
  89. package/dist/cjs/internal/Containment.d.ts.map +1 -0
  90. package/dist/cjs/internal/Containment.js +30 -0
  91. package/dist/cjs/internal/Containment.js.map +7 -0
  92. package/dist/cjs/internal/Pipeline.d.ts +18 -0
  93. package/dist/cjs/internal/Pipeline.d.ts.map +1 -0
  94. package/dist/cjs/internal/Pipeline.js +90 -0
  95. package/dist/cjs/internal/Pipeline.js.map +7 -0
  96. package/dist/cjs/internal/makeCapability.d.ts +16 -0
  97. package/dist/cjs/internal/makeCapability.d.ts.map +1 -0
  98. package/dist/cjs/internal/makeCapability.js +44 -0
  99. package/dist/cjs/internal/makeCapability.js.map +7 -0
  100. package/dist/cjs/package.json +1 -0
  101. package/dist/cjs/test/FileSystemBatchContract.d.ts +15 -0
  102. package/dist/cjs/test/FileSystemBatchContract.d.ts.map +1 -0
  103. package/dist/cjs/test/FileSystemBatchContract.js +76 -0
  104. package/dist/cjs/test/FileSystemBatchContract.js.map +7 -0
  105. package/dist/cjs/test/HostContract.d.ts +225 -0
  106. package/dist/cjs/test/HostContract.d.ts.map +1 -0
  107. package/dist/cjs/test/HostContract.js +489 -0
  108. package/dist/cjs/test/HostContract.js.map +7 -0
  109. package/dist/cjs/test/TestGrantStore.d.ts +31 -0
  110. package/dist/cjs/test/TestGrantStore.d.ts.map +1 -0
  111. package/dist/cjs/test/TestGrantStore.js +65 -0
  112. package/dist/cjs/test/TestGrantStore.js.map +7 -0
  113. package/dist/esm/CapabilitySet.d.ts +6 -0
  114. package/dist/esm/CapabilitySet.d.ts.map +1 -0
  115. package/dist/esm/CapabilitySet.js +6 -0
  116. package/dist/esm/CapabilitySet.js.map +1 -0
  117. package/dist/esm/ChildProcessEnvironment.d.ts +60 -0
  118. package/dist/esm/ChildProcessEnvironment.d.ts.map +1 -0
  119. package/dist/esm/ChildProcessEnvironment.js +91 -0
  120. package/dist/esm/ChildProcessEnvironment.js.map +1 -0
  121. package/dist/esm/ChildProcessSpawner.d.ts +100 -0
  122. package/dist/esm/ChildProcessSpawner.d.ts.map +1 -0
  123. package/dist/esm/ChildProcessSpawner.js +342 -0
  124. package/dist/esm/ChildProcessSpawner.js.map +1 -0
  125. package/dist/esm/CommandLine.d.ts +173 -0
  126. package/dist/esm/CommandLine.d.ts.map +1 -0
  127. package/dist/esm/CommandLine.js +195 -0
  128. package/dist/esm/CommandLine.js.map +1 -0
  129. package/dist/esm/ContainedSpawner.d.ts +135 -0
  130. package/dist/esm/ContainedSpawner.d.ts.map +1 -0
  131. package/dist/esm/ContainedSpawner.js +180 -0
  132. package/dist/esm/ContainedSpawner.js.map +1 -0
  133. package/dist/esm/FileSystem.d.ts +452 -0
  134. package/dist/esm/FileSystem.d.ts.map +1 -0
  135. package/dist/esm/FileSystem.js +989 -0
  136. package/dist/esm/FileSystem.js.map +1 -0
  137. package/dist/esm/FileSystemBatch.d.ts +94 -0
  138. package/dist/esm/FileSystemBatch.d.ts.map +1 -0
  139. package/dist/esm/FileSystemBatch.js +26 -0
  140. package/dist/esm/FileSystemBatch.js.map +1 -0
  141. package/dist/esm/GrantEvent.d.ts +240 -0
  142. package/dist/esm/GrantEvent.d.ts.map +1 -0
  143. package/dist/esm/GrantEvent.js +155 -0
  144. package/dist/esm/GrantEvent.js.map +1 -0
  145. package/dist/esm/GrantStore.d.ts +270 -0
  146. package/dist/esm/GrantStore.d.ts.map +1 -0
  147. package/dist/esm/GrantStore.js +951 -0
  148. package/dist/esm/GrantStore.js.map +1 -0
  149. package/dist/esm/HostError.d.ts +36 -0
  150. package/dist/esm/HostError.d.ts.map +1 -0
  151. package/dist/esm/HostError.js +20 -0
  152. package/dist/esm/HostError.js.map +1 -0
  153. package/dist/esm/HostServices.d.ts +101 -0
  154. package/dist/esm/HostServices.d.ts.map +1 -0
  155. package/dist/esm/HostServices.js +76 -0
  156. package/dist/esm/HostServices.js.map +1 -0
  157. package/dist/esm/HttpClient.d.ts +177 -0
  158. package/dist/esm/HttpClient.d.ts.map +1 -0
  159. package/dist/esm/HttpClient.js +299 -0
  160. package/dist/esm/HttpClient.js.map +1 -0
  161. package/dist/esm/Jj.d.ts +67 -0
  162. package/dist/esm/Jj.d.ts.map +1 -0
  163. package/dist/esm/Jj.js +111 -0
  164. package/dist/esm/Jj.js.map +1 -0
  165. package/dist/esm/JournalGrantStore.d.ts +65 -0
  166. package/dist/esm/JournalGrantStore.d.ts.map +1 -0
  167. package/dist/esm/JournalGrantStore.js +350 -0
  168. package/dist/esm/JournalGrantStore.js.map +1 -0
  169. package/dist/esm/Path.d.ts +37 -0
  170. package/dist/esm/Path.d.ts.map +1 -0
  171. package/dist/esm/Path.js +34 -0
  172. package/dist/esm/Path.js.map +1 -0
  173. package/dist/esm/ProcessConfinement.d.ts +55 -0
  174. package/dist/esm/ProcessConfinement.d.ts.map +1 -0
  175. package/dist/esm/ProcessConfinement.js +106 -0
  176. package/dist/esm/ProcessConfinement.js.map +1 -0
  177. package/dist/esm/ProcessLedger.d.ts +260 -0
  178. package/dist/esm/ProcessLedger.d.ts.map +1 -0
  179. package/dist/esm/ProcessLedger.js +283 -0
  180. package/dist/esm/ProcessLedger.js.map +1 -0
  181. package/dist/esm/Rooted.d.ts +53 -0
  182. package/dist/esm/Rooted.d.ts.map +1 -0
  183. package/dist/esm/Rooted.js +104 -0
  184. package/dist/esm/Rooted.js.map +1 -0
  185. package/dist/esm/Unreachable.d.ts +27 -0
  186. package/dist/esm/Unreachable.d.ts.map +1 -0
  187. package/dist/esm/Unreachable.js +26 -0
  188. package/dist/esm/Unreachable.js.map +1 -0
  189. package/dist/esm/Workspace.d.ts +62 -0
  190. package/dist/esm/Workspace.d.ts.map +1 -0
  191. package/dist/esm/Workspace.js +51 -0
  192. package/dist/esm/Workspace.js.map +1 -0
  193. package/dist/esm/index.d.ts +161 -0
  194. package/dist/esm/index.d.ts.map +1 -0
  195. package/dist/esm/index.js +151 -0
  196. package/dist/esm/index.js.map +1 -0
  197. package/dist/esm/internal/Containment.d.ts +24 -0
  198. package/dist/esm/internal/Containment.d.ts.map +1 -0
  199. package/dist/esm/internal/Containment.js +27 -0
  200. package/dist/esm/internal/Containment.js.map +1 -0
  201. package/dist/esm/internal/Pipeline.d.ts +18 -0
  202. package/dist/esm/internal/Pipeline.d.ts.map +1 -0
  203. package/dist/esm/internal/Pipeline.js +68 -0
  204. package/dist/esm/internal/Pipeline.js.map +1 -0
  205. package/dist/esm/internal/makeCapability.d.ts +16 -0
  206. package/dist/esm/internal/makeCapability.d.ts.map +1 -0
  207. package/dist/esm/internal/makeCapability.js +22 -0
  208. package/dist/esm/internal/makeCapability.js.map +1 -0
  209. package/dist/esm/test/FileSystemBatchContract.d.ts +15 -0
  210. package/dist/esm/test/FileSystemBatchContract.d.ts.map +1 -0
  211. package/dist/esm/test/FileSystemBatchContract.js +57 -0
  212. package/dist/esm/test/FileSystemBatchContract.js.map +1 -0
  213. package/dist/esm/test/HostContract.d.ts +225 -0
  214. package/dist/esm/test/HostContract.d.ts.map +1 -0
  215. package/dist/esm/test/HostContract.js +460 -0
  216. package/dist/esm/test/HostContract.js.map +1 -0
  217. package/dist/esm/test/TestGrantStore.d.ts +31 -0
  218. package/dist/esm/test/TestGrantStore.d.ts.map +1 -0
  219. package/dist/esm/test/TestGrantStore.js +57 -0
  220. package/dist/esm/test/TestGrantStore.js.map +1 -0
  221. package/docs/README.md +162 -0
  222. package/docs/api.md +1532 -0
  223. package/docs/concepts/decoration-in-place.md +117 -0
  224. package/docs/concepts/filesystem-batches.md +58 -0
  225. package/docs/concepts/filesystem-confinement.md +168 -0
  226. package/docs/concepts/grant-decisions.md +181 -0
  227. package/docs/concepts/process-containment.md +155 -0
  228. package/docs/contract.md +14 -0
  229. package/docs/guides/adapt-a-new-host-platform.md +148 -0
  230. package/docs/guides/answer-permission-requests.md +151 -0
  231. package/docs/guides/authorize-network-and-model-calls.md +118 -0
  232. package/docs/guides/contain-spawned-processes.md +118 -0
  233. package/docs/guides/guard-a-host-bundle.md +109 -0
  234. package/docs/guides/persist-grants-across-restarts.md +135 -0
  235. package/docs/guides/write-a-capability-policy.md +159 -0
  236. package/docs/installation.md +115 -0
  237. package/docs/quickstart.md +182 -0
  238. package/docs/testing.md +108 -0
  239. package/docs/troubleshooting.md +281 -0
  240. package/package.json +344 -3
  241. package/src/CapabilitySet.ts +6 -0
  242. package/src/ChildProcessEnvironment.ts +98 -0
  243. package/src/ChildProcessSpawner.ts +414 -0
  244. package/src/CommandLine.ts +250 -0
  245. package/src/ContainedSpawner.ts +284 -0
  246. package/src/FileSystem.ts +1655 -0
  247. package/src/FileSystemBatch.ts +90 -0
  248. package/src/GrantEvent.ts +174 -0
  249. package/src/GrantStore.ts +1345 -0
  250. package/src/HostError.ts +37 -0
  251. package/src/HostServices.ts +133 -0
  252. package/src/HttpClient.ts +406 -0
  253. package/src/Jj.ts +159 -0
  254. package/src/JournalGrantStore.ts +461 -0
  255. package/src/Path.ts +47 -0
  256. package/src/ProcessConfinement.ts +156 -0
  257. package/src/ProcessLedger.ts +423 -0
  258. package/src/Rooted.ts +128 -0
  259. package/src/Unreachable.ts +30 -0
  260. package/src/Workspace.ts +65 -0
  261. package/src/index.ts +181 -0
  262. package/src/internal/Containment.ts +37 -0
  263. package/src/internal/Pipeline.ts +85 -0
  264. package/src/internal/makeCapability.ts +26 -0
  265. package/src/test/FileSystemBatchContract.ts +59 -0
  266. package/src/test/HostContract.ts +785 -0
  267. package/src/test/TestGrantStore.ts +73 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Optional, bounded read batches on the existing filesystem host slot.
3
+ *
4
+ * @since 1.0.0
5
+ */
6
+
7
+ import type { Effect, FileSystem, PlatformError, Result } from "effect"
8
+
9
+ /** Maximum operations admitted by one batch.
10
+ * @since 1.0.0
11
+ * @category constants
12
+ */
13
+ export const maxBatchSize = 128
14
+
15
+ /** Bounded concurrency for hosts without batching.
16
+ * @since 1.0.0
17
+ * @category constants
18
+ */
19
+ export const fallbackConcurrency = 4
20
+
21
+ /** Read operations supported by a confined batch.
22
+ * @since 1.0.0
23
+ * @category models
24
+ */
25
+ export type BatchRequest =
26
+ | { readonly operation: "stat"; readonly path: string }
27
+ | { readonly operation: "readDirectory"; readonly path: string; readonly options?: { readonly recursive?: boolean } }
28
+ | { readonly operation: "digest"; readonly path: string; readonly content?: boolean }
29
+ | {
30
+ readonly operation: "glob"
31
+ readonly path: string
32
+ readonly root: string
33
+ readonly options?: { readonly exclude?: ReadonlyArray<string> }
34
+ }
35
+
36
+ /** A successful per-path observation. SHA-256 hashes raw bytes.
37
+ * @since 1.0.0
38
+ * @category models
39
+ */
40
+ export type BatchValue =
41
+ | { readonly operation: "stat"; readonly info: FileSystem.File.Info }
42
+ | { readonly operation: "readDirectory" | "glob"; readonly paths: ReadonlyArray<string> }
43
+ | {
44
+ readonly operation: "digest"
45
+ readonly digest: string
46
+ readonly sizeBytes: number
47
+ readonly bytes?: Uint8Array
48
+ }
49
+
50
+ /** A result names its original request index, including failures.
51
+ * @since 1.0.0
52
+ * @category models
53
+ */
54
+ export interface BatchEntry {
55
+ readonly index: number
56
+ readonly path: string
57
+ readonly result: Result.Result<BatchValue, PlatformError.PlatformError>
58
+ }
59
+
60
+ /** Results sorted by path, then request index, bound to one root inode.
61
+ * @since 1.0.0
62
+ * @category models
63
+ */
64
+ export interface BatchResponse {
65
+ readonly rootIdentity: string
66
+ readonly entries: ReadonlyArray<BatchEntry>
67
+ }
68
+
69
+ /** The guarded extension, never a second service tag.
70
+ * @since 1.0.0
71
+ * @category models
72
+ */
73
+ export interface FileSystemBatch {
74
+ readonly maxSize: number
75
+ readonly maxResponseBytes: number
76
+ readonly execute: (requests: ReadonlyArray<BatchRequest>) => Effect.Effect<BatchResponse, PlatformError.PlatformError>
77
+ }
78
+
79
+ /** Host extension identity on the guarded filesystem.
80
+ * @since 1.0.0
81
+ * @category constants
82
+ */
83
+ export const FileSystemBatchTypeId = Symbol.for("@smthrs/kernel/FileSystemBatch")
84
+
85
+ /** Discover the guarded batch extension when the host supports it.
86
+ * @since 1.0.0
87
+ * @category accessors
88
+ */
89
+ export const batch = (fs: FileSystem.FileSystem): FileSystemBatch | undefined =>
90
+ (fs as FileSystem.FileSystem & { readonly [FileSystemBatchTypeId]?: FileSystemBatch })[FileSystemBatchTypeId]
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Durable grant decision events.
3
+ *
4
+ * Governing design:
5
+ * `docs/specs/Concepts/Permission Kernel.md` and
6
+ * `docs/specs/Concepts/Journal Queue.md`.
7
+ *
8
+ * @since 1.0.0-rc.0
9
+ */
10
+
11
+ import { Capability, CapabilityPattern } from "@smthrs/capability/Capability"
12
+ import * as Schema from "effect/Schema"
13
+
14
+ /**
15
+ * The tier at which a capability decision was made.
16
+ *
17
+ * @category schemas
18
+ * @since 1.0.0-rc.0
19
+ */
20
+ export const GrantTier = Schema.Literals(["sealed", "compensable", "irreversible"])
21
+
22
+ /**
23
+ * The scope selected for a permission grant.
24
+ *
25
+ * @category schemas
26
+ * @since 1.0.0-rc.0
27
+ */
28
+ export const GrantScope = Schema.Literals(["once", "run", "remembered"])
29
+
30
+ /**
31
+ * A one-call grant.
32
+ *
33
+ * It is durable audit evidence but is deliberately never replayed as active
34
+ * authority.
35
+ *
36
+ * @category models
37
+ * @since 1.0.0-rc.0
38
+ */
39
+ export class OnceGrant extends Schema.TaggedClass<OnceGrant>()("@smthrs/kernel/GrantEvent/OnceGrant", {
40
+ eventType: Schema.Literal("flows.kernel.grant.once.v1"),
41
+ requestId: Schema.String,
42
+ runId: Schema.String,
43
+ planDigest: Schema.optional(Schema.String),
44
+ capability: Capability,
45
+ pattern: CapabilityPattern,
46
+ scope: Schema.Literal("once"),
47
+ tier: GrantTier
48
+ }) {}
49
+
50
+ /**
51
+ * A grant remembered across runs.
52
+ *
53
+ * @category models
54
+ * @since 1.0.0-rc.0
55
+ */
56
+ export class RememberedGrant extends Schema.TaggedClass<RememberedGrant>()(
57
+ "@smthrs/kernel/GrantEvent/RememberedGrant",
58
+ {
59
+ eventType: Schema.Literal("flows.kernel.grant.remembered.v1"),
60
+ requestId: Schema.String,
61
+ runId: Schema.String,
62
+ planDigest: Schema.optional(Schema.String),
63
+ capability: Capability,
64
+ pattern: CapabilityPattern,
65
+ scope: Schema.Literal("remembered"),
66
+ tier: GrantTier
67
+ }
68
+ ) {}
69
+
70
+ /**
71
+ * A grant scoped to the current run.
72
+ *
73
+ * Version 2 captures the requesting fiber's normalized conjunction of any-of
74
+ * capability-pattern groups. Replay intersects it with the constructor ceiling.
75
+ * Version 1 omitted this boundary and cannot safely activate authority.
76
+ *
77
+ * @category models
78
+ * @since 1.0.0-rc.0
79
+ */
80
+ export class RunGrant extends Schema.TaggedClass<RunGrant>()("@smthrs/kernel/GrantEvent/RunGrant", {
81
+ eventType: Schema.Literal("flows.kernel.grant.run.v2"),
82
+ requestId: Schema.String,
83
+ runId: Schema.String,
84
+ planDigest: Schema.String,
85
+ capability: Capability,
86
+ pattern: CapabilityPattern,
87
+ ceiling: Schema.Array(Schema.Array(CapabilityPattern)),
88
+ scope: Schema.Literal("run"),
89
+ tier: GrantTier
90
+ }) {}
91
+
92
+ /**
93
+ * A denied permission request.
94
+ *
95
+ * @category models
96
+ * @since 1.0.0-rc.0
97
+ */
98
+ export class DeniedGrant extends Schema.TaggedClass<DeniedGrant>()("@smthrs/kernel/GrantEvent/DeniedGrant", {
99
+ eventType: Schema.Literal("flows.kernel.grant.denied.v1"),
100
+ requestId: Schema.String,
101
+ runId: Schema.String,
102
+ planDigest: Schema.optional(Schema.String),
103
+ capability: Capability,
104
+ pattern: CapabilityPattern,
105
+ scope: Schema.Literal("once"),
106
+ tier: GrantTier
107
+ }) {}
108
+
109
+ /**
110
+ * A capability envelope grant.
111
+ *
112
+ * Envelope grants are not attached to an individual request. `planDigest`
113
+ * binds the decision to exactly the plan shown to the approver. A `run`
114
+ * envelope is replayed only for that run and digest; a `remembered` envelope
115
+ * becomes remembered predicate grants for future plans while retaining its
116
+ * origin digest as audit evidence.
117
+ *
118
+ * @category models
119
+ * @since 1.0.0-rc.0
120
+ */
121
+ export class EnvelopeGrant extends Schema.TaggedClass<EnvelopeGrant>()(
122
+ "@smthrs/kernel/GrantEvent/EnvelopeGrant",
123
+ {
124
+ eventType: Schema.Literal("flows.kernel.grant.envelope.v1"),
125
+ runId: Schema.String,
126
+ planDigest: Schema.String,
127
+ patterns: Schema.Array(CapabilityPattern),
128
+ scope: Schema.Literals(["run", "remembered"])
129
+ }
130
+ ) {}
131
+
132
+ /**
133
+ * All durable grant events understood by the kernel.
134
+ *
135
+ * @category models
136
+ * @since 1.0.0-rc.0
137
+ */
138
+ export const GrantEventSchema = Schema.Union([
139
+ OnceGrant,
140
+ RememberedGrant,
141
+ DeniedGrant,
142
+ EnvelopeGrant,
143
+ RunGrant
144
+ ])
145
+
146
+ /**
147
+ * All durable grant events understood by the kernel.
148
+ *
149
+ * @category models
150
+ * @since 1.0.0-rc.0
151
+ */
152
+ export type GrantEvent = typeof GrantEventSchema.Type
153
+
154
+ /**
155
+ * Decodes one JSON-compatible journal payload into a grant event.
156
+ *
157
+ * Excess payload keys are rejected rather than stripped. Grant payloads are
158
+ * replayed as active permission authority, so a payload that mixes fields
159
+ * from two grant variants — for example an envelope carrying request-only
160
+ * fields — is treated as corrupt instead of silently narrowed to whichever
161
+ * variant its declared keys happen to satisfy.
162
+ *
163
+ * @category decoding
164
+ * @since 1.0.0-rc.0
165
+ */
166
+ export const decode = Schema.decodeUnknownResult(GrantEventSchema, { onExcessProperty: "error" })
167
+
168
+ /**
169
+ * Encodes a grant event into its JSON-compatible journal payload.
170
+ *
171
+ * @category encoding
172
+ * @since 1.0.0-rc.0
173
+ */
174
+ export const encode = Schema.encodeUnknownResult(GrantEventSchema)