@phyzess/pappra 0.1.0-beta.14 → 0.1.0-beta.19

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 (365) hide show
  1. package/README.md +133 -14
  2. package/assets/integrations/skills/pappra/SKILL.md +56 -7
  3. package/assets/integrations/skills/pappra/references/collaboration.md +646 -0
  4. package/assets/integrations/skills/pappra/references/environment.md +367 -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-request.d.ts +50 -0
  62. package/dist/app/collab-session-transition-request.js +339 -0
  63. package/dist/app/collab-session-transition-validation.d.ts +19 -0
  64. package/dist/app/collab-session-transition-validation.js +44 -0
  65. package/dist/app/collab-session-transition.d.ts +181 -0
  66. package/dist/app/collab-session-transition.js +2970 -0
  67. package/dist/app/collab-state.d.ts +7 -0
  68. package/dist/app/collab-state.js +162 -0
  69. package/dist/app/collab-task-store.d.ts +22 -0
  70. package/dist/app/collab-task-store.js +204 -0
  71. package/dist/app/collab-work-execution.d.ts +127 -0
  72. package/dist/app/collab-work-execution.js +1027 -0
  73. package/dist/app/collab-work-plan.d.ts +87 -0
  74. package/dist/app/collab-work-plan.js +437 -0
  75. package/dist/app/collaboration.d.ts +8 -2
  76. package/dist/app/collaboration.js +101 -12
  77. package/dist/app/doctor.js +104 -3
  78. package/dist/app/host-mcp.js +34 -8
  79. package/dist/app/host-probe.js +4 -4
  80. package/dist/app/init.d.ts +58 -4
  81. package/dist/app/init.js +768 -155
  82. package/dist/app/managed-pi-bootstrap-admission.d.ts +14 -0
  83. package/dist/app/managed-pi-bootstrap-admission.js +104 -0
  84. package/dist/app/managed-pi-bootstrap-refresh.d.ts +10 -0
  85. package/dist/app/managed-pi-bootstrap-refresh.js +78 -0
  86. package/dist/app/managed-pi-delivery.d.ts +8 -0
  87. package/dist/app/managed-pi-delivery.js +110 -0
  88. package/dist/app/managed-pi-handoff-receiver.d.ts +15 -0
  89. package/dist/app/managed-pi-handoff-receiver.js +263 -0
  90. package/dist/app/managed-pi-handoff-reference.d.ts +3 -0
  91. package/dist/app/managed-pi-handoff-reference.js +60 -0
  92. package/dist/app/managed-pi-herdr.d.ts +21 -0
  93. package/dist/app/managed-pi-herdr.js +185 -0
  94. package/dist/app/managed-pi-initial-admission.d.ts +28 -0
  95. package/dist/app/managed-pi-initial-admission.js +416 -0
  96. package/dist/app/managed-pi-initial-launch.d.ts +5 -0
  97. package/dist/app/managed-pi-initial-launch.js +61 -0
  98. package/dist/app/managed-pi-native-observation.d.ts +36 -0
  99. package/dist/app/managed-pi-native-observation.js +191 -0
  100. package/dist/app/managed-pi-readiness.d.ts +29 -0
  101. package/dist/app/managed-pi-readiness.js +288 -0
  102. package/dist/app/managed-pi-repair-stop.d.ts +21 -0
  103. package/dist/app/managed-pi-repair-stop.js +371 -0
  104. package/dist/app/managed-pi-resume-admission.d.ts +32 -0
  105. package/dist/app/managed-pi-resume-admission.js +618 -0
  106. package/dist/app/managed-pi-retirement.d.ts +28 -0
  107. package/dist/app/managed-pi-retirement.js +112 -0
  108. package/dist/app/managed-pi-sdk-control.d.ts +7 -0
  109. package/dist/app/managed-pi-sdk-control.js +169 -0
  110. package/dist/app/managed-pi-sdk-runtime.d.ts +3 -0
  111. package/dist/app/managed-pi-sdk-runtime.js +483 -0
  112. package/dist/app/managed-pi-source-admission.d.ts +14 -0
  113. package/dist/app/managed-pi-source-admission.js +323 -0
  114. package/dist/app/managed-pi-transition-host.d.ts +36 -0
  115. package/dist/app/managed-pi-transition-host.js +292 -0
  116. package/dist/app/managed-pi.d.ts +54 -0
  117. package/dist/app/managed-pi.js +248 -0
  118. package/dist/app/shell-readiness.d.ts +66 -0
  119. package/dist/app/shell-readiness.js +368 -0
  120. package/dist/app/task-pin.d.ts +2 -23
  121. package/dist/app/task-pin.js +2 -113
  122. package/dist/cli/collaboration-router.d.ts +17 -0
  123. package/dist/cli/collaboration-router.js +604 -0
  124. package/dist/cli/commands/collaboration-binding.d.ts +13 -0
  125. package/dist/cli/commands/collaboration-binding.js +118 -0
  126. package/dist/cli/commands/collaboration-bootstrap.d.ts +10 -0
  127. package/dist/cli/commands/collaboration-bootstrap.js +84 -0
  128. package/dist/cli/commands/collaboration-capabilities.d.ts +13 -0
  129. package/dist/cli/commands/collaboration-capabilities.js +127 -0
  130. package/dist/cli/commands/collaboration-handoff.d.ts +13 -0
  131. package/dist/cli/commands/collaboration-handoff.js +102 -0
  132. package/dist/cli/commands/collaboration-message.d.ts +17 -0
  133. package/dist/cli/commands/collaboration-message.js +177 -0
  134. package/dist/cli/commands/collaboration-plan.d.ts +8 -0
  135. package/dist/cli/commands/collaboration-plan.js +108 -0
  136. package/dist/cli/commands/collaboration-preflight.d.ts +10 -0
  137. package/dist/cli/commands/collaboration-preflight.js +167 -0
  138. package/dist/cli/commands/collaboration-recovery-run.d.ts +46 -0
  139. package/dist/cli/commands/collaboration-recovery-run.js +224 -0
  140. package/dist/cli/commands/collaboration-recovery.d.ts +11 -0
  141. package/dist/cli/commands/collaboration-recovery.js +104 -0
  142. package/dist/cli/commands/collaboration-resources.d.ts +11 -0
  143. package/dist/cli/commands/collaboration-resources.js +96 -0
  144. package/dist/cli/commands/collaboration-role-plan.d.ts +9 -0
  145. package/dist/cli/commands/collaboration-role-plan.js +69 -0
  146. package/dist/cli/commands/collaboration-role-run.d.ts +11 -0
  147. package/dist/cli/commands/collaboration-role-run.js +128 -0
  148. package/dist/cli/commands/collaboration-rollover.d.ts +10 -0
  149. package/dist/cli/commands/collaboration-rollover.js +103 -0
  150. package/dist/cli/commands/collaboration-state.d.ts +10 -0
  151. package/dist/cli/commands/collaboration-state.js +96 -0
  152. package/dist/cli/commands/collaboration-transition.d.ts +10 -0
  153. package/dist/cli/commands/collaboration-transition.js +75 -0
  154. package/dist/cli/commands/collaboration-work-run.d.ts +34 -0
  155. package/dist/cli/commands/collaboration-work-run.js +178 -0
  156. package/dist/cli/commands/collaboration.d.ts +4 -0
  157. package/dist/cli/commands/collaboration.js +39 -4
  158. package/dist/cli/commands/continuity.js +2 -6
  159. package/dist/cli/commands/docs.d.ts +2 -0
  160. package/dist/cli/commands/docs.js +89 -15
  161. package/dist/cli/commands/host.d.ts +7 -1
  162. package/dist/cli/commands/host.js +122 -7
  163. package/dist/cli/commands/init.d.ts +20 -3
  164. package/dist/cli/commands/init.js +897 -232
  165. package/dist/cli/commands/mcp.d.ts +1 -0
  166. package/dist/cli/commands/mcp.js +11 -5
  167. package/dist/cli/commands/repair.d.ts +12 -0
  168. package/dist/cli/commands/repair.js +41 -0
  169. package/dist/cli/commands/runtime.d.ts +1 -1
  170. package/dist/cli/commands/runtime.js +139 -38
  171. package/dist/cli/commands/session.d.ts +7 -0
  172. package/dist/cli/commands/session.js +82 -0
  173. package/dist/cli/commands/task.js +19 -5
  174. package/dist/cli/options.d.ts +806 -0
  175. package/dist/cli/options.js +293 -0
  176. package/dist/cli/run.js +280 -310
  177. package/dist/code/identity.d.ts +7 -0
  178. package/dist/code/identity.js +7 -3
  179. package/dist/code/registration.js +7 -0
  180. package/dist/code/service.d.ts +9 -0
  181. package/dist/code/service.js +16 -3
  182. package/dist/code/text.js +19 -7
  183. package/dist/collab/admission.d.ts +91 -66
  184. package/dist/collab/admission.js +21 -6
  185. package/dist/collab/canonical.d.ts +1 -1
  186. package/dist/collab/canonical.js +44 -3
  187. package/dist/collab/envelope.d.ts +2 -2
  188. package/dist/collab/envelope.js +12 -12
  189. package/dist/collab/first-work.d.ts +3 -0
  190. package/dist/collab/first-work.js +15 -0
  191. package/dist/collab/handoff.d.ts +16 -0
  192. package/dist/collab/handoff.js +39 -5
  193. package/dist/collab/index.d.ts +97 -1
  194. package/dist/collab/index.js +9 -1
  195. package/dist/collab/messages.js +126 -3
  196. package/dist/collab/persisted-messages.d.ts +123 -0
  197. package/dist/collab/persisted-messages.js +496 -0
  198. package/dist/collab/preflight.d.ts +1 -1
  199. package/dist/collab/resources.d.ts +13 -3
  200. package/dist/collab/resources.js +37 -6
  201. package/dist/collab/rollover.d.ts +311 -0
  202. package/dist/collab/rollover.js +1024 -0
  203. package/dist/collab/store.d.ts +1 -0
  204. package/dist/collab/store.js +1 -4
  205. package/dist/collab/types.d.ts +2 -354
  206. package/dist/collab/validation.d.ts +2 -10
  207. package/dist/collab/validation.js +2 -303
  208. package/dist/collab/work-plan.d.ts +105 -0
  209. package/dist/collab/work-plan.js +843 -0
  210. package/dist/continuity/context.d.ts +11 -2
  211. package/dist/continuity/context.js +100 -13
  212. package/dist/continuity/handoff-bundle.d.ts +296 -0
  213. package/dist/continuity/handoff-bundle.js +477 -0
  214. package/dist/continuity/index.d.ts +2 -0
  215. package/dist/continuity/index.js +1 -0
  216. package/dist/continuity/paths.js +10 -2
  217. package/dist/continuity/service.js +91 -15
  218. package/dist/continuity/task-pin.d.ts +24 -0
  219. package/dist/continuity/task-pin.js +590 -0
  220. package/dist/doctor.d.ts +1 -0
  221. package/dist/doctor.js +6 -0
  222. package/dist/experimental/index.d.ts +13 -0
  223. package/dist/experimental/index.js +25 -0
  224. package/dist/experimental/pi.d.ts +4 -0
  225. package/dist/experimental/pi.js +12 -0
  226. package/dist/hosts/claude/native.js +1 -1
  227. package/dist/hosts/codex/native.js +1 -1
  228. package/dist/hosts/codex/protocol.js +1 -1
  229. package/dist/hosts/integration/bootstrap-config.d.ts +58 -0
  230. package/dist/hosts/integration/bootstrap-config.js +254 -0
  231. package/dist/hosts/integration/bundle-export.d.ts +44 -0
  232. package/dist/hosts/integration/bundle-export.js +366 -3
  233. package/dist/hosts/integration/bundle.js +3 -0
  234. package/dist/hosts/integration/hook.js +36 -9
  235. package/dist/hosts/integration/pappra-bootstrap-extension.mjs +80 -0
  236. package/dist/hosts/integration/pappra-extension-runtime.mjs +59 -24631
  237. package/dist/hosts/integration/pappra-hook.mjs +61 -24749
  238. package/dist/hosts/integration/pappra-recovery-extension.mjs +259 -0
  239. package/dist/hosts/integration/pappra-session-transition-extension.mjs +276 -0
  240. package/dist/hosts/integration/pi-bootstrap-extension.d.ts +36 -0
  241. package/dist/hosts/integration/pi-bootstrap-extension.js +101 -0
  242. package/dist/hosts/integration/pi-bootstrap-guard.d.ts +125 -0
  243. package/dist/hosts/integration/pi-bootstrap-guard.js +438 -0
  244. package/dist/hosts/integration/pi-bootstrap-runtime.d.ts +63 -0
  245. package/dist/hosts/integration/pi-bootstrap-runtime.js +223 -0
  246. package/dist/hosts/integration/pi-native-events.d.ts +112 -0
  247. package/dist/hosts/integration/pi-native-events.js +348 -0
  248. package/dist/hosts/integration/pi-rollover-extension.d.ts +166 -0
  249. package/dist/hosts/integration/pi-rollover-extension.js +431 -0
  250. package/dist/hosts/integration/recovery-config.d.ts +48 -0
  251. package/dist/hosts/integration/recovery-config.js +117 -0
  252. package/dist/hosts/integration/service.d.ts +6 -1
  253. package/dist/hosts/integration/service.js +485 -35
  254. package/dist/hosts/integration/support.d.ts +7 -0
  255. package/dist/hosts/integration/support.js +9 -1
  256. package/dist/hosts/integration/templates.d.ts +3 -0
  257. package/dist/hosts/integration/templates.js +26 -3
  258. package/dist/hosts/pi/managed-host-identity.d.ts +2 -0
  259. package/dist/hosts/pi/managed-host-identity.js +40 -0
  260. package/dist/hosts/pi/managed-provider-diagnostics.d.ts +6 -0
  261. package/dist/hosts/pi/managed-provider-diagnostics.js +184 -0
  262. package/dist/hosts/pi/managed-sdk-session.d.ts +335 -0
  263. package/dist/hosts/pi/managed-sdk-session.js +1639 -0
  264. package/dist/hosts/pi/managed-session-extension.d.ts +20 -0
  265. package/dist/hosts/pi/managed-session-extension.js +84 -0
  266. package/dist/hosts/pi/managed-session.d.ts +177 -0
  267. package/dist/hosts/pi/managed-session.js +1557 -0
  268. package/dist/hosts/pi/protocol.js +1 -1
  269. package/dist/hosts/pi/query-result.js +1 -1
  270. package/dist/hosts/pi/resume-capability.d.ts +41 -0
  271. package/dist/hosts/pi/resume-capability.js +33 -0
  272. package/dist/hosts/pi/rpc.d.ts +182 -134
  273. package/dist/hosts/pi/rpc.js +230 -37
  274. package/dist/hosts/pilot.d.ts +90 -67
  275. package/dist/hosts/pilot.js +5 -1
  276. package/dist/hosts/version.d.ts +3 -0
  277. package/dist/hosts/version.js +18 -0
  278. package/dist/index.d.ts +0 -1
  279. package/dist/index.js +0 -1
  280. package/dist/infra/bounded-file.d.ts +19 -0
  281. package/dist/infra/bounded-file.js +66 -0
  282. package/dist/infra/fs.js +10 -2
  283. package/dist/infra/git.d.ts +29 -0
  284. package/dist/infra/git.js +45 -9
  285. package/dist/infra/json-property.d.ts +2 -0
  286. package/dist/infra/json-property.js +69 -0
  287. package/dist/infra/json.d.ts +4 -0
  288. package/dist/infra/json.js +24 -0
  289. package/dist/infra/owned-process-group.js +1 -1
  290. package/dist/infra/private-lock.d.ts +16 -0
  291. package/dist/infra/private-lock.js +148 -0
  292. package/dist/infra/private-state.d.ts +7 -0
  293. package/dist/infra/private-state.js +146 -0
  294. package/dist/infra/process-identity.d.ts +12 -0
  295. package/dist/infra/process-identity.js +142 -0
  296. package/dist/infra/validation.d.ts +5 -0
  297. package/dist/infra/validation.js +15 -0
  298. package/dist/init.d.ts +1 -0
  299. package/dist/init.js +6 -0
  300. package/dist/install/apply.d.ts +9 -1
  301. package/dist/install/apply.js +176 -12
  302. package/dist/install/dependencies.d.ts +38 -0
  303. package/dist/install/dependencies.js +282 -0
  304. package/dist/install/ownership.js +30 -1
  305. package/dist/install/references.d.ts +31 -0
  306. package/dist/install/references.js +208 -0
  307. package/dist/install/repair.d.ts +37 -0
  308. package/dist/install/repair.js +798 -0
  309. package/dist/install/reset-local.d.ts +16 -0
  310. package/dist/install/reset-local.js +304 -0
  311. package/dist/install/rollback.d.ts +3 -0
  312. package/dist/install/rollback.js +9 -3
  313. package/dist/install/runtime.d.ts +10 -6
  314. package/dist/install/runtime.js +299 -59
  315. package/dist/install/source-fingerprint.d.ts +2 -0
  316. package/dist/install/source-fingerprint.js +103 -0
  317. package/dist/knowledge/catalog.d.ts +1 -0
  318. package/dist/knowledge/catalog.js +143 -10
  319. package/dist/knowledge/journal.js +17 -7
  320. package/dist/knowledge/paths.js +2 -1
  321. package/dist/knowledge/refs.js +4 -0
  322. package/dist/knowledge/register-batch.d.ts +4 -0
  323. package/dist/knowledge/register-batch.js +225 -0
  324. package/dist/knowledge/relocate.d.ts +5 -0
  325. package/dist/knowledge/relocate.js +92 -0
  326. package/dist/knowledge/scan.js +103 -47
  327. package/dist/knowledge/service.d.ts +3 -0
  328. package/dist/knowledge/service.js +33 -1
  329. package/dist/knowledge/write.d.ts +4 -1
  330. package/dist/knowledge/write.js +1 -1
  331. package/dist/mcp/server.d.ts +4 -2
  332. package/dist/mcp/server.js +87 -136
  333. package/dist/schemas/collaboration-state-validation.d.ts +6 -0
  334. package/dist/schemas/collaboration-state-validation.js +342 -0
  335. package/dist/schemas/collaboration-state.d.ts +436 -0
  336. package/dist/schemas/collaboration-state.js +1 -0
  337. package/dist/schemas/collaboration.d.ts +335 -0
  338. package/dist/schemas/collaboration.js +272 -0
  339. package/dist/schemas/continuity.d.ts +8 -0
  340. package/dist/schemas/continuity.js +13 -3
  341. package/dist/schemas/doctor.d.ts +1 -0
  342. package/dist/schemas/doctor.js +1 -0
  343. package/dist/schemas/document.d.ts +61 -0
  344. package/dist/schemas/document.js +9 -0
  345. package/dist/schemas/errors.d.ts +1 -0
  346. package/dist/schemas/errors.js +1 -0
  347. package/dist/schemas/host.d.ts +24 -0
  348. package/dist/schemas/host.js +19 -0
  349. package/dist/schemas/install.d.ts +8 -2
  350. package/dist/schemas/install.js +11 -1
  351. package/dist/schemas/managed-pi-execution.d.ts +16 -0
  352. package/dist/schemas/managed-pi-execution.js +2 -0
  353. package/dist/schemas/outcome.d.ts +9 -5
  354. package/dist/workspace/config-file.js +1 -3
  355. package/dist/workspace/documents.js +12 -2
  356. package/dist/workspace/repositories.d.ts +7 -0
  357. package/dist/workspace/repositories.js +14 -5
  358. package/package.json +37 -35
  359. package/skills/pappra/SKILL.md +56 -7
  360. package/skills/pappra/references/collaboration.md +646 -0
  361. package/skills/pappra/references/environment.md +367 -0
  362. package/skills/pappra/references/hosts.md +20 -0
  363. package/skills/pappra/references/operations.md +36 -5
  364. package/dist/app/collab-from.d.ts +0 -35
  365. package/dist/app/collab-from.js +0 -84
