@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
@@ -267,11 +267,31 @@ function nextResourceEpoch(records, keys) {
267
267
  }
268
268
  return epoch + 1;
269
269
  }
270
+ /** Check recorded protocol roles; this is not authentication of a same-user caller. */
271
+ export function checkClaimParticipant(record, holder, subtaskId, attempt) {
272
+ if (record.coordinator?.agent_id === holder.agent_id &&
273
+ record.coordinator.session_id === holder.session_id)
274
+ return { ok: true };
275
+ if (subtaskId === null || attempt === null)
276
+ return { ok: false, reason: 'assigned_holder_required' };
277
+ const assigned = record.attempts.find((item) => item.subtask_id === subtaskId && item.attempt === attempt);
278
+ if (!assigned ||
279
+ assigned.assignee.agent_id !== holder.agent_id ||
280
+ assigned.assignee.session_id !== holder.session_id)
281
+ return { ok: false, reason: 'holder_assignment_mismatch' };
282
+ if (!['assigned', 'accepted', 'running'].includes(assigned.state))
283
+ return { ok: false, reason: 'holder_attempt_not_active' };
284
+ if (record.dispatch_frozen)
285
+ return { ok: false, reason: 'dispatch_frozen' };
286
+ return { ok: true };
287
+ }
270
288
  /**
271
289
  * Claim resources for one task. The domain lock serialises the decision so two tasks
272
290
  * cannot both observe an empty domain and then claim the same path.
291
+ * Trusted internal preparation may claim for an assignee before ASSIGN is recorded;
292
+ * public request adapters must enable requireAssignedHolder.
273
293
  */
