@akagilnc/pi-workflow-roles 0.1.4062 → 0.1.4196

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 (72) hide show
  1. package/dist/acp-host/production-host.js +2075 -1088
  2. package/dist/archivist-record-entry.js +204 -20
  3. package/dist/archivist-record-topology.js +36 -16
  4. package/dist/auditor-dossier-tool.js +2 -1
  5. package/dist/diarist-contracts.js +96 -0
  6. package/dist/doctor-evidence.js +3 -2
  7. package/dist/headless-host/production-host.js +2215 -1228
  8. package/dist/migrate-book-topology.js +278917 -0
  9. package/dist/navigator-public-session.js +22 -25
  10. package/dist/notary-source-run.js +7 -4
  11. package/dist/pi/durable-principal.js +9 -6
  12. package/dist/public-cli/auto-resume.js +2 -5
  13. package/dist/public-cli/diarist-run.js +27 -25
  14. package/dist/public-cli/instruction-seat-run.js +8 -11
  15. package/dist/public-cli/invocation.js +127 -63
  16. package/dist/public-cli/main.js +1507 -645
  17. package/dist/public-cli/option-definitions.js +2 -2
  18. package/dist/public-cli/post-admission.js +47 -12
  19. package/dist/public-cli/run-lifecycle.js +206 -58
  20. package/dist/public-cli/seat-ticket-binding.js +3 -6
  21. package/dist/public-cli/settlement.js +5 -3
  22. package/dist/role-run-placement.js +84 -0
  23. package/dist/role-run-relocation.js +358 -0
  24. package/dist/run-terminal-artifacts.js +2 -1
  25. package/dist/run-ticket-number.js +51 -32
  26. package/dist/sitian-appender.js +11 -26
  27. package/dist/submission-ledger.js +78 -19
  28. package/dist/ticket-provenance.js +3 -1
  29. package/package.json +3 -2
  30. package/scripts/build-package.mjs +34 -2
  31. package/souls/countersign.md +2 -2
  32. package/souls/fixer.md +3 -2
  33. package/src/analyst-ledger.ts +14 -15
  34. package/src/archivist-record-entry.ts +285 -38
  35. package/src/archivist-record-topology.ts +43 -18
  36. package/src/auditor-dossier-tool.ts +2 -1
  37. package/src/book-topology-migration-placement.ts +493 -0
  38. package/src/book-topology-migration.ts +220 -0
  39. package/src/book-topology-migrators-t11.ts +856 -0
  40. package/src/book-topology-mixed-volume-migrators.ts +470 -0
  41. package/src/book-topology-partition-migrators.ts +25 -0
  42. package/src/book-topology-record-class-migrators.ts +779 -0
  43. package/src/book-topology-runs-migrator.ts +244 -0
  44. package/src/diarist-contracts.ts +116 -0
  45. package/src/diarist-role.ts +6 -0
  46. package/src/diarist.ts +2 -0
  47. package/src/doctor-evidence.ts +4 -1
  48. package/src/doctor-role.ts +1 -1
  49. package/src/navigator-public-session.ts +33 -30
  50. package/src/notary-source-run.ts +9 -4
  51. package/src/pi/durable-principal.ts +9 -13
  52. package/src/public-cli/auto-resume.ts +2 -6
  53. package/src/public-cli/countersign-run.ts +182 -32
  54. package/src/public-cli/diarist-run.ts +34 -26
  55. package/src/public-cli/instruction-seat-run.ts +7 -11
  56. package/src/public-cli/invocation.ts +192 -58
  57. package/src/public-cli/option-definitions.ts +2 -2
  58. package/src/public-cli/post-admission.ts +73 -13
  59. package/src/public-cli/run-lifecycle.ts +255 -65
  60. package/src/public-cli/seat-ticket-binding.ts +3 -6
  61. package/src/public-cli/settlement.ts +6 -4
  62. package/src/role-run-placement.ts +128 -0
  63. package/src/role-run-relocation.ts +491 -0
  64. package/src/role-runtime.ts +11 -5
  65. package/src/run-terminal-artifacts.ts +3 -1
  66. package/src/run-ticket-number.ts +80 -20
  67. package/src/sitian-appender.ts +25 -28
  68. package/src/submission-ledger.ts +102 -19
  69. package/src/ticket-provenance.ts +4 -1
  70. package/src/ticket-trajectory.ts +22 -35
  71. package/src/worker-role.ts +4 -4
  72. package/src/worker-submission-gates.ts +6 -6