@@ -0,0 +1,339 @@
1
+ import path from 'node:path';
2
+ import { object as isRecord } from '../infra/validation.js';
3
+ import { canonicalJson } from '../collab/envelope.js';
4
+ import { MANAGED_PI_EXECUTION_SCOPE_SCHEMA, } from '../schemas/managed-pi-execution.js';
5
+ import { readBoundedFile } from './bounded-file.js';
6
+ import { digestText, isDigest, isNonNegativeInt, isPositiveInt, isSafeId, isText, safePathEqual, sameIdentity, } from './collab-session-transition-validation.js';
7
+ export const COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA = 'pappra/collaboration-session-transition-request/1';
8
+ const MAX_REQUEST_BYTES = 64 * 1024;
9
+ function hasOnlyKeys(value, keys) {
10
+ const allowed = new Set(keys);
11
+ return Object.keys(value).every((key) => allowed.has(key));
12
+ }
13
+ /**
14
+ * The immutable digest deliberately excludes `evidence`: adding an ACK or a
15
+ * first-work REPORT pointer must not change a request's identity.
16
+ */
17
+ export function immutableDigest(request) {
18
+ return digestText(canonicalJson({
19
+ schema: request.schema,
20
+ task_root: request.task_root,
21
+ transition_id: request.transition_id,
22
+ intent: request.intent,
23
+ bundle: request.bundle,
24
+ bootstrap_request: request.bootstrap_request,
25
+ archive_mode: request.archive_mode,
26
+ ...(request.managed_execution_scope === undefined
27
+ ? {}
28
+ : { managed_execution_scope: request.managed_execution_scope }),
29
+ }));
30
+ }
31
+ function parseIdentity(value) {
32
+ if (!isRecord(value) ||
33
+ !hasOnlyKeys(value, ['agent_id', 'session_id', 'harness', 'cwd']))
34
+ return null;
35
+ if (!isText(value['agent_id'], 128) || !isText(value['session_id'], 256))
36
+ return null;
37
+ if (value['harness'] !== 'pi')
38
+ return null;
39
+ if (!isText(value['cwd'], 4096) || !path.isAbsolute(value['cwd']))
40
+ return null;
41
+ return {
42
+ agent_id: value['agent_id'],
43
+ session_id: value['session_id'],
44
+ harness: 'pi',
45
+ cwd: value['cwd'],
46
+ };
47
+ }
48
+ function parseIntent(value) {
49
+ if (!isRecord(value) ||
50
+ !hasOnlyKeys(value, [
51
+ 'intent_id',
52
+ 'generation',
53
+ 'handoff_id',
54
+ 'subtask_id',
55
+ 'attempt',
56
+ 'input_revision',
57
+ 'from',
58
+ 'to',
59
+ 'claims',
60
+ 'coordinator_epoch',
61
+ ]))
62
+ return null;
63
+ const from = parseIdentity(value['from']);
64
+ const to = parseIdentity(value['to']);
65
+ const claims = value['claims'];
66
+ if (!isSafeId(value['intent_id']) ||
67
+ !isPositiveInt(value['generation']) ||
68
+ !isSafeId(value['handoff_id']) ||
69
+ !isSafeId(value['subtask_id']) ||
70
+ !isPositiveInt(value['attempt']) ||
71
+ !isDigest(value['input_revision']) ||
72
+ from === null ||
73
+ to === null ||
74
+ !isPositiveInt(value['coordinator_epoch']) ||
75
+ !Array.isArray(claims) ||
76
+ claims.length === 0 ||
77
+ claims.length > 64 ||
78
+ sameIdentity(from, to))
79
+ return null;
80
+ const parsedClaims = [];
81
+ const seen = new Set();
82
+ for (const claim of claims) {
83
+ if (!isRecord(claim) ||
84
+ !hasOnlyKeys(claim, ['claim_id', 'resource_epoch']) ||
85
+ !isSafeId(claim['claim_id']) ||
86
+ !isNonNegativeInt(claim['resource_epoch']) ||
87
+ seen.has(claim['claim_id']))
88
+ return null;
89
+ seen.add(claim['claim_id']);
90
+ parsedClaims.push({
91
+ claim_id: claim['claim_id'],
92
+ resource_epoch: claim['resource_epoch'],
93
+ });
94
+ }
95
+ return {
96
+ intent_id: value['intent_id'],
97
+ generation: value['generation'],
98
+ handoff_id: value['handoff_id'],
99
+ subtask_id: value['subtask_id'],
100
+ attempt: value['attempt'],
101
+ input_revision: value['input_revision'],
102
+ from,
103
+ to,
104
+ claims: parsedClaims,
105
+ coordinator_epoch: value['coordinator_epoch'],
106
+ };
107
+ }
108
+ function parseManagedPiExecutionScope(value) {
109
+ if (!isRecord(value) ||
110
+ !hasOnlyKeys(value, [
111
+ 'schema',
112
+ 'task_id',
113
+ 'task_root',
114
+ 'session_id',
115
+ 'cwd',
116
+ 'subtask_id',
117
+ 'attempt',
118
+ 'owner_epoch',
119
+ 'claim_epochs',
120
+ ]) ||
121
+ value['schema'] !== MANAGED_PI_EXECUTION_SCOPE_SCHEMA ||
122
+ !isSafeId(value['task_id']) ||
123
+ !isText(value['task_root'], 4096) ||
124
+ !path.isAbsolute(value['task_root']) ||
125
+ !isText(value['session_id'], 256) ||
126
+ !isText(value['cwd'], 4096) ||
127
+ !path.isAbsolute(value['cwd']) ||
128
+ !isSafeId(value['subtask_id']) ||
129
+ !isPositiveInt(value['attempt']) ||
130
+ !isPositiveInt(value['owner_epoch']) ||
131
+ !Array.isArray(value['claim_epochs']) ||
132
+ value['claim_epochs'].length === 0 ||
133
+ value['claim_epochs'].length > 64)
134
+ return null;
135
+ const claim_epochs = [];
136
+ const seen = new Set();
137
+ for (const raw of value['claim_epochs']) {
138
+ if (!isRecord(raw) ||
139
+ !hasOnlyKeys(raw, ['claim_id', 'resource_epoch']) ||
140
+ !isSafeId(raw['claim_id']) ||
141
+ !isPositiveInt(raw['resource_epoch']) ||
142
+ seen.has(raw['claim_id']))
143
+ return null;
144
+ seen.add(raw['claim_id']);
145
+ claim_epochs.push({
146
+ claim_id: raw['claim_id'],
147
+ resource_epoch: raw['resource_epoch'],
148
+ });
149
+ }
150
+ return {
151
+ schema: MANAGED_PI_EXECUTION_SCOPE_SCHEMA,
152
+ task_id: value['task_id'],
153
+ task_root: value['task_root'],
154
+ session_id: value['session_id'],
155
+ cwd: value['cwd'],
156
+ subtask_id: value['subtask_id'],
157
+ attempt: value['attempt'],
158
+ owner_epoch: value['owner_epoch'],
159
+ claim_epochs,
160
+ };
161
+ }
162
+ export function validateSessionTransitionRequest(value) {
163
+ if (!isRecord(value) ||
164
+ !hasOnlyKeys(value, [
165
+ 'schema',
166
+ 'task_root',
167
+ 'transition_id',
168
+ 'intent',
169
+ 'bundle',
170
+ 'bootstrap_request',
171
+ 'evidence',
172
+ 'archive_mode',
173
+ 'managed_execution_scope',
174
+ ]))
175
+ return {
176
+ ok: false,
177
+ code: 'request_shape_invalid',
178
+ message: 'Session-transition request must use only documented fields.',
179
+ };
180
+ if (value['schema'] !== COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA)
181
+ return {
182
+ ok: false,
183
+ code: 'request_schema_invalid',
184
+ message: `request.schema must be ${COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA}.`,
185
+ };
186
+ if (!isText(value['task_root'], 4096) || !path.isAbsolute(value['task_root']))
187
+ return {
188
+ ok: false,
189
+ code: 'task_root_invalid',
190
+ message: 'task_root must be an absolute task-root path.',
191
+ };
192
+ const intent = parseIntent(value['intent']);
193
+ if (intent === null)
194
+ return {
195
+ ok: false,
196
+ code: 'intent_invalid',
197
+ message: 'intent must pin exact source/successor identities, attempt, input, epoch and claims.',
198
+ };
199
+ if (value['transition_id'] !== intent.intent_id)
200
+ return {
201
+ ok: false,
202
+ code: 'transition_id_mismatch',
203
+ message: 'transition_id must equal intent.intent_id.',
204
+ };
205
+ const bundleValue = value['bundle'];
206
+ if (!isRecord(bundleValue) ||
207
+ !hasOnlyKeys(bundleValue, [
208
+ 'root',
209
+ 'continuity_task_id',
210
+ 'bundle_id',
211
+ 'digest',
212
+ ]) ||
213
+ !isText(bundleValue['root'], 4096) ||
214
+ !path.isAbsolute(bundleValue['root']) ||
215
+ !isSafeId(bundleValue['continuity_task_id']) ||
216
+ !isSafeId(bundleValue['bundle_id']) ||
217
+ !isDigest(bundleValue['digest']))
218
+ return {
219
+ ok: false,
220
+ code: 'bundle_invalid',
221
+ message: 'bundle must name one absolute workspace root and exact linked bundle digest.',
222
+ };
223
+ const bootstrapValue = value['bootstrap_request'];
224
+ if (!isRecord(bootstrapValue) ||
225
+ !hasOnlyKeys(bootstrapValue, ['ref', 'digest']) ||
226
+ !isText(bootstrapValue['ref'], 4096) ||
227
+ !path.isAbsolute(bootstrapValue['ref']) ||
228
+ !isDigest(bootstrapValue['digest']))
229
+ return {
230
+ ok: false,
231
+ code: 'bootstrap_request_invalid',
232
+ message: 'bootstrap_request must pin one absolute bounded request file and raw digest.',
233
+ };
234
+ const evidenceValue = value['evidence'];
235
+ if (!isRecord(evidenceValue) ||
236
+ !hasOnlyKeys(evidenceValue, ['ack_message_id', 'first_work_report_id']))
237
+ return {
238
+ ok: false,
239
+ code: 'evidence_invalid',
240
+ message: 'evidence must contain only the optional registered ACK and REPORT ids.',
241
+ };
242
+ const ack = evidenceValue['ack_message_id'];
243
+ const report = evidenceValue['first_work_report_id'];
244
+ if ((ack !== null && !isSafeId(ack)) ||
245
+ (report !== null && !isSafeId(report)))
246
+ return {
247
+ ok: false,
248
+ code: 'evidence_id_invalid',
249
+ message: 'Evidence ids must be null or safe registered message ids.',
250
+ };
251
+ if (value['archive_mode'] !== 'task-retirement')
252
+ return {
253
+ ok: false,
254
+ code: 'archive_mode_invalid',
255
+ message: 'Only the reversible task-retirement marker is supported; native archive is unavailable.',
256
+ };
257
+ const scopeValue = value['managed_execution_scope'];
258
+ const managedExecutionScope = scopeValue === undefined ? null : parseManagedPiExecutionScope(scopeValue);
259
+ if (scopeValue !== undefined &&
260
+ (managedExecutionScope === null ||
261
+ managedExecutionScope.task_id !== path.basename(value['task_root']) ||
262
+ !safePathEqual(managedExecutionScope.task_root, value['task_root']) ||
263
+ managedExecutionScope.session_id !== intent.from.session_id ||
264
+ !safePathEqual(managedExecutionScope.cwd, intent.from.cwd ?? '') ||
265
+ managedExecutionScope.subtask_id !== intent.subtask_id ||
266
+ managedExecutionScope.attempt !== intent.attempt ||
267
+ managedExecutionScope.owner_epoch !== intent.coordinator_epoch ||
268
+ managedExecutionScope.claim_epochs.length !== intent.claims.length ||
269
+ managedExecutionScope.claim_epochs.some((pin, index) => pin.claim_id !== intent.claims[index]?.claim_id ||
270
+ pin.resource_epoch !== intent.claims[index]?.resource_epoch)))
271
+ return {
272
+ ok: false,
273
+ code: 'managed_execution_scope_mismatch',
274
+ message: 'Managed execution scope must exactly match task, source session, attempt, owner epoch and claim pins.',
275
+ };
276
+ return {
277
+ ok: true,
278
+ request: {
279
+ schema: COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA,
280
+ task_root: value['task_root'],
281
+ transition_id: value['transition_id'],
282
+ intent,
283
+ bundle: {
284
+ root: bundleValue['root'],
285
+ continuity_task_id: bundleValue['continuity_task_id'],
286
+ bundle_id: bundleValue['bundle_id'],
287
+ digest: bundleValue['digest'],
288
+ },
289
+ bootstrap_request: {
290
+ ref: bootstrapValue['ref'],
291
+ digest: bootstrapValue['digest'],
292
+ },
293
+ evidence: {
294
+ ack_message_id: typeof ack === 'string' ? ack : null,
295
+ first_work_report_id: typeof report === 'string' ? report : null,
296
+ },
297
+ archive_mode: 'task-retirement',
298
+ ...(managedExecutionScope === null
299
+ ? {}
300
+ : { managed_execution_scope: managedExecutionScope }),
301
+ },
302
+ };
303
+ }
304
+ export function loadSessionTransitionRequest(file) {
305
+ const read = readBoundedFile(file, MAX_REQUEST_BYTES);
306
+ if (!read.ok)
307
+ return {
308
+ ok: false,
309
+ kind: 'invalid',
310
+ code: 'request_unreadable',
311
+ message: `Request must be an absolute bounded regular file (${read.code}).`,
312
+ next_action: 'Pass a regular JSON request file; no task mutation was attempted.',
313
+ };
314
+ let parsed;
315
+ try {
316
+ parsed = JSON.parse(read.text);
317
+ }
318
+ catch {
319
+ return {
320
+ ok: false,
321
+ kind: 'invalid',
322
+ code: 'request_invalid_json',
323
+ message: 'Session-transition request is not valid JSON.',
324
+ next_action: 'Fix the request document and retry explicitly.',
325
+ };
326
+ }
327
+ const validated = validateSessionTransitionRequest(parsed);
328
+ if (!validated.ok)
329
+ return { ...validated, kind: 'invalid', next_action: null };
330
+ return {
331
+ ok: true,
332
+ value: {
333
+ request: validated.request,
334
+ file,
335
+ file_digest: read.digest,
336
+ immutable_digest: immutableDigest(validated.request),
337
+ },
338
+ };
339
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Primitive guards shared by the session-transition request parser and the
3
+ * orchestrator. They live below both so neither has to import the other's
4
+ * parsing module for a predicate.
5
+ */
6
+ export declare function digestText(bytes: string | Buffer): string;
7
+ export declare function isText(value: unknown, max?: number): value is string;
8
+ export declare function isPositiveInt(value: unknown): value is number;
9
+ export declare function isNonNegativeInt(value: unknown): value is number;
10
+ export declare function isDigest(value: unknown): value is string;
11
+ export declare function isSafeId(value: unknown): value is string;
12
+ export declare function sameIdentity(left: {
13
+ readonly agent_id?: string | null;
14
+ readonly session_id?: string | null;
15
+ } | null | undefined, right: {
16
+ readonly agent_id: string;
17
+ readonly session_id: string;
18
+ }): boolean;
19
+ export declare function safePathEqual(left: string, right: string): boolean;
@@ -0,0 +1,44 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ const DIGEST = /^sha256:[0-9a-f]{64}$/;
4
+ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
5
+ /**
6
+ * Primitive guards shared by the session-transition request parser and the
7
+ * orchestrator. They live below both so neither has to import the other's
8
+ * parsing module for a predicate.
9
+ */
10
+ export function digestText(bytes) {
11
+ return `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
12
+ }
13
+ export function isText(value, max = 2048) {
14
+ return (typeof value === 'string' &&
15
+ value.length > 0 &&
16
+ value.length <= max &&
17
+ !value.includes('\u0000'));
18
+ }
19
+ export function isPositiveInt(value) {
20
+ return Number.isSafeInteger(value) && value > 0;
21
+ }
22
+ export function isNonNegativeInt(value) {
23
+ return Number.isSafeInteger(value) && value >= 0;
24
+ }
25
+ export function isDigest(value) {
26
+ return typeof value === 'string' && DIGEST.test(value);
27
+ }
28
+ export function isSafeId(value) {
29
+ return typeof value === 'string' && SAFE_ID.test(value);
30
+ }
31
+ export function sameIdentity(left, right) {
32
+ return (left !== null &&
33
+ left !== undefined &&
34
+ left.agent_id === right.agent_id &&
35
+ left.session_id === right.session_id);
36
+ }
37
+ export function safePathEqual(left, right) {
38
+ try {
39
+ return fs.realpathSync(left) === fs.realpathSync(right);
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
@@ -0,0 +1,181 @@
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 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 { COLLAB_SESSION_TRANSITION_REQUEST_SCHEMA, loadSessionTransitionRequest, validateSessionTransitionRequest, } from './collab-session-transition-request.js';
11
+ export type { LoadedSessionTransitionRequest, SessionTransitionRequest, SessionTransitionRequestResult, } from './collab-session-transition-request.js';
12
+ import { type LoadedSessionTransitionRequest, type SessionTransitionRequest } from './collab-session-transition-request.js';
13
+ export declare const COLLAB_SESSION_TRANSITION_REPORT_SCHEMA = "pappra/collaboration-session-transition/1";
14
+ export declare const SESSION_TRANSITION_ARCHIVE_SCHEMA = "pappra/session-transition-archive/1";
15
+ export interface SessionTransitionRetirementMarker {
16
+ readonly schema: typeof SESSION_TRANSITION_ARCHIVE_SCHEMA;
17
+ readonly mode: 'task-retirement';
18
+ readonly task_id: string;
19
+ readonly task_root: string;
20
+ readonly transition_id: string;
21
+ readonly intent_id: string;
22
+ readonly handoff_id: string;
23
+ readonly generation: number;
24
+ readonly recorded_at: string;
25
+ readonly first_work: {
26
+ readonly message_id: string;
27
+ readonly digest: string;
28
+ };
29
+ readonly successor_route_binding: {
30
+ readonly ref: string;
31
+ readonly digest: string;
32
+ };
33
+ readonly native_archive: 'unavailable';
34
+ readonly original_transcript: 'retained-in-place';
35
+ readonly reversible: true;
36
+ }
37
+ export declare const SESSION_TRANSITION_JOURNAL_KEY = "session_transition_journal";
38
+ export type SessionTransitionAction = 'plan' | 'apply';
39
+ export type SessionTransitionStatus = 'planned' | 'progressed' | 'waiting' | 'needs_input' | 'reconcile_required' | 'unknown' | 'invalid';
40
+ 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';
41
+ export declare const MANAGED_PI_SCOPED_PROOF_ADAPTER_ID = "pappra/managed-pi-session-transition-host/2";
42
+ export declare const MANAGED_PI_SCOPED_RECEIPT_SCHEMA = "pappra/session-transition-quiescence-receipt/2";
43
+ export interface SessionTransitionQuiescenceProof {
44
+ readonly adapter_id: 'pappra/pi-session-transition-host/1' | typeof MANAGED_PI_SCOPED_PROOF_ADAPTER_ID;
45
+ readonly session_id: string;
46
+ readonly cwd: string;
47
+ readonly observed_at: string;
48
+ readonly sequence: number;
49
+ readonly evidence_ref: string;
50
+ readonly freeze_token: FreezeToken;
51
+ readonly inventory: rollover.RolloverInventory;
52
+ readonly scope?: 'pinned_pi_1_4_owned_runtime';
53
+ readonly execution_scope?: ManagedPiExecutionScope;
54
+ readonly execution_scope_digest?: string;
55
+ readonly excluded_scope?: readonly [
56
+ 'arbitrary_external_writers',
57
+ 'unowned_processes_and_descendants'
58
+ ];
59
+ readonly runtime_quiescent?: boolean;
60
+ readonly runtime_blockers?: readonly string[];
61
+ readonly controller_sequence?: number;
62
+ readonly controller_head_digest?: string;
63
+ readonly controller_journal_healthy?: boolean;
64
+ }
65
+ export interface SessionTransitionQuiescenceReceipt {
66
+ readonly schema: 'pappra/session-transition-quiescence-receipt/1' | typeof MANAGED_PI_SCOPED_RECEIPT_SCHEMA;
67
+ readonly adapter_id: 'pappra/pi-session-transition-host/1' | typeof MANAGED_PI_SCOPED_PROOF_ADAPTER_ID;
68
+ readonly session_id: string;
69
+ readonly cwd: string;
70
+ readonly observed_at: string;
71
+ readonly sequence: number;
72
+ readonly evidence_ref: string;
73
+ readonly freeze_token: FreezeToken;
74
+ readonly inventory_digest: string;
75
+ readonly execution_scope_digest?: string;
76
+ }
77
+ export interface SessionTransitionHostObservation {
78
+ readonly session_id: string | null;
79
+ readonly cwd: string | null;
80
+ readonly pane_id: string | null;
81
+ readonly proof_support: 'available' | 'unavailable';
82
+ readonly proof: SessionTransitionQuiescenceProof | null;
83
+ readonly freeze_status: FreezeStatus | null;
84
+ readonly native_facts: NativeFactsSnapshot | null;
85
+ readonly unavailable_code: string | null;
86
+ readonly detail: string | null;
87
+ }
88
+ /**
89
+ * In-process adapter supplied only by the opt-in Pi extension. The installed producer currently
90
+ * cannot return a complete quiescence proof; its production adapter must report that boundary
91
+ * rather than promote idle, settled, or a freeze latch to stop proof.
92
+ */
93
+ export interface SessionTransitionHost {
94
+ readonly id: string;
95
+ observe(): Promise<SessionTransitionHostObservation>;
96
+ freeze(token: FreezeToken): Promise<FreezeOutcome>;
97
+ }
98
+ export interface SessionTransitionBootstrapExecutor {
99
+ plan(request: LoadedVisibleBootstrapRequest): Promise<VisibleBootstrapReport>;
100
+ apply(request: LoadedVisibleBootstrapRequest): Promise<VisibleBootstrapReport>;
101
+ }
102
+ export interface SessionTransitionDependencies {
103
+ readonly host?: SessionTransitionHost;
104
+ readonly bootstrap?: SessionTransitionBootstrapExecutor;
105
+ readonly bootstrapDependencies?: VisibleBootstrapDependencies;
106
+ readonly herdr?: HerdrBootstrapOps;
107
+ readonly clock?: () => number;
108
+ readonly signal?: AbortSignal;
109
+ }
110
+ export interface SessionTransitionStep {
111
+ readonly step: string;
112
+ readonly status: string;
113
+ readonly code: string | null;
114
+ readonly detail: string | null;
115
+ }
116
+ export interface SessionTransitionReport {
117
+ readonly schema: typeof COLLAB_SESSION_TRANSITION_REPORT_SCHEMA;
118
+ readonly action: SessionTransitionAction;
119
+ readonly ok: boolean;
120
+ readonly status: SessionTransitionStatus;
121
+ readonly code: string | null;
122
+ readonly message: string | null;
123
+ readonly next_action: string | null;
124
+ readonly task_id: string | null;
125
+ readonly task_root: string;
126
+ readonly state_revision: number | null;
127
+ readonly transition_id: string;
128
+ readonly cause_ref: string;
129
+ readonly stage: SessionTransitionStage;
130
+ readonly intent: Record<string, unknown> | null;
131
+ readonly handoff: Record<string, unknown> | null;
132
+ readonly rollover: RolloverReport | null;
133
+ readonly bootstrap: VisibleBootstrapReport | null;
134
+ readonly receiver_ack: Record<string, unknown> | null;
135
+ readonly transfer: Record<string, unknown> | null;
136
+ readonly first_work: Record<string, unknown> | null;
137
+ readonly route_transfer: Record<string, unknown> | null;
138
+ readonly archive: Record<string, unknown> | null;
139
+ readonly host: Record<string, unknown> | null;
140
+ readonly steps: readonly SessionTransitionStep[];
141
+ readonly capabilities: {
142
+ readonly record_reducer: 'available';
143
+ readonly bootstrap: 'available';
144
+ readonly pi_host_extension: 'available' | 'not_loaded';
145
+ readonly supported_quiescence: 'available' | 'unavailable' | 'unknown';
146
+ readonly native_session_archive: 'unavailable';
147
+ readonly task_retirement_archive: 'available';
148
+ readonly task_route_transfer: 'available';
149
+ readonly notification_route_exclusion: 'active' | 'pending' | 'excluded' | 'unknown';
150
+ };
151
+ readonly limits: readonly string[];
152
+ }
153
+ export interface SessionTransitionEffectReceipt {
154
+ readonly state: 'pending' | 'completed' | 'unknown' | 'failed';
155
+ readonly intent_at: string;
156
+ readonly outcome_at?: string;
157
+ readonly code?: string;
158
+ readonly digest?: string;
159
+ readonly ref?: string;
160
+ }
161
+ export interface SessionTransitionJournalEntry {
162
+ readonly transition_id: string;
163
+ readonly request_digest: string;
164
+ readonly bootstrap_request_digest: string;
165
+ readonly created_at: string;
166
+ readonly updated_at: string;
167
+ readonly effects: Readonly<Record<string, SessionTransitionEffectReceipt>>;
168
+ readonly route_binding_ref?: string | null;
169
+ readonly route_binding_digest?: string | null;
170
+ readonly archive_ref?: string | null;
171
+ readonly archive_digest?: string | null;
172
+ readonly source_quiescence_receipt?: SessionTransitionQuiescenceReceipt;
173
+ readonly transfer_quiescence_receipt?: SessionTransitionQuiescenceReceipt;
174
+ }
175
+ export interface SessionTransitionJournal {
176
+ readonly schema: 'pappra/session-transition-journal/1';
177
+ readonly entries: readonly SessionTransitionJournalEntry[];
178
+ }
179
+ export type SessionTransitionEffectName = 'source-freeze' | 'successor-route-binding' | 'task-retirement-marker';
180
+ export declare function planSessionTransition(input: LoadedSessionTransitionRequest | SessionTransitionRequest, dependencies?: SessionTransitionDependencies): Promise<SessionTransitionReport>;
181
+ export declare function applySessionTransition(input: LoadedSessionTransitionRequest | SessionTransitionRequest, dependencies?: SessionTransitionDependencies): Promise<SessionTransitionReport>;