274
- export function claimResources(taskRoot, { resources, access = 'write', holder, waitMs = 5000, clock = Date.now(), includeSharedGit = false, note = null, subtaskId = null, attempt = null, }) {
294
+ export function claimResources(taskRoot, { resources, access = 'write', holder, waitMs = 5000, clock = Date.now(), includeSharedGit = false, note = null, subtaskId = null, attempt = null, requireAssignedHolder = false, }) {
275
295
  const record = readRecord(taskRoot);
276
296
  if (!record)
277
297
  return { ok: false, reason: 'not_initialised' };
@@ -279,6 +299,11 @@ export function claimResources(taskRoot, { resources, access = 'write', holder,
279
299
  return { ok: false, reason: 'invalid_access' };
280
300
  if (!holder?.agent_id || !holder?.session_id)
281
301
  return { ok: false, reason: 'holder_required' };
302
+ if (requireAssignedHolder) {
303
+ const participant = checkClaimParticipant(record, holder, subtaskId, attempt);
304
+ if (!participant.ok)
305
+ return participant;
306
+ }
282
307
  const domainRoot = record.domain_root;
283
308
  const domainLock = acquireDomainLock(domainRoot, {
284
309
  waitMs,
@@ -339,6 +364,11 @@ export function claimResources(taskRoot, { resources, access = 'write', holder,
339
364
  waitMs,
340
365
  clock,
341
366
  apply: (current) => {
367
+ if (requireAssignedHolder) {
368
+ const participant = checkClaimParticipant(current, holder, subtaskId, attempt);
369
+ if (!participant.ok)
370
+ return participant;
371
+ }
342
372
  const fresh = scanConflicts([
343
373
  current,
344
374
  ...records.filter((item) => item.task_id !== current.task_id),
@@ -383,11 +413,13 @@ function claimIdDigest(identity) {
383
413
  .slice(0, 32);
384
414
  }
385
415
  export function releaseClaim(taskRoot, { claimId, holder, reason, clock = Date.now(), }) {
416
+ if (!holder?.agent_id || !holder?.session_id)
417
+ return { ok: false, reason: 'holder_required' };
386
418
  const record = readRecord(taskRoot);
387
419
  if (!record)
388
420
  return { ok: false, reason: 'not_initialised' };
389
421
  const outcome = transact(taskRoot, {
390
- actor: holder?.agent_id ?? 'unattributed',
422
+ actor: holder.agent_id,
391
423
  purpose: 'release',
392
424
  clock,
393
425
  apply: (current) => {
@@ -410,9 +442,8 @@ export function releaseClaim(taskRoot, { claimId, holder, reason, clock = Date.n
410
442
  const claim = matches[0];
411
443
  if (claim.released_at)
412
444
  return { ok: false, reason: 'already_released' };
413
- if (holder &&
414
- (claim.holder?.agent_id !== holder.agent_id ||
415
- claim.holder?.session_id !== holder.session_id)) {
445
+ if (claim.holder?.agent_id !== holder.agent_id ||
446
+ claim.holder?.session_id !== holder.session_id) {
416
447
  return {
417
448
  ok: false,
418
449
  reason: 'holder_mismatch',
@@ -426,7 +457,7 @@ export function releaseClaim(taskRoot, { claimId, holder, reason, clock = Date.n
426
457
  detail: 'a cancel request does not prove the holder stopped',
427
458
  };
428
459
  claim.released_at = nowIso(clock);
429
- claim.released_by = holder?.agent_id ?? 'unattributed';
460
+ claim.released_by = holder.agent_id;
430
461
  claim.release_reason = reason ?? null;
431
462
  return {
432
463
  record: current,
@@ -0,0 +1,311 @@
1
+ import type { Identity, TaskRecord } from './types.js';
2
+ /**
3
+ * Bounded, record-level writer rollover correlation.
4
+ *
5
+ * This module only reduces the existing task record: handoff state and claims stay
6
+ * authoritative, and no second authority store, filesystem access, native control or
7
+ * continuity import is introduced. An intent pins the immutable inputs of one
8
+ * writer-to-writer transfer, including the confirmed source native identity; confirmation
9
+ * and first-work evidence must be stored, digest-verified protocol messages correlated to
10
+ * that intent. A caller-supplied object is never treated as authenticated native proof.
11
+ */
12
+ export declare const ROLLOVER_INTENT_SCHEMA = "pappra/collab-rollover-intent/1";
13
+ export declare const ROLLOVER_SUCCESSION_SCHEMA = "pappra/collab-succession/1";
14
+ export interface RolloverClaimReference {
15
+ readonly claim_id: string;
16
+ readonly resource_epoch: number;
17
+ }
18
+ export interface RolloverBundleReference {
19
+ readonly ref: string;
20
+ readonly digest: string;
21
+ }
22
+ /** The native session identity of one writer; never inferred from another pointer. */
23
+ export interface RolloverNativeIdentity {
24
+ readonly agent_id: string | null;
25
+ readonly runner: string | null;
26
+ readonly session_id: string | null;
27
+ readonly run_id: string | null;
28
+ readonly mission_id: string | null;
29
+ }
30
+ export interface RolloverNativeBindingInput extends RolloverNativeIdentity {
31
+ readonly evidence_ref: string;
32
+ readonly observed_at?: string | null;
33
+ }
34
+ export interface RolloverTransferBoundary {
35
+ /** Message-application position at completion; never a sender timestamp. */
36
+ readonly message_count: number;
37
+ readonly state_revision: number;
38
+ readonly at: string;
39
+ }
40
+ /** Explicit quiescence inventory. Unknown or partial completeness never authorizes transfer. */
41
+ export interface RolloverInventory {
42
+ readonly completeness: 'complete' | 'partial' | 'unknown';
43
+ readonly inflight: readonly unknown[];
44
+ readonly pending_approvals: readonly unknown[];
45
+ /** Required: absent message completeness can never be treated as "none". */
46
+ readonly pending_messages?: readonly unknown[];
47
+ /** Captured partial outputs; part of the pinned inventory identity. */
48
+ readonly partial_outputs?: readonly unknown[];
49
+ }
50
+ export interface CreateRolloverIntentInput {
51
+ readonly intent_id: string;
52
+ readonly generation: number;
53
+ readonly handoff_id: string;
54
+ readonly subtask_id: string;
55
+ readonly attempt: number;
56
+ readonly input_revision: string;
57
+ readonly from: Identity;
58
+ readonly to: Identity;
59
+ readonly claims: readonly RolloverClaimReference[];
60
+ readonly bundle: RolloverBundleReference;
61
+ readonly coordinator_epoch: number;
62
+ readonly clock?: number;
63
+ }
64
+ export interface RolloverFailure {
65
+ readonly ok: false;
66
+ readonly reason: string;
67
+ readonly [key: string]: unknown;
68
+ }
69
+ /**
70
+ * Records the immutable intent and opens the underlying writer handoff. An exact replay of
71
+ * the same intent inputs returns the existing intent without another mutation.
72
+ */
73
+ export declare function createRolloverIntent(record: TaskRecord, input: CreateRolloverIntentInput): RolloverFailure | {
74
+ ok: false;
75
+ reason: string;
76
+ shared_resources?: never;
77
+ other_handoff?: never;
78
+ other_state?: never;
79
+ expected?: never;
80
+ actual?: never;
81
+ claim_id?: never;
82
+ handoff_id?: never;
83
+ state?: never;
84
+ } | {
85
+ ok: false;
86
+ reason: string;
87
+ other_handoff: string;
88
+ other_state: string;
89
+ shared_resources: string[];
90
+ expected?: never;
91
+ actual?: never;
92
+ claim_id?: never;
93
+ handoff_id?: never;
94
+ state?: never;
95
+ } | {
96
+ shared_resources?: never;
97
+ ok: false;
98
+ reason: string;
99
+ other_handoff: string;
100
+ other_state: string;
101
+ expected?: never;
102
+ actual?: never;
103
+ claim_id?: never;
104
+ handoff_id?: never;
105
+ state?: never;
106
+ } | {
107
+ shared_resources?: never;
108
+ other_handoff?: never;
109
+ other_state?: never;
110
+ ok: false;
111
+ reason: string;
112
+ expected: number | null;
113
+ actual: number;
114
+ claim_id?: never;
115
+ handoff_id?: never;
116
+ state?: never;
117
+ } | {
118
+ shared_resources?: never;
119
+ other_handoff?: never;
120
+ other_state?: never;
121
+ expected?: never;
122
+ actual?: never;
123
+ ok: false;
124
+ reason: string;
125
+ claim_id: string;
126
+ handoff_id?: never;
127
+ state?: never;
128
+ } | {
129
+ ok: true;
130
+ intent: import("./types.js").RolloverIntent;
131
+ handoff_state: string | null;
132
+ replayed: boolean;
133
+ };
134
+ /** Read-only projection of one intent, its handoff progress and any recorded succession. */
135
+ export declare function inspectRolloverIntent(record: TaskRecord, intentId: string): RolloverFailure | {
136
+ ok: true;
137
+ intent: import("./types.js").RolloverIntent;
138
+ handoff_state: string | null;
139
+ ownership: string | null;
140
+ assignee: Identity | null;
141
+ claims: {
142
+ claim_id: string;
143
+ expected_resource_epoch: number;
144
+ holder: Identity | null;
145
+ resource_epoch: number | null;
146
+ released_at: string | null;
147
+ }[];
148
+ transfer_boundary: import("./types.js").RolloverTransferBoundary | null;
149
+ succession: import("./types.js").SuccessionEntry | null;
150
+ routing: string;
151
+ native_archive: string;
152
+ };
153
+ /**
154
+ * Records confirmed quiescence and freezes the transfer inventory. An absent or non-complete
155
+ * inventory, unknown stop evidence, a blocked writer and any drift are refused without
156
+ * mutation; an exact replay of a completed step is a no-op.
157
+ */
158
+ export declare function prepareRolloverTransfer(record: TaskRecord, { intent_id, observation, evidence_ref, inventory, actor, clock, }: {
159
+ intent_id: string;
160
+ observation: string;
161
+ evidence_ref: string | null;
162
+ inventory: RolloverInventory;
163
+ actor?: string;
164
+ clock?: number;
165
+ }): RolloverFailure | {
166
+ ok: false;
167
+ reason: string;
168
+ } | {
169
+ ok: true;
170
+ handoff_state: string;
171
+ replayed: boolean;
172
+ };
173
+ /**
174
+ * Confirms the successor only from a stored, digest-verified ACK envelope that carries the
175
+ * pinned input revision, the current coordinator epoch and recipient, the intent/handoff/
176
+ * generation correlation and this attempt's registered assignment as its bootstrap.
177
+ */
178
+ export declare function confirmRolloverReceiver(record: TaskRecord, { intent_id, message, clock, }: {
179
+ intent_id: string;
180
+ message: unknown;
181
+ clock?: number;
182
+ }): RolloverFailure | {
183
+ state?: never;
184
+ ok: false;
185
+ reason: string;
186
+ from: string;
187
+ to: string;
188
+ expected: string | null | undefined;
189
+ at?: never;
190
+ } | {
191
+ ok: false;
192
+ reason: string;
193
+ type?: never;
194
+ } | {
195
+ ok: false;
196
+ reason: string;
197
+ type: string;
198
+ } | {
199
+ ok: true;
200
+ handoff_state: string;
201
+ replayed: boolean;
202
+ };
203
+ /**
204
+ * Completes the writer transfer: claims move to the successor with a raised resource epoch,
205
+ * the attempt is reassigned and its native identity is rebound explicitly. The coordinator
206
+ * owner epoch is never raised here.
207
+ */
208
+ export declare function completeRolloverTransfer(record: TaskRecord, { intent_id, successor_native, actor, clock, }: {
209
+ intent_id: string;
210
+ successor_native: RolloverNativeBindingInput;
211
+ actor?: string;
212
+ clock?: number;
213
+ }): RolloverFailure | {
214
+ ok: false;
215
+ reason: string;
216
+ native?: never;
217
+ reconciled_uncertainty?: never;
218
+ } | {
219
+ state?: never;
220
+ ok: false;
221
+ reason: string;
222
+ from: string;
223
+ to: string;
224
+ expected: string | null | undefined;
225
+ at?: never;
226
+ } | {
227
+ expected?: never;
228
+ actual?: never;
229
+ ok: false;
230
+ reason: string;
231
+ drift?: never;
232
+ } | {
233
+ expected?: never;
234
+ actual?: never;
235
+ ok: false;
236
+ reason: string;
237
+ drift: ({
238
+ expected?: never;
239
+ actual?: never;
240
+ from?: never;
241
+ claim_id: string;
242
+ reason: string;
243
+ } | {
244
+ from?: never;
245
+ claim_id: string;
246
+ reason: string;
247
+ expected: number | null | undefined;
248
+ actual: number;
249
+ } | {
250
+ from?: never;
251
+ claim_id: string;
252
+ reason: string;
253
+ expected: Identity | null | undefined;
254
+ actual: Identity;
255
+ } | {
256
+ expected?: never;
257
+ claim_id: string;
258
+ reason: string;
259
+ from: Identity;
260
+ actual: Identity;
261
+ })[];
262
+ } | {
263
+ drift?: never;
264
+ ok: false;
265
+ reason: string;
266
+ expected: number;
267
+ actual: number | null;
268
+ } | {
269
+ ok: true;
270
+ handoff_state: string;
271
+ transfer_boundary: import("./types.js").RolloverTransferBoundary;
272
+ replayed: boolean;
273
+ owner_epoch?: never;
274
+ } | {
275
+ ok: true;
276
+ handoff_state: string;
277
+ transfer_boundary: RolloverTransferBoundary;
278
+ owner_epoch: number | null;
279
+ replayed: boolean;
280
+ };
281
+ /**
282
+ * Records the source-session history marker only when a stored, admitted successor REPORT
283
+ * proves first work after the recorded transfer boundary, under the pinned input, current
284
+ * attempt, exact post-transfer claim epochs and the pinned successor native identity.
285
+ */
286
+ export declare function recordRolloverFirstWork(record: TaskRecord, { intent_id, message, clock, }: {
287
+ intent_id: string;
288
+ message: unknown;
289
+ clock?: number;
290
+ }): RolloverFailure | {
291
+ ok: true;
292
+ succession: {
293
+ schema: string;
294
+ intent_id: string;
295
+ handoff_id: string;
296
+ generation: number;
297
+ old_native: RolloverNativeIdentity;
298
+ successor_native: RolloverNativeIdentity;
299
+ archived_at: string;
300
+ history_retained: true;
301
+ routing: 'pending';
302
+ native_archive: 'unavailable';
303
+ proof: {
304
+ message_id: string;
305
+ digest: string;
306
+ };
307
+ };
308
+ replayed: boolean;
309
+ routing: string;
310
+ native_archive: string;
311
+ };