@@ -145,9 +145,9 @@ function withOnceSuccessfulBeforeDispatch<
145
145
  let succeeded = false;
146
146
  return {
147
147
  ...adapters,
148
- beforeDispatch: async (admitted) => {
148
+ beforeDispatch: async (admitted, lease) => {
149
149
  if (succeeded) return;
150
- await hook(admitted);
150
+ await hook(admitted, lease);
151
151
  succeeded = true;
152
152
  },
153
153
  };
@@ -280,7 +280,13 @@ export type PostAdmissionAdapters<
280
280
  result: RoleTurnResult;
281
281
  sessionFile: string;
282
282
  }) => Promise<RoleTurnKnownFailure | undefined>;
283
- beforeDispatch?: (admitted: A) => Promise<void> | void;
283
+ beforeDispatch?: (admitted: A, lease: RunWriterLease) => Promise<void> | void;
284
+ /**
285
+ * After the host turn settles and before the writer lease is released.
286
+ * Post-turn bind/relocate (e.g. Diarist first assert) must run here so the
287
+ * held lease follows the run directory and failures stay controlled.
288
+ */
289
+ afterDispatch?: (admitted: A, lease: RunWriterLease) => Promise<void> | void;
284
290
  };
285
291
 
286
292
  export type ControlledFailureInput = {
@@ -570,6 +576,60 @@ export async function dispatchPostAdmissionTurn<
570
576
  const deferredPersist = persistRunState ? {} : { needsPersist: true as const };
571
577
  const shouldPresent =
572
578
  adapters.shouldPresentSettled ?? ((terminal: T) => isLawfulTypedTerminalOutcome(terminal.roleOutcome));
579
+ type DispatchOutcome = {
580
+ exitCode: number;
581
+ admitted: A;
582
+ terminal?: T;
583
+ skipAutoResume?: true;
584
+ turnDispatched?: true;
585
+ needsPersist?: true;
586
+ };
587
+ /**
588
+ * Once-only post-host-turn hook (Diarist bind/relocate, etc.) under the still-held
589
+ * writer lease. Every exit after the host turn has started must pass here before
590
+ * lease release — success and failure alike. When a primary failure terminal already
591
+ * exists, keep that cause and leave relocate failure on the shared diagnostic channel.
592
+ */
593
+ let afterDispatchApplied = false;
594
+ const finishAfterTurn = async (result: DispatchOutcome): Promise<DispatchOutcome> => {
595
+ if (adapters.afterDispatch === undefined || afterDispatchApplied) return result;
596
+ afterDispatchApplied = true;
597
+ try {
598
+ await adapters.afterDispatch(admitted, lease);
599
+ return result;
600
+ } catch (error) {
601
+ const primaryFailure =
602
+ result.terminal !== undefined
603
+ && !isLawfulTypedTerminalOutcome(result.terminal.roleOutcome);
604
+ if (primaryFailure) {
605
+ await recordBestEffortPostDispatchDiagnostic(
606
+ admitted,
607
+ env,
608
+ `afterDispatch failed beside primary terminal (best-effort continue): ${describeErrorIdentity(error)}`,
609
+ io,
610
+ );
611
+ return result;
612
+ }
613
+ return {
614
+ ...(await presentControlledFailure(
615
+ admitted,
616
+ {
617
+ timedOut: false,
618
+ code: null,
619
+ stderr: "",
620
+ thrown: error,
621
+ },
622
+ adapters,
623
+ env.principalAuthority,
624
+ io,
625
+ persistRunState,
626
+ )) as { exitCode: number; admitted: A; terminal: T },
627
+ ...(result.turnDispatched === true ? { turnDispatched: true as const } : {}),
628
+ ...(result.skipAutoResume === true ? { skipAutoResume: true as const } : {}),
629
+ ...deferredPersist,
630
+ };
631
+ }
632
+ };
573
633
  try {
574
634
  const missingCredential = missingCredentialPreDispatchFailure(
575
635
  env.model,
@@ -644,7 +704,7 @@ export async function dispatchPostAdmissionTurn<
644
704
  // (#840 父子不层叠).
645
705
  if (adapters.beforeDispatch !== undefined) {
646
706
  try {
647
- await adapters.beforeDispatch(admitted);
707
+ await adapters.beforeDispatch(admitted, lease);
648
708
  } catch (error) {
649
709
  const settled = (await presentControlledFailure(
650
710
  admitted,
@@ -737,7 +797,7 @@ export async function dispatchPostAdmissionTurn<
737
797
  io,
738
798
  persistRunState,
739
799
  );
740
- return { ...settled, turnDispatched: true as const, ...deferredPersist };
800
+ return await finishAfterTurn({ ...settled, turnDispatched: true as const, ...deferredPersist });
741
801
  }
742
802
 
743
803
  // `result.stderr` stays live in memory for the real classification below
@@ -941,7 +1001,7 @@ export async function dispatchPostAdmissionTurn<
941
1001
  io,
942
1002
  persistRunState,
943
1003
  );
944
- return { ...settledFailure, turnDispatched: true as const, ...deferredPersist };
1004
+ return await finishAfterTurn({ ...settledFailure, turnDispatched: true as const, ...deferredPersist });
945
1005
  }
946
1006
  if (settledOutcome !== undefined) {
947
1007
  if (persistRunState) {
@@ -972,12 +1032,12 @@ export async function dispatchPostAdmissionTurn<
972
1032
  io,
973
1033
  persistRunState,
974
1034
  );
975
- return { ...failed, turnDispatched: true as const, ...deferredPersist };
1035
+ return await finishAfterTurn({ ...failed, turnDispatched: true as const, ...deferredPersist });
976
1036
  }
977
1037
  }
978
1038
  // Lawful persist + present is the caller's stop seam (auto-resume loop /
979
1039
  // manual resume), not this retried host-turn function.
980
- return { ...settledOutcome, ...deferredPersist };
1040
+ return await finishAfterTurn({ ...settledOutcome, ...deferredPersist });
981
1041
  }
982
1042
 
983
1043
  // Host/runner true failure coexists with already-recorded payloads — never wash as accepted.
@@ -1013,7 +1073,7 @@ export async function dispatchPostAdmissionTurn<
1013
1073
  io,
1014
1074
  persistRunState,
1015
1075
  );
