@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
@@ -1,14 +1,17 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { mkdir, open, unlink } from 'node:fs/promises';
2
+ import { mkdir, unlink } from 'node:fs/promises';
3
+ import { ensurePrivateState } from '../infra/private-state.js';
4
+ import { publishPrivateLock } from '../infra/private-lock.js';
5
+ import { captureProcessIdentity } from '../infra/process-identity.js';
3
6
  import { isAbsolute, join, resolve } from 'node:path';
4
7
  import { createDiagnostic } from '../schemas/diagnostics.js';
5
8
  import { diagnosticCodes } from '../schemas/errors.js';
6
9
  import { checkpointPointerSchema, checkpointSchema, resumePacketSchema, taskContextSchema, } from '../schemas/continuity.js';
7
10
  import { errorMessage, } from '../schemas/outcome.js';
8
11
  import { isPathInside } from '../schemas/paths.js';
9
- import { isTaskRecord } from '../collab/validation.js';
12
+ import { isTaskRecord } from '../schemas/collaboration-state-validation.js';
10
13
  import { observePath, readFileBounded, readTextFileBounded, sha256Digest, } from '../infra/fs.js';
11
- import { loadContinuityWorkspace, snapshotRepository, } from './context.js';
14
+ import { loadContinuityWorkspace, repositoryIdentities, snapshotRepository, } from './context.js';
12
15
  import { continuityTaskPaths, ensureContinuityBoundary, ensurePrivateTaskBoundary, readArtifactPath, readContinuityBytes, replaceContinuityBytesIfDigest, writeContinuityBytes, } from './paths.js';
13
16
  const MAX_ARTIFACT_BYTES = 8 * 1024 * 1024;
14
17
  const MAX_RECORD_BYTES = 8 * 1024 * 1024;
@@ -140,6 +143,9 @@ async function acquireTaskLock(root, taskId) {
140
143
  if (!boundary.ok) {
141
144
  return { ok: false, path: paths.lockPath, message: boundary.message };
142
145
  }
146
+ const privateState = await ensurePrivateState(root);
147
+ if (!privateState.ok)
148
+ return { ok: false, path: paths.lockPath, message: privateState.message };
143
149
  try {
144
150
  await mkdir(paths.taskDir, { recursive: true, mode: 0o700 });
145
151
  }
@@ -151,17 +157,15 @@ async function acquireTaskLock(root, taskId) {
151
157
  };
152
158
  }
153
159
  const token = randomUUID();
154
- let handle;
155
160
  try {
156
- handle = await open(paths.lockPath, 'wx', 0o600);
157
- await handle.writeFile(Buffer.from(`${JSON.stringify({ token, pid: process.pid, createdAt: new Date().toISOString() })}\n`));
158
- await handle.sync();
159
- await handle.close();
160
- handle = undefined;
161
+ await publishPrivateLock(paths.lockPath, Buffer.from(`${JSON.stringify({ token, pid: process.pid, process_identity: captureProcessIdentity() ?? undefined, createdAt: new Date().toISOString() })}\n`), async () => {
162
+ const current = await ensurePrivateTaskBoundary(root, taskId, paths.lockPath);
163
+ if (!current.ok)
164
+ throw new Error(current.message);
165
+ });
161
166
  return { ok: true, path: paths.lockPath, token };
162
167
  }
