@phyzess/pappra 0.1.0-beta.13 → 0.1.0-beta.18

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 (357) hide show
  1. package/README.md +134 -15
  2. package/assets/integrations/skills/pappra/SKILL.md +28 -7
  3. package/assets/integrations/skills/pappra/references/collaboration.md +633 -0
  4. package/assets/integrations/skills/pappra/references/environment.md +360 -0
  5. package/assets/integrations/skills/pappra/references/hosts.md +20 -0
  6. package/assets/integrations/skills/pappra/references/operations.md +36 -5
  7. package/dist/adapters/pi/recovery-extension.d.ts +65 -0
  8. package/dist/adapters/pi/recovery-extension.js +238 -0
  9. package/dist/adapters/pi/session-transition-extension.d.ts +30 -0
  10. package/dist/adapters/pi/session-transition-extension.js +265 -0
  11. package/dist/app/automatic-handoff-events.d.ts +26 -0
  12. package/dist/app/automatic-handoff-events.js +134 -0
  13. package/dist/app/bounded-file.d.ts +2 -0
  14. package/dist/app/bounded-file.js +2 -0
  15. package/dist/app/capability-evidence/claude.d.ts +37 -0
  16. package/dist/app/capability-evidence/claude.js +206 -0
  17. package/dist/app/capability-evidence/codex.d.ts +35 -0
  18. package/dist/app/capability-evidence/codex.js +193 -0
  19. package/dist/app/capability-evidence/index.d.ts +33 -0
  20. package/dist/app/capability-evidence/index.js +117 -0
  21. package/dist/app/capability-evidence/pi.d.ts +73 -0
  22. package/dist/app/capability-evidence/pi.js +669 -0
  23. package/dist/app/capability-evidence/shared.d.ts +69 -0
  24. package/dist/app/capability-evidence/shared.js +195 -0
  25. package/dist/app/collab-auto-handoff.d.ts +55 -0
  26. package/dist/app/collab-auto-handoff.js +384 -0
  27. package/dist/app/collab-bindings.d.ts +57 -0
  28. package/dist/app/collab-bindings.js +1006 -0
  29. package/dist/app/collab-bootstrap-transport.d.ts +163 -0
  30. package/dist/app/collab-bootstrap-transport.js +769 -0
  31. package/dist/app/collab-bootstrap.d.ts +137 -0
  32. package/dist/app/collab-bootstrap.js +3455 -0
  33. package/dist/app/collab-handoff.d.ts +12 -0
  34. package/dist/app/collab-handoff.js +511 -0
  35. package/dist/app/collab-messages.d.ts +2 -0
  36. package/dist/app/collab-messages.js +2 -0
  37. package/dist/app/collab-notify.d.ts +156 -0
  38. package/dist/app/collab-notify.js +1208 -0
  39. package/dist/app/collab-preflight.d.ts +34 -0
  40. package/dist/app/collab-preflight.js +96 -0
  41. package/dist/app/collab-recovery-executor.d.ts +161 -0
  42. package/dist/app/collab-recovery-executor.js +1153 -0
  43. package/dist/app/collab-recovery-projection.d.ts +103 -0
  44. package/dist/app/collab-recovery-projection.js +659 -0
  45. package/dist/app/collab-recovery.d.ts +25 -0
  46. package/dist/app/collab-recovery.js +429 -0
  47. package/dist/app/collab-resources.d.ts +16 -0
  48. package/dist/app/collab-resources.js +278 -0
  49. package/dist/app/collab-role-events.d.ts +22 -0
  50. package/dist/app/collab-role-events.js +329 -0
  51. package/dist/app/collab-role-orchestration.d.ts +53 -0
  52. package/dist/app/collab-role-orchestration.js +601 -0
  53. package/dist/app/collab-role-plan.d.ts +81 -0
  54. package/dist/app/collab-role-plan.js +504 -0
  55. package/dist/app/collab-role-repair.d.ts +109 -0
  56. package/dist/app/collab-role-repair.js +821 -0
  57. package/dist/app/collab-rollover.d.ts +263 -0
  58. package/dist/app/collab-rollover.js +1112 -0
  59. package/dist/app/collab-route.d.ts +64 -0
  60. package/dist/app/collab-route.js +240 -0
  61. package/dist/app/collab-session-transition.d.ts +221 -0
  62. package/dist/app/collab-session-transition.js +3334 -0
  63. package/dist/app/collab-state.d.ts +7 -0
  64. package/dist/app/collab-state.js +162 -0
  65. package/dist/app/collab-task-store.d.ts +22 -0
  66. package/dist/app/collab-task-store.js +204 -0
  67. package/dist/app/collab-work-execution.d.ts +127 -0
  68. package/dist/app/collab-work-execution.js +1027 -0
  69. package/dist/app/collab-work-plan.d.ts +87 -0
  70. package/dist/app/collab-work-plan.js +437 -0
  71. package/dist/app/collaboration.d.ts +8 -2
  72. package/dist/app/collaboration.js +101 -12
  73. package/dist/app/doctor.js +108 -5
  74. package/dist/app/host-mcp.js +34 -8
  75. package/dist/app/host-probe.js +4 -4
  76. package/dist/app/init.d.ts +58 -4
  77. package/dist/app/init.js +768 -155
  78. package/dist/app/managed-pi-bootstrap-admission.d.ts +14 -0
  79. package/dist/app/managed-pi-bootstrap-admission.js +104 -0
  80. package/dist/app/managed-pi-bootstrap-refresh.d.ts +10 -0
  81. package/dist/app/managed-pi-bootstrap-refresh.js +78 -0
  82. package/dist/app/managed-pi-delivery.d.ts +8 -0
  83. package/dist/app/managed-pi-delivery.js +110 -0
  84. package/dist/app/managed-pi-handoff-receiver.d.ts +15 -0
  85. package/dist/app/managed-pi-handoff-receiver.js +263 -0
  86. package/dist/app/managed-pi-handoff-reference.d.ts +3 -0
  87. package/dist/app/managed-pi-handoff-reference.js +60 -0
  88. package/dist/app/managed-pi-herdr.d.ts +21 -0
  89. package/dist/app/managed-pi-herdr.js +185 -0
  90. package/dist/app/managed-pi-initial-admission.d.ts +28 -0
  91. package/dist/app/managed-pi-initial-admission.js +416 -0
  92. package/dist/app/managed-pi-initial-launch.d.ts +5 -0
  93. package/dist/app/managed-pi-initial-launch.js +61 -0
  94. package/dist/app/managed-pi-native-observation.d.ts +36 -0
  95. package/dist/app/managed-pi-native-observation.js +191 -0
  96. package/dist/app/managed-pi-readiness.d.ts +29 -0
  97. package/dist/app/managed-pi-readiness.js +288 -0
  98. package/dist/app/managed-pi-repair-stop.d.ts +21 -0
  99. package/dist/app/managed-pi-repair-stop.js +371 -0
  100. package/dist/app/managed-pi-resume-admission.d.ts +32 -0
  101. package/dist/app/managed-pi-resume-admission.js +618 -0
  102. package/dist/app/managed-pi-retirement.d.ts +28 -0
  103. package/dist/app/managed-pi-retirement.js +112 -0
  104. package/dist/app/managed-pi-sdk-control.d.ts +7 -0
  105. package/dist/app/managed-pi-sdk-control.js +169 -0
  106. package/dist/app/managed-pi-sdk-runtime.d.ts +3 -0
  107. package/dist/app/managed-pi-sdk-runtime.js +483 -0
  108. package/dist/app/managed-pi-source-admission.d.ts +14 -0
  109. package/dist/app/managed-pi-source-admission.js +323 -0
  110. package/dist/app/managed-pi-transition-host.d.ts +36 -0
  111. package/dist/app/managed-pi-transition-host.js +292 -0
  112. package/dist/app/managed-pi.d.ts +54 -0
  113. package/dist/app/managed-pi.js +248 -0
  114. package/dist/app/shell-readiness.d.ts +66 -0
  115. package/dist/app/shell-readiness.js +368 -0
  116. package/dist/app/task-pin.d.ts +2 -23
  117. package/dist/app/task-pin.js +2 -113
  118. package/dist/cli/commands/collaboration-binding.d.ts +13 -0
  119. package/dist/cli/commands/collaboration-binding.js +118 -0
  120. package/dist/cli/commands/collaboration-bootstrap.d.ts +10 -0
  121. package/dist/cli/commands/collaboration-bootstrap.js +84 -0
  122. package/dist/cli/commands/collaboration-capabilities.d.ts +13 -0
  123. package/dist/cli/commands/collaboration-capabilities.js +127 -0
  124. package/dist/cli/commands/collaboration-handoff.d.ts +13 -0
  125. package/dist/cli/commands/collaboration-handoff.js +102 -0
  126. package/dist/cli/commands/collaboration-message.d.ts +17 -0
  127. package/dist/cli/commands/collaboration-message.js +177 -0
  128. package/dist/cli/commands/collaboration-plan.d.ts +8 -0
  129. package/dist/cli/commands/collaboration-plan.js +108 -0
  130. package/dist/cli/commands/collaboration-preflight.d.ts +10 -0
  131. package/dist/cli/commands/collaboration-preflight.js +167 -0
  132. package/dist/cli/commands/collaboration-recovery-run.d.ts +46 -0
  133. package/dist/cli/commands/collaboration-recovery-run.js +224 -0
  134. package/dist/cli/commands/collaboration-recovery.d.ts +11 -0
  135. package/dist/cli/commands/collaboration-recovery.js +104 -0
  136. package/dist/cli/commands/collaboration-resources.d.ts +11 -0
  137. package/dist/cli/commands/collaboration-resources.js +96 -0
  138. package/dist/cli/commands/collaboration-role-plan.d.ts +9 -0
  139. package/dist/cli/commands/collaboration-role-plan.js +69 -0
  140. package/dist/cli/commands/collaboration-role-run.d.ts +11 -0
  141. package/dist/cli/commands/collaboration-role-run.js +128 -0
  142. package/dist/cli/commands/collaboration-rollover.d.ts +10 -0
  143. package/dist/cli/commands/collaboration-rollover.js +103 -0
  144. package/dist/cli/commands/collaboration-state.d.ts +10 -0
  145. package/dist/cli/commands/collaboration-state.js +96 -0
  146. package/dist/cli/commands/collaboration-transition.d.ts +10 -0
  147. package/dist/cli/commands/collaboration-transition.js +75 -0
  148. package/dist/cli/commands/collaboration-work-run.d.ts +34 -0
  149. package/dist/cli/commands/collaboration-work-run.js +178 -0
  150. package/dist/cli/commands/collaboration.d.ts +4 -0
  151. package/dist/cli/commands/collaboration.js +39 -4
  152. package/dist/cli/commands/continuity.js +2 -6
  153. package/dist/cli/commands/docs.d.ts +2 -0
  154. package/dist/cli/commands/docs.js +89 -15
  155. package/dist/cli/commands/host.d.ts +7 -1
  156. package/dist/cli/commands/host.js +122 -7
  157. package/dist/cli/commands/init.d.ts +20 -3
  158. package/dist/cli/commands/init.js +897 -232
  159. package/dist/cli/commands/mcp.d.ts +1 -0
  160. package/dist/cli/commands/mcp.js +11 -5
  161. package/dist/cli/commands/repair.d.ts +12 -0
  162. package/dist/cli/commands/repair.js +41 -0
  163. package/dist/cli/commands/runtime.d.ts +1 -1
  164. package/dist/cli/commands/runtime.js +139 -38
  165. package/dist/cli/commands/session.d.ts +7 -0
  166. package/dist/cli/commands/session.js +82 -0
  167. package/dist/cli/commands/task.js +19 -5
  168. package/dist/cli/run.js +866 -24
  169. package/dist/code/identity.d.ts +7 -0
  170. package/dist/code/identity.js +7 -3
  171. package/dist/code/registration.js +7 -0
  172. package/dist/code/service.d.ts +9 -0
  173. package/dist/code/service.js +16 -3
  174. package/dist/code/text.js +19 -7
  175. package/dist/collab/admission.d.ts +91 -66
  176. package/dist/collab/admission.js +21 -6
  177. package/dist/collab/canonical.d.ts +1 -1
  178. package/dist/collab/canonical.js +44 -3
  179. package/dist/collab/envelope.d.ts +2 -2
  180. package/dist/collab/envelope.js +12 -12
  181. package/dist/collab/first-work.d.ts +3 -0
  182. package/dist/collab/first-work.js +15 -0
  183. package/dist/collab/handoff.d.ts +16 -0
  184. package/dist/collab/handoff.js +39 -5
  185. package/dist/collab/index.d.ts +97 -1
  186. package/dist/collab/index.js +9 -1
  187. package/dist/collab/messages.js +126 -3
  188. package/dist/collab/persisted-messages.d.ts +123 -0
  189. package/dist/collab/persisted-messages.js +496 -0
  190. package/dist/collab/preflight.d.ts +1 -1
  191. package/dist/collab/resources.d.ts +13 -3
  192. package/dist/collab/resources.js +37 -6
  193. package/dist/collab/rollover.d.ts +311 -0
  194. package/dist/collab/rollover.js +1024 -0
  195. package/dist/collab/store.d.ts +1 -0
  196. package/dist/collab/store.js +1 -4
  197. package/dist/collab/types.d.ts +2 -354
  198. package/dist/collab/validation.d.ts +2 -10
  199. package/dist/collab/validation.js +2 -303
  200. package/dist/collab/work-plan.d.ts +105 -0
  201. package/dist/collab/work-plan.js +843 -0
  202. package/dist/continuity/context.d.ts +11 -2
  203. package/dist/continuity/context.js +100 -13
  204. package/dist/continuity/handoff-bundle.d.ts +296 -0
  205. package/dist/continuity/handoff-bundle.js +477 -0
  206. package/dist/continuity/index.d.ts +2 -0
  207. package/dist/continuity/index.js +1 -0
  208. package/dist/continuity/paths.js +10 -2
  209. package/dist/continuity/service.js +91 -15
  210. package/dist/continuity/task-pin.d.ts +24 -0
  211. package/dist/continuity/task-pin.js +590 -0
  212. package/dist/doctor.d.ts +1 -0
  213. package/dist/doctor.js +6 -0
  214. package/dist/experimental/index.d.ts +13 -0
  215. package/dist/experimental/index.js +25 -0
  216. package/dist/experimental/pi.d.ts +4 -0
  217. package/dist/experimental/pi.js +12 -0
  218. package/dist/hosts/claude/native.js +1 -1
  219. package/dist/hosts/codex/native.js +1 -1
  220. package/dist/hosts/codex/protocol.js +1 -1
  221. package/dist/hosts/integration/bootstrap-config.d.ts +58 -0
  222. package/dist/hosts/integration/bootstrap-config.js +254 -0
  223. package/dist/hosts/integration/bundle-export.d.ts +44 -0
  224. package/dist/hosts/integration/bundle-export.js +366 -3
  225. package/dist/hosts/integration/bundle.js +3 -0
  226. package/dist/hosts/integration/hook.js +36 -9
  227. package/dist/hosts/integration/pappra-bootstrap-extension.mjs +80 -0
  228. package/dist/hosts/integration/pappra-extension-runtime.mjs +59 -24631
  229. package/dist/hosts/integration/pappra-hook.mjs +61 -24749
  230. package/dist/hosts/integration/pappra-recovery-extension.mjs +259 -0
  231. package/dist/hosts/integration/pappra-session-transition-extension.mjs +276 -0
  232. package/dist/hosts/integration/pi-bootstrap-extension.d.ts +36 -0
  233. package/dist/hosts/integration/pi-bootstrap-extension.js +101 -0
  234. package/dist/hosts/integration/pi-bootstrap-guard.d.ts +125 -0
  235. package/dist/hosts/integration/pi-bootstrap-guard.js +438 -0
  236. package/dist/hosts/integration/pi-bootstrap-runtime.d.ts +63 -0
  237. package/dist/hosts/integration/pi-bootstrap-runtime.js +223 -0
  238. package/dist/hosts/integration/pi-native-events.d.ts +112 -0
  239. package/dist/hosts/integration/pi-native-events.js +348 -0
  240. package/dist/hosts/integration/pi-rollover-extension.d.ts +166 -0
  241. package/dist/hosts/integration/pi-rollover-extension.js +431 -0
  242. package/dist/hosts/integration/recovery-config.d.ts +48 -0
  243. package/dist/hosts/integration/recovery-config.js +117 -0
  244. package/dist/hosts/integration/service.d.ts +6 -1
  245. package/dist/hosts/integration/service.js +485 -35
  246. package/dist/hosts/integration/support.d.ts +7 -0
  247. package/dist/hosts/integration/support.js +9 -1
  248. package/dist/hosts/integration/templates.d.ts +3 -0
  249. package/dist/hosts/integration/templates.js +26 -3
  250. package/dist/hosts/pi/managed-host-identity.d.ts +2 -0
  251. package/dist/hosts/pi/managed-host-identity.js +40 -0
  252. package/dist/hosts/pi/managed-provider-diagnostics.d.ts +6 -0
  253. package/dist/hosts/pi/managed-provider-diagnostics.js +184 -0
  254. package/dist/hosts/pi/managed-sdk-session.d.ts +335 -0
  255. package/dist/hosts/pi/managed-sdk-session.js +1639 -0
  256. package/dist/hosts/pi/managed-session-extension.d.ts +20 -0
  257. package/dist/hosts/pi/managed-session-extension.js +84 -0
  258. package/dist/hosts/pi/managed-session.d.ts +177 -0
  259. package/dist/hosts/pi/managed-session.js +1557 -0
  260. package/dist/hosts/pi/protocol.js +1 -1
  261. package/dist/hosts/pi/query-result.js +1 -1
  262. package/dist/hosts/pi/resume-capability.d.ts +41 -0
  263. package/dist/hosts/pi/resume-capability.js +33 -0
  264. package/dist/hosts/pi/rpc.d.ts +182 -134
  265. package/dist/hosts/pi/rpc.js +230 -37
  266. package/dist/hosts/pilot.d.ts +97 -74
  267. package/dist/hosts/pilot.js +5 -1
  268. package/dist/hosts/version.d.ts +3 -0
  269. package/dist/hosts/version.js +18 -0
  270. package/dist/index.d.ts +0 -1
  271. package/dist/index.js +0 -1
  272. package/dist/infra/bounded-file.d.ts +19 -0
  273. package/dist/infra/bounded-file.js +66 -0
  274. package/dist/infra/fs.js +10 -2
  275. package/dist/infra/git.d.ts +29 -0
  276. package/dist/infra/git.js +45 -9
  277. package/dist/infra/json-property.d.ts +2 -0
  278. package/dist/infra/json-property.js +69 -0
  279. package/dist/infra/json.d.ts +4 -0
  280. package/dist/infra/json.js +24 -0
  281. package/dist/infra/owned-process-group.js +1 -1
  282. package/dist/infra/private-lock.d.ts +16 -0
  283. package/dist/infra/private-lock.js +148 -0
  284. package/dist/infra/private-state.d.ts +7 -0
  285. package/dist/infra/private-state.js +146 -0
  286. package/dist/infra/process-identity.d.ts +12 -0
  287. package/dist/infra/process-identity.js +142 -0
  288. package/dist/infra/validation.d.ts +5 -0
  289. package/dist/infra/validation.js +15 -0
  290. package/dist/init.d.ts +1 -0
  291. package/dist/init.js +6 -0
  292. package/dist/install/apply.d.ts +9 -1
  293. package/dist/install/apply.js +176 -12
  294. package/dist/install/dependencies.d.ts +38 -0
  295. package/dist/install/dependencies.js +282 -0
  296. package/dist/install/ownership.js +30 -1
  297. package/dist/install/references.d.ts +31 -0
  298. package/dist/install/references.js +208 -0
  299. package/dist/install/repair.d.ts +37 -0
  300. package/dist/install/repair.js +798 -0
  301. package/dist/install/reset-local.d.ts +16 -0
  302. package/dist/install/reset-local.js +304 -0
  303. package/dist/install/rollback.d.ts +3 -0
  304. package/dist/install/rollback.js +9 -3
  305. package/dist/install/runtime.d.ts +10 -6
  306. package/dist/install/runtime.js +299 -59
  307. package/dist/install/source-fingerprint.d.ts +2 -0
  308. package/dist/install/source-fingerprint.js +103 -0
  309. package/dist/knowledge/catalog.d.ts +1 -0
  310. package/dist/knowledge/catalog.js +143 -10
  311. package/dist/knowledge/journal.js +17 -7
  312. package/dist/knowledge/paths.js +2 -1
  313. package/dist/knowledge/refs.js +4 -0
  314. package/dist/knowledge/register-batch.d.ts +4 -0
  315. package/dist/knowledge/register-batch.js +225 -0
  316. package/dist/knowledge/relocate.d.ts +5 -0
  317. package/dist/knowledge/relocate.js +92 -0
  318. package/dist/knowledge/scan.js +103 -47
  319. package/dist/knowledge/service.d.ts +3 -0
  320. package/dist/knowledge/service.js +33 -1
  321. package/dist/knowledge/write.d.ts +4 -1
  322. package/dist/knowledge/write.js +1 -1
  323. package/dist/mcp/server.d.ts +4 -2
  324. package/dist/mcp/server.js +87 -136
  325. package/dist/schemas/collaboration-state-validation.d.ts +6 -0
  326. package/dist/schemas/collaboration-state-validation.js +342 -0
  327. package/dist/schemas/collaboration-state.d.ts +436 -0
  328. package/dist/schemas/collaboration-state.js +1 -0
  329. package/dist/schemas/collaboration.d.ts +335 -0
  330. package/dist/schemas/collaboration.js +272 -0
  331. package/dist/schemas/continuity.d.ts +8 -0
  332. package/dist/schemas/continuity.js +13 -3
  333. package/dist/schemas/doctor.d.ts +1 -0
  334. package/dist/schemas/doctor.js +1 -0
  335. package/dist/schemas/document.d.ts +61 -0
  336. package/dist/schemas/document.js +9 -0
  337. package/dist/schemas/errors.d.ts +1 -0
  338. package/dist/schemas/errors.js +1 -0
  339. package/dist/schemas/host.d.ts +24 -0
  340. package/dist/schemas/host.js +19 -0
  341. package/dist/schemas/install.d.ts +8 -2
  342. package/dist/schemas/install.js +11 -1
  343. package/dist/schemas/managed-pi-execution.d.ts +16 -0
  344. package/dist/schemas/managed-pi-execution.js +2 -0
  345. package/dist/schemas/outcome.d.ts +9 -5
  346. package/dist/workspace/config-file.js +1 -3
  347. package/dist/workspace/documents.js +12 -2
  348. package/dist/workspace/repositories.d.ts +7 -0
  349. package/dist/workspace/repositories.js +14 -5
  350. package/package.json +35 -35
  351. package/skills/pappra/SKILL.md +28 -7
  352. package/skills/pappra/references/collaboration.md +633 -0
  353. package/skills/pappra/references/environment.md +360 -0
  354. package/skills/pappra/references/hosts.md +20 -0
  355. package/skills/pappra/references/operations.md +36 -5
  356. package/dist/app/collab-from.d.ts +0 -35
  357. package/dist/app/collab-from.js +0 -84