1016
- return { ...failed, turnDispatched: true as const, ...deferredPersist };
1076
+ return await finishAfterTurn({ ...failed, turnDispatched: true as const, ...deferredPersist });
1017
1077
  }
1018
1078
 
1019
1079
  // Nothing else was wrong, but the durable stderr mirror itself failed to
@@ -1033,7 +1093,7 @@ export async function dispatchPostAdmissionTurn<
1033
1093
  io,
1034
1094
  persistRunState,
1035
1095
  );
1036
- return { ...failed, turnDispatched: true as const, ...deferredPersist };
1096
+ return await finishAfterTurn({ ...failed, turnDispatched: true as const, ...deferredPersist });
1037
1097
  }
1038
1098
 
1039
1099
  const noReceipt = await attachRecordedSubmissions(
@@ -1064,16 +1124,16 @@ export async function dispatchPostAdmissionTurn<
1064
1124
  io,
1065
1125
  persistRunState,
1066
1126
  );
1067
- return { ...failed, turnDispatched: true as const, ...deferredPersist };
1127
+ return await finishAfterTurn({ ...failed, turnDispatched: true as const, ...deferredPersist });
1068
1128
  }
1069
1129
  }
1070
- return {
1130
+ return await finishAfterTurn({
1071
1131
  exitCode: exitCodeForTerminalOutcome(noReceipt.roleOutcome),
1072
1132
  admitted,
1073
1133
  terminal: noReceipt,
1074
1134
  turnDispatched: true as const,
1075
1135
  ...deferredPersist,
1076
- };
1136
+ });
1077
1137
  } finally {
1078
1138
  try {
1079
1139
  await lease.release();