163
168
  catch (error) {
164
- await handle?.close().catch(() => undefined);
165
169
  return {
166
170
  ok: false,
167
171
  path: paths.lockPath,
@@ -461,6 +465,25 @@ function boundedArray(values) {
461
465
  ? { values: values.slice(0, 16), truncated: true }
462
466
  : { values: [...values], truncated: false };
463
467
  }
468
+ function boundedCoverageIds(values) {
469
+ const unique = [...new Set(values)].sort();
470
+ const shown = unique
471
+ .slice(0, 8)
472
+ .map((value) => (value.length > 200 ? `${value.slice(0, 197)}...` : value));
473
+ const text = `${shown.join(', ')}${unique.length > shown.length ? `, ... (${unique.length - shown.length} more)` : ''}`;
474
+ return text.length > 900 ? `${text.slice(0, 897)}...` : text;
475
+ }
476
+ function repositoryCoverageLimitations(workspace) {
477
+ const limitations = [];
478
+ if (workspace.unresolvedRepositories.length > 0) {
479
+ const entries = workspace.unresolvedRepositories.map((entry) => `${entry.id} (${entry.configuredPath})`);
480
+ limitations.push(`Repository coverage incomplete: ${entries.length} configured repositories unresolved: ${boundedCoverageIds(entries)}.`);
481
+ }
482
+ if (workspace.discoveryTruncated) {
483
+ limitations.push('Repository discovery was truncated; configured/resolved coverage is incomplete.');
484
+ }
485
+ return limitations;
486
+ }
464
487
  export class CheckpointService {
465
488
  root;
466
489
  #options;
@@ -513,6 +536,20 @@ export class CheckpointService {
513
536
  };
514
537
  }
515
538
  const paths = continuityTaskPaths(workspace.root, input.taskId);
539
+ if (workspace.repositories.length > 64) {
540
+ const released = await releaseTaskLock(lock.path, lock.token);
541
+ return {
542
+ ok: false,
543
+ status: 'failed',
544
+ checkpoint: null,
545
+ checkpointPath: null,
546
+ latestPath: paths.latestPath,
547
+ diagnostics: [
548
+ diag(diagnosticCodes.document_record_invalid, `Repository coverage has ${workspace.repositories.length} resolved entries; the checkpoint schema supports at most 64. No checkpoint pointer was advanced.`, paths.contextPath, 'Reduce the configured/resolved repository set or declare a later coverage scope; semantic context was not dropped silently.'),
549
+ ],
550
+ residualPaths: released.ok ? [] : [lock.path],
551
+ };
552
+ }
516
553
  const now = new Date().toISOString();
517
554
  let checkpointPath = null;
518
555
  let result;
@@ -602,8 +639,9 @@ export class CheckpointService {
602
639
  }
603
640
  if (result === undefined) {
604
641
  const observedRepositories = [];
642
+ const identities = repositoryIdentities(workspace.repositories, workspace.config.repositories.map((repository) => repository.id));
605
643
  for (const [index, repository,] of workspace.repositories.entries()) {
606
- const snapshot = await snapshotRepository(workspace, repository, index);
644
+ const snapshot = await snapshotRepository(workspace, repository, index, identities[index]);
607
645
  if (snapshot.patchBytes !== null &&
608
646
  snapshot.record.patchDigest !== null) {
609
647
  const patch = await writePrivatePatch(workspace, input.taskId, snapshot.patchBytes, snapshot.record.patchDigest);
@@ -643,7 +681,15 @@ export class CheckpointService {
643
681
  ...(input.attempted ?? []),
644
682
  ...(input.nextActions ?? []),
645
683
  ].length > 0;
646
- const contextCompleteness = semanticPresent && input.contextCompleteness !== 'partial'
684
+ const coverageLimitations = repositoryCoverageLimitations(workspace);
685
+ const coverageIncomplete = coverageLimitations.length > 0;
686
+ const combinedLimitations = [
687
+ ...(input.limitations ?? []),
688
+ ...coverageLimitations,
689
+ ];
690
+ const contextCompleteness = semanticPresent &&
691
+ input.contextCompleteness !== 'partial' &&
692
+ !coverageIncomplete
647
693
  ? 'complete'
648
694
  : 'partial';
649
695
  if (!semanticPresent) {
@@ -652,6 +698,10 @@ export class CheckpointService {
652
698
  : 'Checkpoint has no semantic decisions, attempted work or next actions; stored as partial.', continuityTaskPaths(workspace.root, input.taskId)
653
699
  .contextPath, 'Add an explicit semantic summary before claiming complete recovery context.'));
654
700
  }
701
+ if (coverageIncomplete) {
702
+ saveDiagnostics.push(diag(diagnosticCodes.document_write_partial, `Checkpoint capture has incomplete repository coverage: ${boundedCoverageIds(workspace.unresolvedRepositories.map((entry) => `${entry.id} (${entry.configuredPath})`))}${workspace.discoveryTruncated ? '; discovery was truncated' : ''}.`, continuityTaskPaths(workspace.root, input.taskId)
703
+ .contextPath, 'Inspect configured repositories; the checkpoint is partial and does not claim complete coverage.'));
704
+ }
655
705
  const checkpoint = {
656
706
  schema: 'pappra/checkpoint/1',
657
707
  checkpointId,
@@ -669,7 +719,7 @@ export class CheckpointService {
669
719
  decisions: [...(input.decisions ?? [])],
670
720
  attempted: [...(input.attempted ?? [])],
671
721
  nextActions: [...(input.nextActions ?? [])],
672
- limitations: [...(input.limitations ?? [])],
722
+ limitations: combinedLimitations,
673
723
  repositories: observedRepositories,
674
724
  artifacts: artifacts.artifacts,
675
725
  validations: (input.validations ?? []).map((validation) => ({
@@ -978,10 +1028,30 @@ export class CheckpointService {
978
1028
  },
979
1029
  ];
980
1030
  const currentRepositories = new Map();
1031
+ const currentIdentities = repositoryIdentities(workspace.repositories, workspace.config.repositories.map((repository) => repository.id));
981
1032
  for (const [index, repository] of workspace.repositories.entries()) {
982
- const snapshot = await snapshotRepository(workspace, repository, index);
1033
+ const snapshot = await snapshotRepository(workspace, repository, index, currentIdentities[index]);
983
1034
  currentRepositories.set(snapshot.record.repoId, snapshot.record);
984
1035
  }
1036
+ const storedRepositoryIds = new Set(checkpoint.repositories.map((repository) => repository.repoId));
1037
+ const currentOnly = [...currentRepositories.keys()]
1038
+ .filter((repoId) => !storedRepositoryIds.has(repoId))
1039
+ .sort();
1040
+ const unresolvedIds = workspace.unresolvedRepositories.map((entry) => `${entry.id} (${entry.configuredPath})`);
1041
+ const coverageParts = [];
1042
+ if (unresolvedIds.length > 0) {
1043
+ coverageParts.push(`configured but unresolved: ${boundedCoverageIds(unresolvedIds)}`);
1044
+ }
1045
+ if (currentOnly.length > 0) {
1046
+ coverageParts.push(`current-only: ${boundedCoverageIds(currentOnly)}`);
1047
+ }
1048
+ if (workspace.discoveryTruncated) {
1049
+ coverageParts.push('discovery was truncated');
1050
+ }
1051
+ const coverageMessage = coverageParts.length === 0
1052
+ ? null
1053
+ : `Repository coverage is incomplete: ${coverageParts.join('; ')}.`;
1054
+ const coverageUnknown = coverageMessage !== null;
985
1055
  const repositoryDrift = [];
986
1056
  for (const stored of checkpoint.repositories) {
987
1057
  const patchPath = stored.patchDigest === null
@@ -1072,13 +1142,16 @@ export class CheckpointService {
1072
1142
  detail,
1073
1143
  });
1074
1144
  }
1075
- const codeStatus = repositoryDrift.some((entry) => entry.status === 'relocated')
1145
+ const driftStatus = repositoryDrift.some((entry) => entry.status === 'relocated')
1076
1146
  ? 'relocated'
1077
1147
  : repositoryDrift.some((entry) => entry.status === 'changed')
1078
1148
  ? 'changed'
1079
1149
  : repositoryDrift.some((entry) => entry.status === 'missing' || entry.status === 'unknown')
1080
1150
  ? 'unknown'
1081
1151
  : 'unchanged';
1152
+ const codeStatus = coverageUnknown
1153
+ ? 'unknown'
1154
+ : driftStatus;
1082
1155
  const artifactChecks = [];
1083
1156
  for (const artifact of checkpoint.artifacts) {
1084
1157
  const resolved = await readArtifactPath(workspace.root, artifact.path);
@@ -1129,6 +1202,9 @@ export class CheckpointService {
1129
1202
  entry.patchStatus !== 'not-applicable')) {
1130
1203
  pushBlock('private_patch_unavailable', 'A private patch is missing, changed or unsafe; verification is not current.');
1131
1204
  }
1205
+ if (coverageMessage !== null) {
1206
+ pushBlock('repository_coverage_incomplete', coverageMessage);
1207
+ }
1132
1208
  if (repositoryDrift.some((entry) => entry.storedCaptureStatus !== 'complete' ||
1133
1209
  entry.currentCaptureStatus !== 'complete')) {
1134
1210
  pushBlock('snapshot_incomplete', 'Repository capture was partial or unknown; current verification is not established.');
@@ -0,0 +1,24 @@
1
+ export declare const TASK_PIN_SCHEMA = "pappra/task-pin/1";
2
+ export declare const TASK_PREFERENCES_SCHEMA = "pappra/task-preferences/1";
3
+ export interface TaskPin {
4
+ readonly schema: typeof TASK_PIN_SCHEMA;
5
+ readonly taskId: string;
6
+ readonly pinnedAt: string;
7
+ }
8
+ export interface TaskPinFailure {
9
+ readonly ok: false;
10
+ readonly message: string;
11
+ }
12
+ export declare function readTaskPin(root: string): Promise<TaskPin | null>;
13
+ export declare function pinTask(root: string, taskId: string): Promise<TaskPin | TaskPinFailure>;
14
+ export declare function unpinTask(root: string): Promise<{
15
+ ok: true;
16
+ } | TaskPinFailure>;
17
+ /**
18
+ * Stores the personal hook preference in ignored checkout-local state. Shared
19
+ * workspace configuration is read for identity but is never rewritten.
20
+ */
21
+ export declare function setAutoResume(root: string, enabled: boolean): Promise<{
22
+ ok: true;
23
+ } | TaskPinFailure>;
24
+ export declare function readAutoResume(root: string): Promise<boolean>;