@pithy-sh/core 0.13.0 → 0.15.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 (354) hide show
  1. package/README.md +54 -0
  2. package/dist/audit/auditEvent.js +1 -1
  3. package/dist/audit/chain.d.ts +289 -0
  4. package/dist/audit/chain.d.ts.map +1 -0
  5. package/dist/audit/chain.js +400 -0
  6. package/dist/audit/citations.d.ts +52 -0
  7. package/dist/audit/citations.d.ts.map +1 -0
  8. package/dist/audit/citations.js +13 -0
  9. package/dist/capability/bindings.d.ts +22 -0
  10. package/dist/capability/bindings.d.ts.map +1 -1
  11. package/dist/capability/bindings.js +32 -2
  12. package/dist/capability/capability.d.ts +123 -16
  13. package/dist/capability/capability.d.ts.map +1 -1
  14. package/dist/capability/capability.js +17 -2
  15. package/dist/capability/erasure.d.ts +75 -0
  16. package/dist/capability/erasure.d.ts.map +1 -0
  17. package/dist/capability/erasure.js +2 -0
  18. package/dist/capability/manifest.d.ts +5 -0
  19. package/dist/capability/manifest.d.ts.map +1 -1
  20. package/dist/capability/personColumns.d.ts +28 -0
  21. package/dist/capability/personColumns.d.ts.map +1 -0
  22. package/dist/capability/personColumns.js +66 -0
  23. package/dist/capability/personRows.d.ts +62 -0
  24. package/dist/capability/personRows.d.ts.map +1 -0
  25. package/dist/capability/personRows.js +59 -0
  26. package/dist/capability/purge.d.ts +86 -19
  27. package/dist/capability/purge.d.ts.map +1 -1
  28. package/dist/capability/purge.js +83 -5
  29. package/dist/capability/settings.d.ts +10 -0
  30. package/dist/capability/settings.d.ts.map +1 -1
  31. package/dist/capability/vectorIndex.d.ts +36 -0
  32. package/dist/capability/vectorIndex.d.ts.map +1 -0
  33. package/dist/capability/vectorIndex.js +25 -0
  34. package/dist/cli/commandCatalog.generated.d.ts +438 -3
  35. package/dist/cli/commandCatalog.generated.d.ts.map +1 -1
  36. package/dist/cli/commandCatalog.generated.js +454 -2
  37. package/dist/cli/commandFacts.d.ts +8 -5
  38. package/dist/cli/commandFacts.d.ts.map +1 -1
  39. package/dist/cli/commandFacts.js +12 -3
  40. package/dist/consent/purpose.d.ts +70 -0
  41. package/dist/consent/purpose.d.ts.map +1 -0
  42. package/dist/consent/purpose.js +97 -0
  43. package/dist/consent/reader.d.ts +99 -0
  44. package/dist/consent/reader.d.ts.map +1 -0
  45. package/dist/consent/reader.js +33 -0
  46. package/dist/controlPlane/audit/actions.d.ts +15 -4
  47. package/dist/controlPlane/audit/actions.d.ts.map +1 -1
  48. package/dist/controlPlane/audit/actions.js +16 -5
  49. package/dist/controlPlane/capability.d.ts +10 -0
  50. package/dist/controlPlane/capability.d.ts.map +1 -1
  51. package/dist/controlPlane/capability.js +56 -8
  52. package/dist/controlPlane/context.d.ts +4 -0
  53. package/dist/controlPlane/context.d.ts.map +1 -1
  54. package/dist/controlPlane/context.js +3 -2
  55. package/dist/controlPlane/data/connection.d.ts +21 -2
  56. package/dist/controlPlane/data/connection.d.ts.map +1 -1
  57. package/dist/controlPlane/data/connection.js +13 -4
  58. package/dist/controlPlane/data/connections.d.ts +94 -0
  59. package/dist/controlPlane/data/connections.d.ts.map +1 -0
  60. package/dist/controlPlane/data/connections.js +151 -0
  61. package/dist/controlPlane/data/hold.d.ts +46 -0
  62. package/dist/controlPlane/data/hold.d.ts.map +1 -0
  63. package/dist/controlPlane/data/hold.js +36 -0
  64. package/dist/controlPlane/data/oidcTrust.d.ts +122 -0
  65. package/dist/controlPlane/data/oidcTrust.d.ts.map +1 -0
  66. package/dist/controlPlane/data/oidcTrust.js +173 -0
  67. package/dist/controlPlane/data/tables.d.ts +4 -0
  68. package/dist/controlPlane/data/tables.d.ts.map +1 -1
  69. package/dist/controlPlane/data/tables.js +9 -4
  70. package/dist/controlPlane/data/trustFirstCall.d.ts +16 -0
  71. package/dist/controlPlane/data/trustFirstCall.d.ts.map +1 -0
  72. package/dist/controlPlane/data/trustFirstCall.js +25 -0
  73. package/dist/controlPlane/discovery/adminRoute.d.ts +165 -2
  74. package/dist/controlPlane/discovery/adminRoute.d.ts.map +1 -1
  75. package/dist/controlPlane/discovery/adminRoute.js +32 -8
  76. package/dist/controlPlane/discovery/routeInput.d.ts +23 -0
  77. package/dist/controlPlane/discovery/routeInput.d.ts.map +1 -0
  78. package/dist/controlPlane/discovery/routeInput.js +80 -0
  79. package/dist/controlPlane/discovery/toolName.d.ts +21 -0
  80. package/dist/controlPlane/discovery/toolName.d.ts.map +1 -0
  81. package/dist/controlPlane/discovery/toolName.js +25 -0
  82. package/dist/controlPlane/erasure/attest.d.ts +78 -0
  83. package/dist/controlPlane/erasure/attest.d.ts.map +1 -0
  84. package/dist/controlPlane/erasure/attest.js +164 -0
  85. package/dist/controlPlane/erasure/read.d.ts +39 -0
  86. package/dist/controlPlane/erasure/read.d.ts.map +1 -0
  87. package/dist/controlPlane/erasure/read.js +140 -0
  88. package/dist/controlPlane/error/errors.d.ts +61 -2
  89. package/dist/controlPlane/error/errors.d.ts.map +1 -1
  90. package/dist/controlPlane/error/errors.js +13 -0
  91. package/dist/controlPlane/evidence/derive.d.ts +124 -0
  92. package/dist/controlPlane/evidence/derive.d.ts.map +1 -0
  93. package/dist/controlPlane/evidence/derive.js +343 -0
  94. package/dist/controlPlane/evidence/mapping.d.ts +85 -0
  95. package/dist/controlPlane/evidence/mapping.d.ts.map +1 -0
  96. package/dist/controlPlane/evidence/mapping.js +114 -0
  97. package/dist/controlPlane/evidence/pack.d.ts +46 -0
  98. package/dist/controlPlane/evidence/pack.d.ts.map +1 -0
  99. package/dist/controlPlane/evidence/pack.js +124 -0
  100. package/dist/controlPlane/http/connections.d.ts +96 -0
  101. package/dist/controlPlane/http/connections.d.ts.map +1 -0
  102. package/dist/controlPlane/http/connections.js +109 -0
  103. package/dist/controlPlane/http/guard.d.ts +23 -2
  104. package/dist/controlPlane/http/guard.d.ts.map +1 -1
  105. package/dist/controlPlane/http/guard.js +69 -12
  106. package/dist/controlPlane/http/handlers.d.ts +212 -10
  107. package/dist/controlPlane/http/handlers.d.ts.map +1 -1
  108. package/dist/controlPlane/http/handlers.js +117 -26
  109. package/dist/controlPlane/http/holds.d.ts +57 -0
  110. package/dist/controlPlane/http/holds.d.ts.map +1 -0
  111. package/dist/controlPlane/http/holds.js +98 -0
  112. package/dist/controlPlane/http/presence.d.ts +27 -0
  113. package/dist/controlPlane/http/presence.d.ts.map +1 -0
  114. package/dist/controlPlane/http/presence.js +67 -0
  115. package/dist/controlPlane/http/processing.d.ts +73 -0
  116. package/dist/controlPlane/http/processing.d.ts.map +1 -0
  117. package/dist/controlPlane/http/processing.js +17 -0
  118. package/dist/controlPlane/http/responses.d.ts +927 -3
  119. package/dist/controlPlane/http/responses.d.ts.map +1 -1
  120. package/dist/controlPlane/http/responses.js +283 -7
  121. package/dist/controlPlane/http/routes.d.ts +12 -2
  122. package/dist/controlPlane/http/routes.d.ts.map +1 -1
  123. package/dist/controlPlane/http/routes.js +182 -5
  124. package/dist/controlPlane/http/schemas.d.ts +63 -0
  125. package/dist/controlPlane/http/schemas.d.ts.map +1 -1
  126. package/dist/controlPlane/http/schemas.js +39 -1
  127. package/dist/controlPlane/http/verify.d.ts.map +1 -1
  128. package/dist/controlPlane/http/verify.js +13 -1
  129. package/dist/controlPlane/http/verifyTrust.d.ts +76 -0
  130. package/dist/controlPlane/http/verifyTrust.d.ts.map +1 -0
  131. package/dist/controlPlane/http/verifyTrust.js +75 -0
  132. package/dist/controlPlane/migrations/0004_connection_trusts.d.ts +15 -0
  133. package/dist/controlPlane/migrations/0004_connection_trusts.d.ts.map +1 -0
  134. package/dist/controlPlane/migrations/0004_connection_trusts.js +23 -0
  135. package/dist/controlPlane/migrations/0005_holds.d.ts +12 -0
  136. package/dist/controlPlane/migrations/0005_holds.d.ts.map +1 -0
  137. package/dist/controlPlane/migrations/0005_holds.js +26 -0
  138. package/dist/controlPlane/processing/derive.d.ts +77 -0
  139. package/dist/controlPlane/processing/derive.d.ts.map +1 -0
  140. package/dist/controlPlane/processing/derive.js +206 -0
  141. package/dist/controlPlane/processing/read.d.ts +10 -0
  142. package/dist/controlPlane/processing/read.d.ts.map +1 -0
  143. package/dist/controlPlane/processing/read.js +89 -0
  144. package/dist/controlPlane/scope/kind.d.ts +46 -0
  145. package/dist/controlPlane/scope/kind.d.ts.map +1 -0
  146. package/dist/controlPlane/scope/kind.js +52 -0
  147. package/dist/controlPlane/scope/scope.d.ts +58 -3
  148. package/dist/controlPlane/scope/scope.d.ts.map +1 -1
  149. package/dist/controlPlane/scope/scope.js +59 -4
  150. package/dist/controlPlane/token/jws.js +1 -1
  151. package/dist/controlPlane/token/mint.js +1 -1
  152. package/dist/controlPlane/wire.d.ts +23 -0
  153. package/dist/controlPlane/wire.d.ts.map +1 -1
  154. package/dist/controlPlane/wire.js +24 -1
  155. package/dist/createBackend.d.ts +13 -0
  156. package/dist/createBackend.d.ts.map +1 -1
  157. package/dist/createBackend.js +11 -3
  158. package/dist/createEntrypoint.d.ts +7 -0
  159. package/dist/createEntrypoint.d.ts.map +1 -1
  160. package/dist/createEntrypoint.js +4 -0
  161. package/dist/error/http.d.ts +168 -0
  162. package/dist/error/http.d.ts.map +1 -1
  163. package/dist/error/payload.d.ts +336 -0
  164. package/dist/error/payload.d.ts.map +1 -1
  165. package/dist/error/payload.js +112 -0
  166. package/dist/error/pithyError.d.ts +22 -0
  167. package/dist/error/pithyError.d.ts.map +1 -1
  168. package/dist/error/pithyError.js +31 -1
  169. package/dist/http/routeSpec.d.ts +46 -1
  170. package/dist/http/routeSpec.d.ts.map +1 -1
  171. package/dist/http/routeSpec.js +39 -5
  172. package/dist/http/verification.d.ts.map +1 -1
  173. package/dist/http/verification.js +1 -1
  174. package/dist/i18n/translator.d.ts +2 -1
  175. package/dist/i18n/translator.d.ts.map +1 -1
  176. package/dist/index.d.ts +1 -1
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +3 -3
  179. package/dist/logger/record.d.ts +98 -0
  180. package/dist/logger/record.d.ts.map +1 -1
  181. package/dist/mcp/annotations.d.ts +20 -0
  182. package/dist/mcp/annotations.d.ts.map +1 -0
  183. package/dist/mcp/annotations.js +23 -0
  184. package/dist/mcp/tools.d.ts +75 -0
  185. package/dist/mcp/tools.d.ts.map +1 -0
  186. package/dist/mcp/tools.js +118 -0
  187. package/dist/openapi/document.d.ts.map +1 -1
  188. package/dist/openapi/document.js +8 -26
  189. package/dist/openapi/operations.d.ts +35 -0
  190. package/dist/openapi/operations.d.ts.map +1 -0
  191. package/dist/openapi/operations.js +37 -0
  192. package/dist/presence/channel.d.ts +11 -0
  193. package/dist/presence/channel.d.ts.map +1 -0
  194. package/dist/presence/channel.js +65 -0
  195. package/dist/presence/declaration.d.ts +154 -0
  196. package/dist/presence/declaration.d.ts.map +1 -0
  197. package/dist/presence/declaration.js +164 -0
  198. package/dist/presence/durableObject.d.ts +61 -0
  199. package/dist/presence/durableObject.d.ts.map +1 -0
  200. package/dist/presence/durableObject.js +257 -0
  201. package/dist/presence/frames.d.ts +166 -0
  202. package/dist/presence/frames.d.ts.map +1 -0
  203. package/dist/presence/frames.js +90 -0
  204. package/dist/presence/http/guard.d.ts +11 -0
  205. package/dist/presence/http/guard.d.ts.map +1 -0
  206. package/dist/presence/http/guard.js +20 -0
  207. package/dist/presence/http/responses.d.ts +31 -0
  208. package/dist/presence/http/responses.d.ts.map +1 -0
  209. package/dist/presence/http/responses.js +34 -0
  210. package/dist/presence/http/routes.d.ts +24 -0
  211. package/dist/presence/http/routes.d.ts.map +1 -0
  212. package/dist/presence/http/routes.js +127 -0
  213. package/dist/presence/http/schemas.d.ts +29 -0
  214. package/dist/presence/http/schemas.d.ts.map +1 -0
  215. package/dist/presence/http/schemas.js +28 -0
  216. package/dist/presence/names.d.ts +23 -0
  217. package/dist/presence/names.d.ts.map +1 -0
  218. package/dist/presence/names.js +22 -0
  219. package/dist/presence/room.d.ts +95 -0
  220. package/dist/presence/room.d.ts.map +1 -0
  221. package/dist/presence/room.js +105 -0
  222. package/dist/presence/ticket.d.ts +55 -0
  223. package/dist/presence/ticket.d.ts.map +1 -0
  224. package/dist/presence/ticket.js +109 -0
  225. package/dist/privacy/classify.js +1 -1
  226. package/dist/privacy/encrypted.js +1 -1
  227. package/dist/processing/activity.d.ts +134 -0
  228. package/dist/processing/activity.d.ts.map +1 -0
  229. package/dist/processing/activity.js +161 -0
  230. package/dist/processing/composed.d.ts +18 -0
  231. package/dist/processing/composed.d.ts.map +1 -0
  232. package/dist/processing/composed.js +28 -0
  233. package/dist/processing/vocabulary.d.ts +26 -0
  234. package/dist/processing/vocabulary.d.ts.map +1 -0
  235. package/dist/processing/vocabulary.js +35 -0
  236. package/dist/queue/consumer.d.ts +59 -0
  237. package/dist/queue/consumer.d.ts.map +1 -0
  238. package/dist/queue/consumer.js +46 -0
  239. package/dist/retention/composed.d.ts +37 -0
  240. package/dist/retention/composed.d.ts.map +1 -0
  241. package/dist/retention/composed.js +66 -0
  242. package/dist/retention/holds.d.ts +61 -0
  243. package/dist/retention/holds.d.ts.map +1 -0
  244. package/dist/retention/holds.js +107 -0
  245. package/dist/retention/holdsPurge.d.ts +22 -0
  246. package/dist/retention/holdsPurge.d.ts.map +1 -0
  247. package/dist/retention/holdsPurge.js +50 -0
  248. package/dist/retention/policy.d.ts +132 -0
  249. package/dist/retention/policy.d.ts.map +1 -0
  250. package/dist/retention/policy.js +197 -0
  251. package/dist/session/rotated.d.ts +34 -0
  252. package/dist/session/rotated.d.ts.map +1 -0
  253. package/dist/session/rotated.js +25 -0
  254. package/dist/test-utils/connectionFixtures.d.ts +13 -0
  255. package/dist/test-utils/connectionFixtures.d.ts.map +1 -0
  256. package/dist/test-utils/connectionFixtures.js +58 -0
  257. package/dist/test-utils/interleave.d.ts +12 -0
  258. package/dist/test-utils/interleave.d.ts.map +1 -0
  259. package/dist/test-utils/interleave.js +26 -0
  260. package/dist/testWorker.d.ts +8 -0
  261. package/dist/testWorker.d.ts.map +1 -0
  262. package/dist/testWorker.js +9 -0
  263. package/dist/version.generated.d.ts +1 -1
  264. package/dist/version.generated.js +1 -1
  265. package/dist/workflow/dispatchRoute.js +1 -1
  266. package/package.json +1 -1
  267. package/src/audit/auditEvent.ts +1 -1
  268. package/src/audit/chain.ts +551 -0
  269. package/src/audit/citations.ts +63 -0
  270. package/src/capability/bindings.ts +61 -0
  271. package/src/capability/capability.ts +156 -19
  272. package/src/capability/erasure.ts +82 -0
  273. package/src/capability/personColumns.ts +83 -0
  274. package/src/capability/personRows.ts +125 -0
  275. package/src/capability/purge.ts +158 -21
  276. package/src/capability/settings.ts +7 -0
  277. package/src/capability/vectorIndex.ts +60 -0
  278. package/src/cli/commandCatalog.generated.ts +487 -2
  279. package/src/cli/commandFacts.ts +12 -3
  280. package/src/cloudflare-test.d.ts +3 -1
  281. package/src/consent/purpose.ts +160 -0
  282. package/src/consent/reader.ts +134 -0
  283. package/src/controlPlane/audit/actions.ts +15 -4
  284. package/src/controlPlane/capability.ts +99 -20
  285. package/src/controlPlane/context.ts +10 -2
  286. package/src/controlPlane/data/connection.ts +16 -2
  287. package/src/controlPlane/data/connections.ts +231 -0
  288. package/src/controlPlane/data/hold.ts +52 -0
  289. package/src/controlPlane/data/oidcTrust.ts +249 -0
  290. package/src/controlPlane/data/tables.ts +7 -0
  291. package/src/controlPlane/data/trustFirstCall.ts +37 -0
  292. package/src/controlPlane/discovery/adminRoute.ts +71 -9
  293. package/src/controlPlane/discovery/routeInput.ts +86 -0
  294. package/src/controlPlane/discovery/toolName.ts +23 -0
  295. package/src/controlPlane/erasure/attest.ts +205 -0
  296. package/src/controlPlane/erasure/read.ts +169 -0
  297. package/src/controlPlane/error/errors.ts +69 -2
  298. package/src/controlPlane/evidence/derive.ts +426 -0
  299. package/src/controlPlane/evidence/mapping.ts +118 -0
  300. package/src/controlPlane/evidence/pack.ts +190 -0
  301. package/src/controlPlane/http/connections.ts +129 -0
  302. package/src/controlPlane/http/guard.ts +118 -9
  303. package/src/controlPlane/http/handlers.ts +172 -40
  304. package/src/controlPlane/http/holds.ts +108 -0
  305. package/src/controlPlane/http/presence.ts +71 -0
  306. package/src/controlPlane/http/processing.ts +19 -0
  307. package/src/controlPlane/http/responses.ts +590 -7
  308. package/src/controlPlane/http/routes.ts +302 -3
  309. package/src/controlPlane/http/schemas.ts +126 -0
  310. package/src/controlPlane/http/verify.ts +19 -2
  311. package/src/controlPlane/http/verifyTrust.ts +176 -0
  312. package/src/controlPlane/migrations/0004_connection_trusts.ts +30 -0
  313. package/src/controlPlane/migrations/0005_holds.ts +40 -0
  314. package/src/controlPlane/processing/derive.ts +359 -0
  315. package/src/controlPlane/processing/read.ts +102 -0
  316. package/src/controlPlane/scope/kind.ts +63 -0
  317. package/src/controlPlane/scope/scope.ts +65 -3
  318. package/src/controlPlane/wire.ts +26 -0
  319. package/src/createBackend.ts +31 -6
  320. package/src/createEntrypoint.ts +17 -0
  321. package/src/error/payload.ts +234 -0
  322. package/src/error/pithyError.ts +42 -0
  323. package/src/http/routeSpec.ts +75 -5
  324. package/src/http/verification.ts +3 -1
  325. package/src/i18n/translator.ts +2 -1
  326. package/src/index.ts +2 -0
  327. package/src/mcp/annotations.ts +38 -0
  328. package/src/mcp/tools.ts +220 -0
  329. package/src/openapi/document.ts +8 -28
  330. package/src/openapi/operations.ts +62 -0
  331. package/src/presence/channel.ts +46 -0
  332. package/src/presence/declaration.ts +283 -0
  333. package/src/presence/durableObject.ts +287 -0
  334. package/src/presence/frames.ts +153 -0
  335. package/src/presence/http/guard.ts +23 -0
  336. package/src/presence/http/responses.ts +63 -0
  337. package/src/presence/http/routes.ts +165 -0
  338. package/src/presence/http/schemas.ts +39 -0
  339. package/src/presence/names.ts +45 -0
  340. package/src/presence/room.ts +145 -0
  341. package/src/presence/ticket.ts +145 -0
  342. package/src/processing/activity.ts +289 -0
  343. package/src/processing/composed.ts +33 -0
  344. package/src/processing/vocabulary.ts +43 -0
  345. package/src/queue/consumer.ts +104 -0
  346. package/src/retention/composed.ts +75 -0
  347. package/src/retention/holds.ts +175 -0
  348. package/src/retention/holdsPurge.ts +50 -0
  349. package/src/retention/policy.ts +305 -0
  350. package/src/session/rotated.ts +53 -0
  351. package/src/test-utils/connectionFixtures.ts +58 -0
  352. package/src/test-utils/interleave.ts +31 -0
  353. package/src/testWorker.ts +13 -0
  354. package/src/version.generated.ts +1 -1
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # @pithy-sh/core
2
+
3
+ The contract every Pithy capability composes through, and the seams they share: `defineCapability` and `createBackend`, the `PithyError` family, the D1 and KV codecs, the `AuthContext`, translator, audit and entitlement seams, the control-plane seam, and presence rooms.
4
+
5
+ **Documentation: [pithy.sh/docs](https://pithy.sh/docs).** The control-plane seam is [`docs/CONTROL-PLANE.md`](../../docs/CONTROL-PLANE.md); sockets are [`docs/SOCKETS.md`](../../docs/SOCKETS.md).
6
+
7
+ ## Presence rooms
8
+
9
+ Who else has a record open, live, from your own Worker. A capability declares its room kinds on `presence`:
10
+
11
+ ```ts
12
+ defineCapability({
13
+ name: "support",
14
+ presence: {
15
+ basePath: "/support",
16
+ ticketKey: (env) => readTicketKey(env), // presence-ticket-key, through @pithy-sh/secrets
17
+ rooms: [
18
+ {
19
+ kind: "support.thread",
20
+ scope: "support:threads:read",
21
+ activities: ["viewing", "replying"],
22
+ session: (c, recordId) => (canRead(c, recordId) ? { name: displayName(c) } : null),
23
+ },
24
+ ],
25
+ },
26
+ // …
27
+ });
28
+ ```
29
+
30
+ At runtime that is the whole of the wiring: `defineCapability` adds the `PRESENCE_ROOMS` Durable Object binding and the room socket, `createBackend` mounts the routes under `basePath`, and the control-plane manifest lists the kind. The CLI does not read your code, though. A kit capability's `pithy.manifest.json` must list the binding in `requiredBindings` exactly as `PRESENCE_ROOMS_BINDING_SPEC` gives it, beside the `presence-ticket-key` entry in `devSecrets`, because that manifest is what `pithy add` and `pithy upgrade` wire. Leave it out and `pithy add` writes no binding, no class migration and no entry export, and the Worker has no room to open. Only your own `app` capability, which has no manifest, is wired from its composition by `pithy upgrade`.
31
+
32
+ ```json
33
+ "requiredBindings": [
34
+ {
35
+ "type": "durable_object",
36
+ "name": "PRESENCE_ROOMS",
37
+ "className": "PresenceRoom",
38
+ "classModule": "@pithy-sh/core/src/presence/durableObject"
39
+ }
40
+ ]
41
+ ```
42
+
43
+ - **Tickets.** A management client mints one at `POST /control-plane/presence/tickets` with the kind's own scope. A signed-in user mints one at `POST {basePath}/presence/tickets`, when `session` admits them. Single use, 60 seconds, one room, one participant.
44
+ - **The socket.** `GET {basePath}/presence/rooms/:kind/:recordId`, offering `pithy.presence.v1` and `pithy.ticket.<ticket>` in `Sec-WebSocket-Protocol`. `init` first, then `joined`, `left` and `activity`. Send `set_activity` with a declared activity, and `ping` for `pong`.
45
+ - **The ticket key.** `presence-ticket-key`, declared in the capability's `@pithy-sh/secrets` registry with `PRESENCE_TICKET_KEY_ENTRY` and listed in its manifest's `devSecrets`. Nobody chooses its value: `pithy add` mints the local one and `pithy secrets provision` the deployed ones.
46
+ - **The room** is one hibernating `PresenceRoom` per record. It holds nothing but who is here, in its sockets' attachments, and writes nothing to D1, KV or storage.
47
+
48
+ Ticket, participant and frame schemas are exported from `@pithy-sh/core/src/presence/http/responses`, `@pithy-sh/core/src/presence/http/schemas` and `@pithy-sh/core/src/presence/frames`.
49
+
50
+ `pithy add` and `pithy upgrade` write the binding, the class migration tag and this line into your Worker's entry:
51
+
52
+ ```ts
53
+ export { PresenceRoom } from "@pithy-sh/core/src/presence/durableObject";
54
+ ```
@@ -58,7 +58,7 @@ const AuditEvent = z.object({
58
58
  severity: AuditSeverity.default("info").describe("How serious the event is; defaults to `info`."),
59
59
  actorType: AuditActorType.describe("The kind of principal that acted."),
60
60
  actorId: z.string().nullish().describe("The acting principal's stable id (user id, service/token name); null for `system`/`anonymous`."),
61
- actorKind: ControlPlaneActorKind.nullish().describe("For a `control-plane` actor, what kind of management client acted — `agent`, `dashboard` or `script` — from the connection it called through (#721). `actorType` names all three alike; this is what tells them apart. Stamped by `requireControlPlane`, so an emit site does not set it; null for every other actor type, and for a connection registered before the kind was recorded."),
61
+ actorKind: ControlPlaneActorKind.nullish().describe("What kind of client acted — `agent`, `dashboard` or `script`. On a `control-plane` row it is the connection's kind, which `actorType` cannot tell apart, stamped by `requireControlPlane` so an emit site does not set it; null for a connection registered before the kind was recorded. On a `user` row it is `agent` when an MCP client acted as that user, so one filter finds every agent row on both paths. Null otherwise."),
62
62
  sessionId: z.string().nullish().describe("The session this action belongs to, tying a chain of actions together; null when none."),
63
63
  resourceType: z.string().nullish().describe("The type of resource the action targeted (e.g. `user`, `secret`); null when not resource-scoped."),
64
64
  resourceId: z.string().nullish().describe("The id of the resource the action targeted; null when not resource-scoped."),
@@ -0,0 +1,289 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
3
+ import { z } from "zod";
4
+ /**
5
+ * **The audit trail's hash chain (#822): its canonical form, its commitments, and its verifier.**
6
+ *
7
+ * Every event `@pithy-sh/audit` records after the upgrade carries the hash of the event before it in its tenant's
8
+ * chain, computed over a canonical serialization. Editing, deleting or inserting a row then breaks a link, and a
9
+ * chain rewritten end to end is caught against a checkpoint written outside the database.
10
+ *
11
+ * **It lives in core, not in the audit package**, because three readers need the same bytes: the recorder that
12
+ * writes a link, the Worker's verify read, and `pithy audit verify`, which an auditor runs on an export with no
13
+ * project and no `@pithy-sh/audit` installed. A second copy of the canonical form is a second definition of the
14
+ * evidence, and the first time they differ every export reads as tampered.
15
+ *
16
+ * **Personal fields are committed, not included.** An event's hash covers a salted hash of its IP, user-agent and
17
+ * metadata rather than the values, so an export that leaves them out still verifies. The salt is per event and
18
+ * travels only with the values, so a commitment cannot be reversed by hashing every IPv4 address.
19
+ *
20
+ * **Nothing is signed.** The chain proves the trail is whole against its checkpoints; it adds no key and no way
21
+ * to change the trail.
22
+ */
23
+ /** The canonical form's version, the first element of every serialization. A new form is a new string. */
24
+ export declare const AUDIT_CHAIN_FORMAT = "pithy-audit-chain/1";
25
+ /** A lowercase hex SHA-256 digest. */
26
+ export declare const Sha256Hex: z.ZodString;
27
+ /**
28
+ * Every field of an event its hash covers, as the row stores it. Loose strings, never the taxonomy's enums: a
29
+ * verifier reads an export somebody may have altered, and an altered value must reach the hash check and be
30
+ * named as a break rather than fail to parse.
31
+ */
32
+ export declare const ChainedEventFields: z.ZodObject<{
33
+ eventId: z.ZodString;
34
+ occurredAt: z.ZodNumber;
35
+ action: z.ZodString;
36
+ outcome: z.ZodString;
37
+ severity: z.ZodString;
38
+ actorType: z.ZodString;
39
+ actorId: z.ZodNullable<z.ZodString>;
40
+ actorKind: z.ZodNullable<z.ZodString>;
41
+ sessionId: z.ZodNullable<z.ZodString>;
42
+ resourceType: z.ZodNullable<z.ZodString>;
43
+ resourceId: z.ZodNullable<z.ZodString>;
44
+ requestId: z.ZodNullable<z.ZodString>;
45
+ tenant: z.ZodNullable<z.ZodString>;
46
+ project: z.ZodNullable<z.ZodString>;
47
+ environment: z.ZodNullable<z.ZodString>;
48
+ worker: z.ZodNullable<z.ZodString>;
49
+ version: z.ZodNullable<z.ZodString>;
50
+ ipCommitment: z.ZodNullable<z.ZodString>;
51
+ userAgentCommitment: z.ZodNullable<z.ZodString>;
52
+ metadataCommitment: z.ZodNullable<z.ZodString>;
53
+ }, z.core.$strip>;
54
+ export type ChainedEventFields = z.infer<typeof ChainedEventFields>;
55
+ /** One event's place in its chain: its position and the hash of the event before it. */
56
+ export interface ChainPosition {
57
+ /** The 1-based position in the tenant's chain. */
58
+ seq: number;
59
+ /** The previous event's hash, or null for the first event. */
60
+ prev: string | null;
61
+ }
62
+ /** A link a range starts from or ends at: a position and the hash of the event there. */
63
+ export declare const ChainLink: z.ZodObject<{
64
+ seq: z.ZodNumber;
65
+ hash: z.ZodString;
66
+ }, z.core.$strip>;
67
+ export type ChainLink = z.infer<typeof ChainLink>;
68
+ /**
69
+ * One chained event as an export carries it: the hashed fields, its link, and — only with the detail scope — the
70
+ * personal values and the salt their commitments were made under.
71
+ */
72
+ export declare const ChainedEvent: z.ZodObject<{
73
+ eventId: z.ZodString;
74
+ occurredAt: z.ZodNumber;
75
+ action: z.ZodString;
76
+ outcome: z.ZodString;
77
+ severity: z.ZodString;
78
+ actorType: z.ZodString;
79
+ actorId: z.ZodNullable<z.ZodString>;
80
+ actorKind: z.ZodNullable<z.ZodString>;
81
+ sessionId: z.ZodNullable<z.ZodString>;
82
+ resourceType: z.ZodNullable<z.ZodString>;
83
+ resourceId: z.ZodNullable<z.ZodString>;
84
+ requestId: z.ZodNullable<z.ZodString>;
85
+ tenant: z.ZodNullable<z.ZodString>;
86
+ project: z.ZodNullable<z.ZodString>;
87
+ environment: z.ZodNullable<z.ZodString>;
88
+ worker: z.ZodNullable<z.ZodString>;
89
+ version: z.ZodNullable<z.ZodString>;
90
+ ipCommitment: z.ZodNullable<z.ZodString>;
91
+ userAgentCommitment: z.ZodNullable<z.ZodString>;
92
+ metadataCommitment: z.ZodNullable<z.ZodString>;
93
+ seq: z.ZodNumber;
94
+ prev: z.ZodNullable<z.ZodString>;
95
+ hash: z.ZodString;
96
+ salt: z.ZodOptional<z.ZodString>;
97
+ ip: z.ZodOptional<z.ZodNullable<z.ZodString>>;
98
+ userAgent: z.ZodOptional<z.ZodNullable<z.ZodString>>;
99
+ metadata: z.ZodOptional<z.ZodNullable<z.ZodString>>;
100
+ }, z.core.$strip>;
101
+ export type ChainedEvent = z.infer<typeof ChainedEvent>;
102
+ /** The format string of a checkpoint object. */
103
+ export declare const AUDIT_CHECKPOINT_FORMAT = "pithy-audit-checkpoint/1";
104
+ /** One checkpoint: a tenant chain's length and head, written outside the database on a schedule. */
105
+ export declare const AuditCheckpoint: z.ZodObject<{
106
+ format: z.ZodLiteral<"pithy-audit-checkpoint/1">;
107
+ tenant: z.ZodNullable<z.ZodString>;
108
+ count: z.ZodNumber;
109
+ head: z.ZodString;
110
+ takenAt: z.ZodISODateTime;
111
+ }, z.core.$strip>;
112
+ export type AuditCheckpoint = z.infer<typeof AuditCheckpoint>;
113
+ /** The format string of a tombstone object. */
114
+ export declare const AUDIT_TOMBSTONE_FORMAT = "pithy-audit-tombstone/1";
115
+ /**
116
+ * A pruned run of one chain: which positions the retention prune removed, the link before them, and the hashes at
117
+ * either end. Written to the checkpoint bucket before the rows are deleted, never overwritten, so a verify bridges
118
+ * the gap from the event before it to the event after it and reads the chain as whole across it.
119
+ */
120
+ export declare const AuditTombstone: z.ZodObject<{
121
+ format: z.ZodLiteral<"pithy-audit-tombstone/1">;
122
+ tenant: z.ZodNullable<z.ZodString>;
123
+ fromSeq: z.ZodNumber;
124
+ throughSeq: z.ZodNumber;
125
+ count: z.ZodNumber;
126
+ prior: z.ZodNullable<z.ZodString>;
127
+ first: z.ZodString;
128
+ last: z.ZodString;
129
+ prunedAt: z.ZodISODateTime;
130
+ }, z.core.$strip>;
131
+ export type AuditTombstone = z.infer<typeof AuditTombstone>;
132
+ /** The format string of an export document. */
133
+ export declare const AUDIT_EXPORT_FORMAT = "pithy-audit-export/1";
134
+ /** An export: one tenant's events in a range, the link before it, and the checkpoints covering it. */
135
+ export declare const AuditChainExport: z.ZodObject<{
136
+ format: z.ZodLiteral<"pithy-audit-export/1">;
137
+ chain: z.ZodLiteral<"pithy-audit-chain/1">;
138
+ tenant: z.ZodNullable<z.ZodString>;
139
+ since: z.ZodNullable<z.ZodISODateTime>;
140
+ until: z.ZodNullable<z.ZodISODateTime>;
141
+ exportedAt: z.ZodISODateTime;
142
+ detail: z.ZodBoolean;
143
+ prior: z.ZodNullable<z.ZodObject<{
144
+ seq: z.ZodNumber;
145
+ hash: z.ZodString;
146
+ }, z.core.$strip>>;
147
+ events: z.ZodArray<z.ZodObject<{
148
+ eventId: z.ZodString;
149
+ occurredAt: z.ZodNumber;
150
+ action: z.ZodString;
151
+ outcome: z.ZodString;
152
+ severity: z.ZodString;
153
+ actorType: z.ZodString;
154
+ actorId: z.ZodNullable<z.ZodString>;
155
+ actorKind: z.ZodNullable<z.ZodString>;
156
+ sessionId: z.ZodNullable<z.ZodString>;
157
+ resourceType: z.ZodNullable<z.ZodString>;
158
+ resourceId: z.ZodNullable<z.ZodString>;
159
+ requestId: z.ZodNullable<z.ZodString>;
160
+ tenant: z.ZodNullable<z.ZodString>;
161
+ project: z.ZodNullable<z.ZodString>;
162
+ environment: z.ZodNullable<z.ZodString>;
163
+ worker: z.ZodNullable<z.ZodString>;
164
+ version: z.ZodNullable<z.ZodString>;
165
+ ipCommitment: z.ZodNullable<z.ZodString>;
166
+ userAgentCommitment: z.ZodNullable<z.ZodString>;
167
+ metadataCommitment: z.ZodNullable<z.ZodString>;
168
+ seq: z.ZodNumber;
169
+ prev: z.ZodNullable<z.ZodString>;
170
+ hash: z.ZodString;
171
+ salt: z.ZodOptional<z.ZodString>;
172
+ ip: z.ZodOptional<z.ZodNullable<z.ZodString>>;
173
+ userAgent: z.ZodOptional<z.ZodNullable<z.ZodString>>;
174
+ metadata: z.ZodOptional<z.ZodNullable<z.ZodString>>;
175
+ }, z.core.$strip>>;
176
+ checkpoints: z.ZodArray<z.ZodObject<{
177
+ format: z.ZodLiteral<"pithy-audit-checkpoint/1">;
178
+ tenant: z.ZodNullable<z.ZodString>;
179
+ count: z.ZodNumber;
180
+ head: z.ZodString;
181
+ takenAt: z.ZodISODateTime;
182
+ }, z.core.$strip>>;
183
+ tombstones: z.ZodOptional<z.ZodArray<z.ZodObject<{
184
+ format: z.ZodLiteral<"pithy-audit-tombstone/1">;
185
+ tenant: z.ZodNullable<z.ZodString>;
186
+ fromSeq: z.ZodNumber;
187
+ throughSeq: z.ZodNumber;
188
+ count: z.ZodNumber;
189
+ prior: z.ZodNullable<z.ZodString>;
190
+ first: z.ZodString;
191
+ last: z.ZodString;
192
+ prunedAt: z.ZodISODateTime;
193
+ }, z.core.$strip>>>;
194
+ complete: z.ZodBoolean;
195
+ beforeChain: z.ZodNumber;
196
+ outsideChain: z.ZodNumber;
197
+ nextCursor: z.ZodNullable<z.ZodString>;
198
+ }, z.core.$strip>;
199
+ export type AuditChainExport = z.infer<typeof AuditChainExport>;
200
+ /** Why a chain is not whole. */
201
+ export declare const ChainBreakReason: z.ZodEnum<{
202
+ checkpoint: "checkpoint";
203
+ commitment: "commitment";
204
+ edited: "edited";
205
+ inserted: "inserted";
206
+ missing: "missing";
207
+ truncated: "truncated";
208
+ unlinked: "unlinked";
209
+ }>;
210
+ export type ChainBreakReason = z.infer<typeof ChainBreakReason>;
211
+ /** The first place a chain is not whole. */
212
+ export declare const ChainBreak: z.ZodObject<{
213
+ eventId: z.ZodNullable<z.ZodString>;
214
+ position: z.ZodNumber;
215
+ reason: z.ZodEnum<{
216
+ checkpoint: "checkpoint";
217
+ commitment: "commitment";
218
+ edited: "edited";
219
+ inserted: "inserted";
220
+ missing: "missing";
221
+ truncated: "truncated";
222
+ unlinked: "unlinked";
223
+ }>;
224
+ detail: z.ZodString;
225
+ }, z.core.$strip>;
226
+ export type ChainBreak = z.infer<typeof ChainBreak>;
227
+ /** The canonical serialization: a JSON array in one fixed order, so no key order or whitespace can vary it. */
228
+ export declare function canonicalEvent(position: ChainPosition, fields: ChainedEventFields): string;
229
+ /** Lowercase hex SHA-256 of a UTF-8 string. */
230
+ export declare function sha256Hex(text: string): Promise<string>;
231
+ /** A fresh per-event salt: 16 random bytes, hex. */
232
+ export declare function newChainSalt(): string;
233
+ /** The salted commitment to one personal value, or null when there is no value. */
234
+ export declare function commitment(salt: string, value: string | null): Promise<string | null>;
235
+ /** An event's chain hash: SHA-256 over its canonical serialization. */
236
+ export declare function chainHash(position: ChainPosition, fields: ChainedEventFields): Promise<string>;
237
+ /** What {@link chainVerifier} needs: whose chain, where the range starts, and the checkpoints to hold it to. */
238
+ export interface ChainVerifierOptions {
239
+ /** The tenant whose chain is walked. An event from any other chain is a break. */
240
+ tenant: string | null;
241
+ /** The link before the first event, or null when the walk starts the chain. */
242
+ prior: ChainLink | null;
243
+ /** Checkpoints to hold the walk to. Another tenant's are ignored. */
244
+ checkpoints: readonly AuditCheckpoint[];
245
+ /** The chain's pruned runs, each bridged where the walk reaches it. Another tenant's are ignored. */
246
+ tombstones?: readonly AuditTombstone[];
247
+ /**
248
+ * Whether every event must carry its personal values and their salt, so every commitment is checked: an export
249
+ * taken with the detail says it does. Omitted, an event without them is one whose commitments stand unopened.
250
+ */
251
+ values?: boolean;
252
+ }
253
+ /** A walk over one chain, fed in order, page by page. */
254
+ export interface ChainVerifier {
255
+ /** Check the next event. Returns the break it is, or null. Stop at the first break. */
256
+ push(event: ChainedEvent): Promise<ChainBreak | null>;
257
+ /** End the walk. With `complete`, a checkpoint past the last event is a truncation. */
258
+ finish(complete: boolean): ChainBreak | null;
259
+ /** The last link walked, or the prior when none was. */
260
+ readonly head: ChainLink | null;
261
+ /** How many events were checked. */
262
+ readonly checked: number;
263
+ /** How many of the tenant's checkpoints applied. */
264
+ readonly checkpoints: number;
265
+ /** How many events the walk crossed as pruned, bridged by a tombstone rather than checked. */
266
+ readonly pruned: number;
267
+ }
268
+ /**
269
+ * Walk one tenant's chain in order. Each event is checked for its tenant, its position, its link, its commitments
270
+ * (when it carries its values), its hash, and the checkpoint at its position — in that order, so the reason names
271
+ * the first thing wrong.
272
+ */
273
+ export declare function chainVerifier(options: ChainVerifierOptions): ChainVerifier;
274
+ /** What verifying one export found. */
275
+ export interface ChainVerification {
276
+ /** Whether the export's chain is whole. */
277
+ intact: boolean;
278
+ /** How many events were checked before the first break, or all of them. */
279
+ checked: number;
280
+ /** How many of the tenant's checkpoints the export carried. */
281
+ checkpoints: number;
282
+ /** How many events the walk crossed as pruned, each run bridged by its tombstone. */
283
+ pruned: number;
284
+ /** The first break, or null. */
285
+ break: ChainBreak | null;
286
+ }
287
+ /** Verify an export offline: every link, every commitment it can check, every checkpoint it carries. */
288
+ export declare function verifyChainExport(document: AuditChainExport): Promise<ChainVerification>;
289
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/audit/chain.ts"],"names":[],"mappings":"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"}