@@ -0,0 +1,64 @@
1
+ import type { AppliedMessage, Identity, ResultEntry, RolloverIntent, TaskRecord } from '../collab/types.js';
2
+ /**
3
+ * Pure current-record notify route exclusion.
4
+ *
5
+ * A completed, valid succession retains the old native agent/session identity as history.
6
+ * That identity is no longer an active notify sender or recipient. This module only answers
7
+ * the notify question: it never rewrites messages, deliveries or bindings, and it does not
8
+ * claim that dispatch routing or the native session archive changed.
9
+ *
10
+ * A completed handoff alone proves nothing. A succession is usable only when its matching
11
+ * intent, recorded transfer boundary, registered applied first-work REPORT and admitted
12
+ * result entry all agree; anything missing or contradictory is `unknown`, never a silent
13
+ * reroute and never an accepted exclusion.
14
+ */
15
+ export declare const ROUTE_EXCLUSION_SCHEMA = "pappra/collaboration-route-exclusion/1";
16
+ export interface RouteExclusion {
17
+ readonly schema: typeof ROUTE_EXCLUSION_SCHEMA;
18
+ readonly agent_id: string;
19
+ readonly session_id: string;
20
+ readonly intent_id: string;
21
+ readonly handoff_id: string;
22
+ readonly generation: number;
23
+ readonly archived_at: string;
24
+ readonly proof_message_id: string;
25
+ readonly proof_digest: string;
26
+ /** Routing removal is not implemented: the value stays pending. */
27
+ readonly routing: 'pending';
28
+ /** The Pi native session archive is unavailable. */
29
+ readonly native_archive: 'unavailable';
30
+ }
31
+ export interface RouteExclusionLookup {
32
+ readonly state: 'active' | 'excluded' | 'unknown';
33
+ readonly exclusion: RouteExclusion | null;
34
+ readonly conflict: string | null;
35
+ }
36
+ export interface SuccessionFailure {
37
+ readonly ok: false;
38
+ readonly code: string;
39
+ readonly detail: string;
40
+ }
41
+ export type SuccessionValidation = {
42
+ readonly ok: true;
43
+ readonly intent: RolloverIntent;
44
+ readonly proof: AppliedMessage;
45
+ readonly result: ResultEntry;
46
+ readonly exclusion: RouteExclusion;
47
+ } | SuccessionFailure;
48
+ /**
49
+ * Validates one recorded succession end to end against the record it belongs to. The check
50
+ * is purely historical: it reads the immutable intent, the registered message ledger, the
51
+ * admitted result entry and the recorded transfer boundary. Live claims and later attempt
52
+ * states are not required, so an intact historical chain stays valid after further work.
53
+ */
54
+ export declare function validateSuccession(record: TaskRecord, entry: unknown): SuccessionValidation;
55
+ export declare function routeExclusions(record: TaskRecord): readonly RouteExclusion[];
56
+ /**
57
+ * Answers the notify question for one identity: is it an archived old native identity
58
+ * (`excluded`), an active identity (`active`), or is a relevant succession contradictory
59
+ * (`unknown`, which notify must refuse rather than guess)?
60
+ *
61
+ * A successor match is validated too: a succession that names this identity as its receiver
62
+ * but cannot prove the transfer is `unknown`, never a silent pass.
63
+ */
64
+ export declare function routeExclusionFor(record: TaskRecord, identity: Identity): RouteExclusionLookup;
@@ -0,0 +1,240 @@
1
+ import { object as isRecord } from '../infra/validation.js';
2
+ import { isTaskRecord } from '../collab/validation.js';
3
+ import { findHandoff } from '../collab/handoff.js';
4
+ import { isNativeFirstWorkResult } from '../collab/first-work.js';
5
+ /**
6
+ * Pure current-record notify route exclusion.
7
+ *
8
+ * A completed, valid succession retains the old native agent/session identity as history.
9
+ * That identity is no longer an active notify sender or recipient. This module only answers
10
+ * the notify question: it never rewrites messages, deliveries or bindings, and it does not
11
+ * claim that dispatch routing or the native session archive changed.
12
+ *
13
+ * A completed handoff alone proves nothing. A succession is usable only when its matching
14
+ * intent, recorded transfer boundary, registered applied first-work REPORT and admitted
15
+ * result entry all agree; anything missing or contradictory is `unknown`, never a silent
16
+ * reroute and never an accepted exclusion.
17
+ */
18
+ export const ROUTE_EXCLUSION_SCHEMA = 'pappra/collaboration-route-exclusion/1';
19
+ const isText = (value, max = 2048) => typeof value === 'string' &&
20
+ value.length > 0 &&
21
+ value.length <= max &&
22
+ !value.includes('\u0000');
23
+ const sameIdentity = (left, right) => left !== null &&
24
+ left.agent_id === right.agent_id &&
25
+ left.session_id === right.session_id;
26
+ const rejected = (code, detail) => ({
27
+ ok: false,
28
+ code,
29
+ detail,
30
+ });
31
+ const nativeMatchesIdentity = (native, identity) => sameIdentity(native, identity);
32
+ /**
33
+ * Validates one recorded succession end to end against the record it belongs to. The check
34
+ * is purely historical: it reads the immutable intent, the registered message ledger, the
35
+ * admitted result entry and the recorded transfer boundary. Live claims and later attempt
36
+ * states are not required, so an intact historical chain stays valid after further work.
37
+ */
38
+ export function validateSuccession(record, entry) {
39
+ if (!isTaskRecord(record))
40
+ return rejected('record_invalid', 'task record failed validation');
41
+ if (!isRecord(entry))
42
+ return rejected('succession_malformed', 'succession is not an object');
43
+ const handoffId = entry['handoff_id'];
44
+ const intentId = entry['intent_id'];
45
+ const generation = entry['generation'];
46
+ const archivedAt = entry['archived_at'];
47
+ const oldNative = entry['old_native'];
48
+ const successorNative = entry['successor_native'];
49
+ const proof = entry['proof'];
50
+ if (!isText(handoffId, 256) ||
51
+ !isText(intentId, 256) ||
52
+ !isText(archivedAt, 64) ||
53
+ !Number.isSafeInteger(generation) ||
54
+ generation < 1 ||
55
+ !isRecord(oldNative) ||
56
+ !isRecord(successorNative) ||
57
+ !isRecord(proof))
58
+ return rejected('succession_malformed', 'succession is missing intent, handoff, generation, native identities or proof');
59
+ const oldAgent = oldNative['agent_id'];
60
+ const oldSession = oldNative['session_id'];
61
+ const successorAgent = successorNative['agent_id'];
62
+ const successorSession = successorNative['session_id'];
63
+ const proofMessageId = proof['message_id'];
64
+ const proofDigest = proof['digest'];
65
+ if (!isText(oldAgent, 256) ||
66
+ !isText(oldSession, 256) ||
67
+ !isText(successorAgent, 256) ||
68
+ !isText(successorSession, 256) ||
69
+ !isText(proofMessageId, 256) ||
70
+ !isText(proofDigest, 128))
71
+ return rejected('succession_native_missing', 'succession has an incomplete native identity or proof pointer');
72
+ if (entry['history_retained'] !== true ||
73
+ entry['routing'] !== 'pending' ||
74
+ entry['native_archive'] !== 'unavailable')
75
+ return rejected('succession_history_invalid', 'succession does not record retained history, pending routing and an unavailable native archive');
76
+ if (successorAgent === oldAgent && successorSession === oldSession)
77
+ return rejected('succession_native_inherited', 'succession successor reuses the archived source native identity');
78
+ const handoff = findHandoff(record, handoffId);
79
+ if (handoff === null)
80
+ return rejected('succession_handoff_unknown', `succession references unknown handoff ${handoffId}`);
81
+ if (handoff.state !== 'completed')
82
+ return rejected('succession_handoff_not_completed', `handoff ${handoffId} is in state ${handoff.state}`);
83
+ if (!sameIdentity(handoff.from, { agent_id: oldAgent, session_id: oldSession }))
84
+ return rejected('succession_handoff_identity_mismatch', `handoff ${handoffId} source does not match the archived old native identity`);
85
+ if (!sameIdentity(handoff.to, {
86
+ agent_id: successorAgent,
87
+ session_id: successorSession,
88
+ }))
89
+ return rejected('succession_handoff_identity_mismatch', `handoff ${handoffId} receiver does not match the successor native identity`);
90
+ const intent = (record.rollover ?? []).find((item) => item.intent_id === intentId);
91
+ if (intent === undefined)
92
+ return rejected('succession_intent_missing', `succession references no recorded intent ${intentId}`);
93
+ if (intent.task_id !== record.task_id ||
94
+ intent.handoff_id !== handoffId ||
95
+ intent.generation !== generation)
96
+ return rejected('succession_intent_mismatch', `intent ${intentId} does not belong to this task, handoff or generation`);
97
+ if (!nativeMatchesIdentity(intent.from, {
98
+ agent_id: oldAgent,
99
+ session_id: oldSession,
100
+ }))
101
+ return rejected('succession_intent_source_mismatch', `intent ${intentId} source is not the archived old native identity`);
102
+ if (!nativeMatchesIdentity(intent.to, {
103
+ agent_id: successorAgent,
104
+ session_id: successorSession,
105
+ }))
106
+ return rejected('succession_intent_successor_mismatch', `intent ${intentId} receiver is not the successor native identity`);
107
+ if (!nativeMatchesIdentity(intent.source_native, {
108
+ agent_id: oldAgent,
109
+ session_id: oldSession,
110
+ }) ||
111
+ intent.source_native.runner !== (oldNative['runner'] ?? null) ||
112
+ intent.source_native.run_id !== (oldNative['run_id'] ?? null))
113
+ return rejected('succession_source_native_mismatch', `intent ${intentId} pinned source native identity does not match the archived history`);
114
+ const pinnedSuccessor = intent.successor_native ?? null;
115
+ if (pinnedSuccessor === null ||
116
+ !nativeMatchesIdentity(pinnedSuccessor, {
117
+ agent_id: successorAgent,
118
+ session_id: successorSession,
119
+ }) ||
120
+ pinnedSuccessor.runner !== (successorNative['runner'] ?? null) ||
121
+ pinnedSuccessor.run_id !== (successorNative['run_id'] ?? null))
122
+ return rejected('succession_successor_native_mismatch', `intent ${intentId} pinned successor native identity does not match the archived history`);
123
+ const boundary = intent.transfer_boundary ?? null;
124
+ if (boundary === null)
125
+ return rejected('succession_boundary_missing', `intent ${intentId} has no recorded transfer boundary`);
126
+ const messages = record.messages ?? [];
127
+ const index = messages.findIndex((item) => item.message_id === proofMessageId);
128
+ if (index < 0)
129
+ return rejected('succession_proof_missing', `first-work REPORT ${proofMessageId} is not registered`);
130
+ const applied = messages[index];
131
+ if (applied.state !== 'applied')
132
+ return rejected('succession_proof_not_applied', `first-work REPORT ${proofMessageId} is ${applied.state}, not applied`);
133
+ if (applied.content_digest !== proofDigest)
134
+ return rejected('succession_proof_digest_mismatch', `first-work REPORT ${proofMessageId} digest differs from the retained proof`);
135
+ if (applied.type !== 'REPORT')
136
+ return rejected('succession_proof_type_mismatch', `first-work proof ${proofMessageId} is ${applied.type}, not REPORT`);
137
+ if (index < boundary.message_count)
138
+ return rejected('succession_proof_pre_transfer', `first-work REPORT is registered before the recorded transfer boundary`);
139
+ if (!sameIdentity(applied.from, {
140
+ agent_id: successorAgent,
141
+ session_id: successorSession,
142
+ }))
143
+ return rejected('succession_proof_sender_mismatch', 'first-work REPORT was not sent by the successor native identity');
144
+ if (applied.subtask_id !== intent.subtask_id ||
145
+ applied.attempt !== intent.attempt)
146
+ return rejected('succession_proof_correlation_mismatch', 'first-work REPORT does not match the intent subtask and attempt');
147
+ const result = (record.results ?? []).find((item) => item.message_id === proofMessageId);
148
+ if (result === undefined)
149
+ return rejected('succession_result_missing', `first-work REPORT ${proofMessageId} has no admitted result`);
150
+ if (result.classification !== 'applied')
151
+ return rejected('succession_result_not_admitted', `first-work result is ${result.classification}, not applied`);
152
+ if (result.status !== 'completed' && !isNativeFirstWorkResult(result, intent))
153
+ return rejected('succession_result_not_completed', `first-work result is ${result.status}, not completed`);
154
+ if (result.subtask_id !== intent.subtask_id ||
155
+ result.attempt !== intent.attempt ||
156
+ result.input_revision !== intent.input_revision)
157
+ return rejected('succession_result_mismatch', 'first-work result does not match the intent subtask, attempt and input');
158
+ return {
159
+ ok: true,
160
+ intent,
161
+ proof: applied,
162
+ result,
163
+ exclusion: {
164
+ schema: ROUTE_EXCLUSION_SCHEMA,
165
+ agent_id: oldAgent,
166
+ session_id: oldSession,
167
+ intent_id: intentId,
168
+ handoff_id: handoffId,
169
+ generation: generation,
170
+ archived_at: archivedAt,
171
+ proof_message_id: proofMessageId,
172
+ proof_digest: proofDigest,
173
+ routing: 'pending',
174
+ native_archive: 'unavailable',
175
+ },
176
+ };
177
+ }
178
+ function matchOf(entry, identity) {
179
+ if (!isRecord(entry))
180
+ return null;
181
+ const oldNative = entry['old_native'];
182
+ const successorNative = entry['successor_native'];
183
+ const old = isRecord(oldNative) &&
184
+ oldNative['agent_id'] === identity.agent_id &&
185
+ oldNative['session_id'] === identity.session_id;
186
+ const successor = isRecord(successorNative) &&
187
+ successorNative['agent_id'] === identity.agent_id &&
188
+ successorNative['session_id'] === identity.session_id;
189
+ if (!old && !successor)
190
+ return null;
191
+ return { old, successor };
192
+ }
193
+ export function routeExclusions(record) {
194
+ if (!isTaskRecord(record))
195
+ return [];
196
+ const exclusions = [];
197
+ for (const entry of record.successions ?? []) {
198
+ const validated = validateSuccession(record, entry);
199
+ if (validated.ok)
200
+ exclusions.push(validated.exclusion);
201
+ }
202
+ return exclusions;
203
+ }
204
+ /**
205
+ * Answers the notify question for one identity: is it an archived old native identity
206
+ * (`excluded`), an active identity (`active`), or is a relevant succession contradictory
207
+ * (`unknown`, which notify must refuse rather than guess)?
208
+ *
209
+ * A successor match is validated too: a succession that names this identity as its receiver
210
+ * but cannot prove the transfer is `unknown`, never a silent pass.
211
+ */
212
+ export function routeExclusionFor(record, identity) {
213
+ if (!isTaskRecord(record))
214
+ return {
215
+ state: 'unknown',
216
+ exclusion: null,
217
+ conflict: 'task record failed validation',
218
+ };
219
+ let conflict = null;
220
+ for (const entry of record.successions ?? []) {
221
+ const match = matchOf(entry, identity);
222
+ if (match === null)
223
+ continue;
224
+ const validated = validateSuccession(record, entry);
225
+ if (validated.ok) {
226
+ // A successor identity is the current route; only an archived old identity excludes.
227
+ if (match.old)
228
+ return {
229
+ state: 'excluded',
230
+ exclusion: validated.exclusion,
231
+ conflict: null,
232
+ };
233
+ continue;
234
+ }
235
+ conflict = `${validated.code}: ${validated.detail}`;
236
+ }
237
+ if (conflict !== null)
238
+ return { state: 'unknown', exclusion: null, conflict };
239
+ return { state: 'active', exclusion: null, conflict: null };
240
+ }
@@ -0,0 +1,221 @@
1
+ import * as rollover from '../collab/rollover.js';
2
+ import type { FreezeOutcome, FreezeStatus, FreezeToken } from '../hosts/integration/pi-rollover-extension.js';
3
+ import type { NativeFactsSnapshot } from '../hosts/integration/pi-native-events.js';
4
+ import { type LoadedVisibleBootstrapRequest, type VisibleBootstrapDependencies, type VisibleBootstrapReport } from './collab-bootstrap.js';
5
+ import { type RolloverBundleRequest, type RolloverIntentRequest, type RolloverReport } from './collab-rollover.js';
6
+ import { type HerdrBootstrapOps } from './collab-bootstrap-transport.js';
7
+ import { MANAGED_PI_EXECUTION_SCOPE_SCHEMA, type ManagedPiExecutionScope } from '../schemas/managed-pi-execution.js';
8
+ export { MANAGED_PI_EXECUTION_SCOPE_SCHEMA };
9
+ export type { ManagedPiExecutionScope };
10
+ export declare const COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA = "pappra/collaboration-session-transition-request/1";
11
+ export declare const COLLAB_SESSION_TRANSITION_REPORT_SCHEMA = "pappra/collaboration-session-transition/1";
12
+ export declare const SESSION_TRANSITION_ARCHIVE_SCHEMA = "pappra/session-transition-archive/1";
13
+ export interface SessionTransitionRetirementMarker {
14
+ readonly schema: typeof SESSION_TRANSITION_ARCHIVE_SCHEMA;
15
+ readonly mode: 'task-retirement';
16
+ readonly task_id: string;
17
+ readonly task_root: string;
18
+ readonly transition_id: string;
19
+ readonly intent_id: string;
20
+ readonly handoff_id: string;
21
+ readonly generation: number;
22
+ readonly recorded_at: string;
23
+ readonly first_work: {
24
+ readonly message_id: string;
25
+ readonly digest: string;
26
+ };
27
+ readonly successor_route_binding: {
28
+ readonly ref: string;
29
+ readonly digest: string;
30
+ };
31
+ readonly native_archive: 'unavailable';
32
+ readonly original_transcript: 'retained-in-place';
33
+ readonly reversible: true;
34
+ }
35
+ export declare const SESSION_TRANSITION_JOURNAL_KEY = "session_transition_journal";
36
+ export type SessionTransitionAction = 'plan' | 'apply';
37
+ export type SessionTransitionStatus = 'planned' | 'progressed' | 'waiting' | 'needs_input' | 'reconcile_required' | 'unknown' | 'invalid';
38
+ export type SessionTransitionStage = 'not_started' | 'intent_created' | 'awaiting_quiescence' | 'prepared' | 'successor_bootstrap' | 'awaiting_receiver_ack' | 'receiver_confirmed' | 'ownership_transferred' | 'awaiting_first_work' | 'first_work_recorded' | 'task_retired' | 'unknown';
39
+ export declare const MANAGED_PI_SCOPED_PROOF_ADAPTER_ID = "pappra/managed-pi-session-transition-host/2";
40
+ export declare const MANAGED_PI_SCOPED_RECEIPT_SCHEMA = "pappra/session-transition-quiescence-receipt/2";
41
+ export interface SessionTransitionRequest {
42
+ readonly schema: typeof COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA;
43
+ readonly managed_execution_scope?: ManagedPiExecutionScope;
44
+ readonly task_root: string;
45
+ readonly transition_id: string;
46
+ readonly intent: RolloverIntentRequest;
47
+ readonly bundle: RolloverBundleRequest;
48
+ readonly bootstrap_request: {
49
+ readonly ref: string;
50
+ readonly digest: string;
51
+ };
52
+ readonly evidence: {
53
+ readonly ack_message_id: string | null;
54
+ readonly first_work_report_id: string | null;
55
+ };
56
+ readonly archive_mode: 'task-retirement';
57
+ }
58
+ export interface LoadedSessionTransitionRequest {
59
+ readonly request: SessionTransitionRequest;
60
+ readonly file: string;
61
+ readonly file_digest: string;
62
+ readonly immutable_digest: string;
63
+ }
64
+ export type SessionTransitionRequestResult = {
65
+ readonly ok: true;
66
+ readonly value: LoadedSessionTransitionRequest;
67
+ } | {
68
+ readonly ok: false;
69
+ readonly kind: 'invalid';
70
+ readonly code: string;
71
+ readonly message: string;
72
+ readonly next_action: string | null;
73
+ };
74
+ export interface SessionTransitionQuiescenceProof {
75
+ readonly adapter_id: 'pappra/pi-session-transition-host/1' | typeof MANAGED_PI_SCOPED_PROOF_ADAPTER_ID;
76
+ readonly session_id: string;
77
+ readonly cwd: string;
78
+ readonly observed_at: string;
79
+ readonly sequence: number;
80
+ readonly evidence_ref: string;
81
+ readonly freeze_token: FreezeToken;
82
+ readonly inventory: rollover.RolloverInventory;
83
+ readonly scope?: 'pinned_pi_1_4_owned_runtime';
84
+ readonly execution_scope?: ManagedPiExecutionScope;
85
+ readonly execution_scope_digest?: string;
86
+ readonly excluded_scope?: readonly [
87
+ 'arbitrary_external_writers',
88
+ 'unowned_processes_and_descendants'
89
+ ];
90
+ readonly runtime_quiescent?: boolean;
91
+ readonly runtime_blockers?: readonly string[];
92
+ readonly controller_sequence?: number;
93
+ readonly controller_head_digest?: string;
94
+ readonly controller_journal_healthy?: boolean;
95
+ }
96
+ export interface SessionTransitionQuiescenceReceipt {
97
+ readonly schema: 'pappra/session-transition-quiescence-receipt/1' | typeof MANAGED_PI_SCOPED_RECEIPT_SCHEMA;
98
+ readonly adapter_id: 'pappra/pi-session-transition-host/1' | typeof MANAGED_PI_SCOPED_PROOF_ADAPTER_ID;
99
+ readonly session_id: string;
100
+ readonly cwd: string;
101
+ readonly observed_at: string;
102
+ readonly sequence: number;
103
+ readonly evidence_ref: string;
104
+ readonly freeze_token: FreezeToken;
105
+ readonly inventory_digest: string;
106
+ readonly execution_scope_digest?: string;
107
+ }
108
+ export interface SessionTransitionHostObservation {
109
+ readonly session_id: string | null;
110
+ readonly cwd: string | null;
111
+ readonly pane_id: string | null;
112
+ readonly proof_support: 'available' | 'unavailable';
113
+ readonly proof: SessionTransitionQuiescenceProof | null;
114
+ readonly freeze_status: FreezeStatus | null;
115
+ readonly native_facts: NativeFactsSnapshot | null;
116
+ readonly unavailable_code: string | null;
117
+ readonly detail: string | null;
118
+ }
119
+ /**
120
+ * In-process adapter supplied only by the opt-in Pi extension. The installed producer currently
121
+ * cannot return a complete quiescence proof; its production adapter must report that boundary
122
+ * rather than promote idle, settled, or a freeze latch to stop proof.
123
+ */
124
+ export interface SessionTransitionHost {
125
+ readonly id: string;
126
+ observe(): Promise<SessionTransitionHostObservation>;
127
+ freeze(token: FreezeToken): Promise<FreezeOutcome>;
128
+ }
129
+ export interface SessionTransitionBootstrapExecutor {
130
+ plan(request: LoadedVisibleBootstrapRequest): Promise<VisibleBootstrapReport>;
131
+ apply(request: LoadedVisibleBootstrapRequest): Promise<VisibleBootstrapReport>;
132
+ }
133
+ export interface SessionTransitionDependencies {
134
+ readonly host?: SessionTransitionHost;
135
+ readonly bootstrap?: SessionTransitionBootstrapExecutor;
136
+ readonly bootstrapDependencies?: VisibleBootstrapDependencies;
137
+ readonly herdr?: HerdrBootstrapOps;
138
+ readonly clock?: () => number;
139
+ readonly signal?: AbortSignal;
140
+ }
141
+ export interface SessionTransitionStep {
142
+ readonly step: string;
143
+ readonly status: string;
144
+ readonly code: string | null;
145
+ readonly detail: string | null;
146
+ }
147
+ export interface SessionTransitionReport {
148
+ readonly schema: typeof COLLAB_SESSION_TRANSITION_REPORT_SCHEMA;
149
+ readonly action: SessionTransitionAction;
150
+ readonly ok: boolean;
151
+ readonly status: SessionTransitionStatus;
152
+ readonly code: string | null;
153
+ readonly message: string | null;
154
+ readonly next_action: string | null;
155
+ readonly task_id: string | null;
156
+ readonly task_root: string;
157
+ readonly state_revision: number | null;
158
+ readonly transition_id: string;
159
+ readonly cause_ref: string;
160
+ readonly stage: SessionTransitionStage;
161
+ readonly intent: Record<string, unknown> | null;
162
+ readonly handoff: Record<string, unknown> | null;
163
+ readonly rollover: RolloverReport | null;
164
+ readonly bootstrap: VisibleBootstrapReport | null;
165
+ readonly receiver_ack: Record<string, unknown> | null;
166
+ readonly transfer: Record<string, unknown> | null;
167
+ readonly first_work: Record<string, unknown> | null;
168
+ readonly route_transfer: Record<string, unknown> | null;
169
+ readonly archive: Record<string, unknown> | null;
170
+ readonly host: Record<string, unknown> | null;
171
+ readonly steps: readonly SessionTransitionStep[];
172
+ readonly capabilities: {
173
+ readonly record_reducer: 'available';
174
+ readonly bootstrap: 'available';
175
+ readonly pi_host_extension: 'available' | 'not_loaded';
176
+ readonly supported_quiescence: 'available' | 'unavailable' | 'unknown';
177
+ readonly native_session_archive: 'unavailable';
178
+ readonly task_retirement_archive: 'available';
179
+ readonly task_route_transfer: 'available';
180
+ readonly notification_route_exclusion: 'active' | 'pending' | 'excluded' | 'unknown';
181
+ };
182
+ readonly limits: readonly string[];
183
+ }
184
+ export interface SessionTransitionEffectReceipt {
185
+ readonly state: 'pending' | 'completed' | 'unknown' | 'failed';
186
+ readonly intent_at: string;
187
+ readonly outcome_at?: string;
188
+ readonly code?: string;
189
+ readonly digest?: string;
190
+ readonly ref?: string;
191
+ }
192
+ export interface SessionTransitionJournalEntry {
193
+ readonly transition_id: string;
194
+ readonly request_digest: string;
195
+ readonly bootstrap_request_digest: string;
196
+ readonly created_at: string;
197
+ readonly updated_at: string;
198
+ readonly effects: Readonly<Record<string, SessionTransitionEffectReceipt>>;
199
+ readonly route_binding_ref?: string | null;
200
+ readonly route_binding_digest?: string | null;
201
+ readonly archive_ref?: string | null;
202
+ readonly archive_digest?: string | null;
203
+ readonly source_quiescence_receipt?: SessionTransitionQuiescenceReceipt;
204
+ readonly transfer_quiescence_receipt?: SessionTransitionQuiescenceReceipt;
205
+ }
206
+ export interface SessionTransitionJournal {
207
+ readonly schema: 'pappra/session-transition-journal/1';
208
+ readonly entries: readonly SessionTransitionJournalEntry[];
209
+ }
210
+ export declare function validateSessionTransitionRequest(value: unknown): {
211
+ readonly ok: true;
212
+ readonly request: SessionTransitionRequest;
213
+ } | {
214
+ readonly ok: false;
215
+ readonly code: string;
216
+ readonly message: string;
217
+ };
218
+ export declare function loadSessionTransitionRequest(file: string): SessionTransitionRequestResult;
219
+ export type SessionTransitionEffectName = 'source-freeze' | 'successor-route-binding' | 'task-retirement-marker';
220
+ export declare function planSessionTransition(input: LoadedSessionTransitionRequest | SessionTransitionRequest, dependencies?: SessionTransitionDependencies): Promise<SessionTransitionReport>;
221
+ export declare function applySessionTransition(input: LoadedSessionTransitionRequest | SessionTransitionRequest, dependencies?: SessionTransitionDependencies): Promise<SessionTransitionReport>;