@akagilnc/pi-workflow-roles 0.1.2521 → 0.1.2653-next.71811ca

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 (109) hide show
  1. package/README.md +129 -39
  2. package/README.zh-CN.md +128 -39
  3. package/dist/activation-ledger-topology.js +1 -1
  4. package/dist/archivist-record-entry.js +47 -26
  5. package/dist/auditor-dossier-tool.js +3 -1
  6. package/dist/compliance-transport.js +17 -26
  7. package/dist/doctor-contracts.js +1 -2
  8. package/dist/dossier-resolution.js +4 -8
  9. package/dist/engine-detour-tool.js +33 -8
  10. package/dist/engine-detour.js +1 -0
  11. package/dist/evidence-child-executor.js +277 -424
  12. package/dist/host-contracts.js +22 -0
  13. package/dist/institutional-resolution.js +88 -0
  14. package/dist/merger-contracts.js +1 -2
  15. package/dist/navigator-attendance.js +16 -0
  16. package/dist/notary-contracts.js +2 -3
  17. package/dist/package-contracts/fixer-output.js +1 -2
  18. package/dist/packaged-role-registry.js +102 -9
  19. package/dist/pi/in-process-session.js +671 -0
  20. package/dist/public-cli/config.js +7 -5
  21. package/dist/public-cli/main.js +3767 -4113
  22. package/dist/reviewer-child-executor.js +6 -1
  23. package/dist/session-opening-materials.js +10 -38
  24. package/dist/sitian-appender.js +146 -0
  25. package/dist/sitian-contracts.js +21 -0
  26. package/dist/sitian-facade.js +15 -0
  27. package/dist/sitian-reader.js +52 -0
  28. package/extensions/role-runtime.ts +9 -7
  29. package/package.json +5 -5
  30. package/resources/engines/cursor.md +12 -26
  31. package/resources/engines/hermes.md +2 -23
  32. package/resources/engines/opus.md +1 -16
  33. package/resources/navigator-route-playbook.md +2 -2
  34. package/scripts/build-package.mjs +0 -1
  35. package/souls/quality-law.md +1 -1
  36. package/src/activation-ledger-topology.ts +1 -1
  37. package/src/archivist-record-entry.ts +57 -45
  38. package/src/auditor-dossier-tool.ts +4 -2
  39. package/src/canonical-skill-binding.ts +37 -27
  40. package/src/collector-role.ts +11 -20
  41. package/src/collector-tool-schemas.ts +1 -4
  42. package/src/compliance-transport.ts +19 -44
  43. package/src/doctor-auditor.ts +1 -5
  44. package/src/doctor-contracts.ts +1 -4
  45. package/src/doctor-role.ts +31 -8
  46. package/src/dossier-resolution.ts +8 -8
  47. package/src/engine-detour-tool.ts +48 -19
  48. package/src/engine-detour.ts +3 -0
  49. package/src/evidence-child-executor.ts +277 -485
  50. package/src/factory-board.ts +3 -3
  51. package/src/gatekeeper-role.ts +21 -10
  52. package/src/host-contracts.ts +386 -0
  53. package/src/in-process-session.ts +1 -115
  54. package/src/institutional-resolution.ts +135 -0
  55. package/src/judge-auditor.ts +1 -5
  56. package/src/judge-role.ts +37 -51
  57. package/src/merger-contracts.ts +1 -4
  58. package/src/merger-role.ts +7 -11
  59. package/src/navigator-attendance.ts +20 -1
  60. package/src/notary-contracts.ts +8 -11
  61. package/src/notary-role.ts +7 -23
  62. package/src/notary-source-run.ts +4 -3
  63. package/src/package-contracts/fixer-output.ts +1 -4
  64. package/src/package-resources/method-skill-binding.ts +10 -34
  65. package/src/packaged-role-registry.ts +122 -12
  66. package/src/pi/adapter.ts +192 -0
  67. package/src/pi/durable-principal.ts +98 -0
  68. package/src/pi/in-process-session.ts +819 -0
  69. package/src/pi/known-failure.ts +77 -0
  70. package/src/pi/pi-normalization.ts +284 -0
  71. package/src/pi/role-turn-host.ts +459 -0
  72. package/src/public-cli/auto-resume.ts +42 -44
  73. package/src/public-cli/cli.ts +171 -257
  74. package/src/public-cli/coder-run.ts +115 -433
  75. package/src/public-cli/collector-run.ts +62 -314
  76. package/src/public-cli/config.ts +7 -5
  77. package/src/public-cli/doctor-run.ts +41 -52
  78. package/src/public-cli/fixer-run.ts +122 -427
  79. package/src/public-cli/invocation.ts +287 -96
  80. package/src/public-cli/judge-run.ts +92 -422
  81. package/src/public-cli/merger-run.ts +167 -429
  82. package/src/public-cli/notary-run.ts +41 -47
  83. package/src/public-cli/option-definitions.ts +136 -3
  84. package/src/public-cli/post-admission.ts +497 -0
  85. package/src/public-cli/public-run-credentials.ts +4 -4
  86. package/src/public-cli/reviewer-dispatch-rejection.ts +106 -0
  87. package/src/public-cli/reviewer-run.ts +132 -449
  88. package/src/public-cli/run-lifecycle.ts +339 -327
  89. package/src/public-cli/settlement.ts +251 -134
  90. package/src/public-cli/terminal.ts +3 -9
  91. package/src/public-cli/turn-request.ts +87 -0
  92. package/src/reviewer-child-executor.ts +9 -1
  93. package/src/reviewer-role.ts +11 -20
  94. package/src/role-runtime.ts +129 -78
  95. package/src/session-opening-materials.ts +25 -39
  96. package/src/sitian-appender.ts +171 -0
  97. package/src/sitian-contracts.ts +106 -0
  98. package/src/sitian-facade.ts +18 -0
  99. package/src/sitian-reader.ts +62 -0
  100. package/src/worker-role.ts +42 -40
  101. package/src/worker-submission-gates.ts +33 -0
  102. package/dist/archivist-role-run-coordinates.js +0 -28
  103. package/dist/package-contracts/terminating-infrastructure.js +0 -90
  104. package/resources/engines/sonnet.md +0 -27
  105. package/resources/engines/zcode.md +0 -63
  106. package/src/archivist-role-run-coordinates.ts +0 -45
  107. package/src/package-contracts/terminating-infrastructure.ts +0 -132
  108. package/src/public-cli/explicit-internal.ts +0 -427
  109. package/src/public-cli/one-shot-dispatch.ts +0 -300
@@ -1,3 +1,5 @@
1
+ import type { DurablePrincipalAuthority } from "../host-contracts.ts";
2
+ import { piDurablePrincipalAuthority } from "../pi/durable-principal.ts";
1
3
  /**
2
4
  * Public ak-role CLI dispatcher (roles / config / layered help / Judge run).
3
5
  */
@@ -31,10 +33,14 @@ import {
31
33
  } from "./config.ts";
32
34
  import { CliUsageError } from "./cli-errors.ts";
33
35
  import type { CliIo } from "./cli-io.ts";
36
+ import type { RoleTurnHost } from "../host-contracts.ts";
34
37
  import {
35
- type ExplicitInternalPiRunner,
36
- } from "./explicit-internal.ts";
38
+ createPiRoleTurnHost,
39
+ appendPiSessionCustomEntry,
40
+ } from "../pi/role-turn-host.ts";
37
41
  import {
42
+ observeLaunchedRolePackageIdentity,
43
+ parseAnalystArgv,
38
44
  parseCoderArgv,
39
45
  parseCollectorArgv,
40
46
  parseDoctorArgv,
@@ -43,7 +49,8 @@ import {
43
49
  parseMergerArgv,
44
50
  parseNotaryArgv,
45
51
  parseReviewerArgv,
46
- parseAnalystArgv,
52
+ recordLaunchedPiIdentity,
53
+ recordLaunchedRolePackageIdentity,
47
54
  } from "./invocation.ts";
48
55
  import {
49
56
  createTypedOptionConsumer,
@@ -88,7 +95,7 @@ import type { TerminalResult } from "./terminal.ts";
88
95
  export {
89
96
  buildExplicitInternalActivationArgs,
90
97
  resolveInternalRoleEntrypoint,
91
- } from "./explicit-internal.ts";
98
+ } from "../pi/role-turn-host.ts";
92
99
  export { CliUsageError } from "./cli-errors.ts";
93
100
  export type { CliIo } from "./cli-io.ts";
94
101
 
@@ -162,14 +169,19 @@ function takePublicGlobalFlag(
162
169
 
163
170
  export type CliEnv = {
164
171
  home?: string;
172
+ /** Host durable-principal authority; production uses the Pi adapter. */
173
+ principalAuthority?: DurablePrincipalAuthority;
165
174
  agentDir?: string;
166
175
  /** Process cwd for any Pi subprocess owned by ak-role. */
167
176
  cwd?: string;
168
177
  packageRoot: string;
169
178
  credentials?: CredentialProviders;
170
179
  io?: CliIo;
171
- /** Injectable Pi runner (tests); production resolves `pi` on PATH. */
172
- piRunner?: ExplicitInternalPiRunner;
180
+ /**
181
+ * Injectable host-neutral turn host (tests). Production composes the Pi
182
+ * adapter once per dispatch from packageRoot + seat extraPiArgs/timeout.
183
+ */
184
+ roleTurnHost?: RoleTurnHost;
173
185
  /** Optional caller correlation id (#78 host channel). */
174
186
  correlationId?: string;
175
187
  /** Extra Pi args for Judge runs (tests: faux provider). */
@@ -207,6 +219,116 @@ export type CliEnv = {
207
219
  createRunId?: () => string;
208
220
  };
209
221
 
222
+ /** Compose the Pi turn host for one role dispatch (sole public-cli → pi contact). */
223
+ function resolveRoleTurnHost(
224
+ env: CliEnv,
225
+ options: {
226
+ principalAuthority: DurablePrincipalAuthority;
227
+ extraPiArgs?: readonly string[];
228
+ timeoutMs?: number;
229
+ },
230
+ ): RoleTurnHost {
231
+ if (env.roleTurnHost !== undefined) return env.roleTurnHost;
232
+ return createPiRoleTurnHost({
233
+ packageRoot: env.packageRoot,
234
+ principalAuthority: options.principalAuthority,
235
+ ...(options.extraPiArgs === undefined ? {} : { extraPiArgs: options.extraPiArgs }),
236
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
237
+ recordLaunchedPiIdentity,
238
+ recordLaunchedRolePackageIdentity,
239
+ observeLaunchedRolePackageIdentity,
240
+ });
241
+ }
242
+
243
+ type RoleEnvironmentOptions = {
244
+ role: "judge" | "coder" | "fixer" | "reviewer" | "merger" | "collector" | "doctor" | "notary";
245
+ home: string;
246
+ agentDir: string;
247
+ cwd: string;
248
+ credentials?: CredentialProviders;
249
+ seat: EffectiveSeat;
250
+ config?: PublicCliConfig;
251
+ /**
252
+ * Resume must not inject seat startup/persistent defaults as env.model — those
253
+ * would mask admitted.model restoration (standards-2 second facet). Only an
254
+ * explicit invocation --model (source === "invocation") is forwarded.
255
+ */
256
+ resume?: boolean;
257
+ };
258
+
259
+ function createRoleEnvironment(
260
+ env: CliEnv,
261
+ options: RoleEnvironmentOptions,
262
+ ) {
263
+ const role = options.role;
264
+ const extraPiArgs =
265
+ role === "coder"
266
+ ? env.coderExtraPiArgs
267
+ : role === "fixer"
268
+ ? env.fixerExtraPiArgs
269
+ : role === "reviewer"
270
+ ? env.reviewerExtraPiArgs
271
+ : role === "merger"
272
+ ? env.mergerExtraPiArgs
273
+ : role === "judge"
274
+ ? env.judgeExtraPiArgs
275
+ : role === "collector"
276
+ ? env.collectorExtraPiArgs
277
+ : role === "doctor"
278
+ ? env.doctorExtraPiArgs
279
+ : role === "notary"
280
+ ? env.notaryExtraPiArgs
281
+ : undefined;
282
+ const timeoutMs =
283
+ role === "coder"
284
+ ? env.coderTimeoutMs
285
+ : role === "fixer"
286
+ ? env.fixerTimeoutMs
287
+ : role === "reviewer"
288
+ ? env.reviewerTimeoutMs
289
+ : role === "merger"
290
+ ? env.mergerTimeoutMs
291
+ : role === "judge"
292
+ ? env.judgeTimeoutMs
293
+ : role === "collector"
294
+ ? env.collectorTimeoutMs
295
+ : role === "doctor"
296
+ ? env.doctorTimeoutMs
297
+ : role === "notary"
298
+ ? env.notaryTimeoutMs
299
+ : undefined;
300
+
301
+ // Initial runs take seat.selection from any source (invocation/persistent/startup).
302
+ // Resume only forwards an explicit CLI --model; otherwise env.model stays unset so
303
+ // resolveResumeModel can restore admitted.model (incl. thinking).
304
+ const injectModel =
305
+ options.seat.selection !== undefined &&
306
+ (options.resume !== true || options.seat.source === "invocation");
307
+
308
+ return {
309
+ home: options.home,
310
+ principalAuthority: env.principalAuthority!,
311
+ agentDir: options.agentDir,
312
+ sessionAppender: appendPiSessionCustomEntry,
313
+ packageRoot: env.packageRoot,
314
+ roleTurnHost: resolveRoleTurnHost(env, {
315
+ principalAuthority: env.principalAuthority!,
316
+ ...(extraPiArgs === undefined ? {} : { extraPiArgs }),
317
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
318
+ }),
319
+ cwd: options.cwd,
320
+ ...(options.credentials === undefined ? {} : { credentials: options.credentials }),
321
+ ...(env.correlationId === undefined ? {} : { correlationId: env.correlationId }),
322
+ ...(injectModel ? { model: options.seat.selection } : {}),
323
+ ...projectSeatEngine(options.seat),
324
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
325
+ ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
326
+ ...(options.config?.autoResumeLimit === undefined
327
+ ? {}
328
+ : { autoResumeLimit: options.config.autoResumeLimit }),
329
+ };
330
+ }
331
+
210
332
  export type CliResult = {
211
333
  exitCode: number;
212
334
  /** Settled Terminal when an admitted Role run produced one (programmatic/tests). */
@@ -751,7 +873,11 @@ export async function runAkRole(
751
873
  try {
752
874
  // Select the installed package identity once, before any role-owned Skill,
753
875
  // runtime entry, activation argv, or invocation provenance is derived.
754
- env = { ...env, packageRoot: await realpath(env.packageRoot) };
876
+ env = {
877
+ ...env,
878
+ packageRoot: await realpath(env.packageRoot),
879
+ principalAuthority: env.principalAuthority ?? piDurablePrincipalAuthority,
880
+ };
755
881
  const parsed = parseArgv(argv);
756
882
  // Invocation --engine rejects at the call-request seam (not role submission).
757
883
  // #356 / #378 / #391: engine axis is every callable role (not resume / support).
@@ -852,24 +978,16 @@ export async function runAkRole(
852
978
  if (resumeRole === "coder") {
853
979
  const result = await runPublicCoderResume(
854
980
  resumeRequest,
855
- {
981
+ createRoleEnvironment(env, {
982
+ role: "coder",
856
983
  home,
857
984
  agentDir,
858
- packageRoot: env.packageRoot,
859
985
  cwd,
860
986
  credentials,
861
- ...(env.correlationId === undefined
862
- ? {}
863
- : { correlationId: env.correlationId }),
864
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
865
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
866
- ...(env.coderExtraPiArgs === undefined
867
- ? {}
868
- : { extraPiArgs: env.coderExtraPiArgs }),
869
- ...(env.coderTimeoutMs === undefined
870
- ? {}
871
- : { timeoutMs: env.coderTimeoutMs }),
872
- },
987
+ seat,
988
+ config,
989
+ resume: true,
990
+ }),
873
991
  io,
874
992
  );
875
993
  return {
@@ -880,24 +998,16 @@ export async function runAkRole(
880
998
  if (resumeRole === "fixer") {
881
999
  const result = await runPublicFixerResume(
882
1000
  resumeRequest,
883
- {
1001
+ createRoleEnvironment(env, {
1002
+ role: "fixer",
884
1003
  home,
885
1004
  agentDir,
886
- packageRoot: env.packageRoot,
887
1005
  cwd,
888
1006
  credentials,
889
- ...(env.correlationId === undefined
890
- ? {}
891
- : { correlationId: env.correlationId }),
892
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
893
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
894
- ...(env.fixerExtraPiArgs === undefined
895
- ? {}
896
- : { extraPiArgs: env.fixerExtraPiArgs }),
897
- ...(env.fixerTimeoutMs === undefined
898
- ? {}
899
- : { timeoutMs: env.fixerTimeoutMs }),
900
- },
1007
+ seat,
1008
+ config,
1009
+ resume: true,
1010
+ }),
901
1011
  io,
902
1012
  );
903
1013
  return {
@@ -908,24 +1018,16 @@ export async function runAkRole(
908
1018
  if (resumeRole === "reviewer") {
909
1019
  const result = await runPublicReviewerResume(
910
1020
  resumeRequest,
911
- {
1021
+ createRoleEnvironment(env, {
1022
+ role: "reviewer",
912
1023
  home,
913
1024
  agentDir,
914
- packageRoot: env.packageRoot,
915
1025
  cwd,
916
1026
  credentials,
917
- ...(env.correlationId === undefined
918
- ? {}
919
- : { correlationId: env.correlationId }),
920
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
921
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
922
- ...(env.reviewerExtraPiArgs === undefined
923
- ? {}
924
- : { extraPiArgs: env.reviewerExtraPiArgs }),
925
- ...(env.reviewerTimeoutMs === undefined
926
- ? {}
927
- : { timeoutMs: env.reviewerTimeoutMs }),
928
- },
1027
+ seat,
1028
+ config,
1029
+ resume: true,
1030
+ }),
929
1031
  io,
930
1032
  );
931
1033
  return {
@@ -936,24 +1038,16 @@ export async function runAkRole(
936
1038
  if (resumeRole === "merger") {
937
1039
  const result = await runPublicMergerResume(
938
1040
  resumeRequest,
939
- {
1041
+ createRoleEnvironment(env, {
1042
+ role: "merger",
940
1043
  home,
941
1044
  agentDir,
942
- packageRoot: env.packageRoot,
943
1045
  cwd,
944
1046
  credentials,
945
- ...(env.correlationId === undefined
946
- ? {}
947
- : { correlationId: env.correlationId }),
948
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
949
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
950
- ...(env.mergerExtraPiArgs === undefined
951
- ? {}
952
- : { extraPiArgs: env.mergerExtraPiArgs }),
953
- ...(env.mergerTimeoutMs === undefined
954
- ? {}
955
- : { timeoutMs: env.mergerTimeoutMs }),
956
- },
1047
+ seat,
1048
+ config,
1049
+ resume: true,
1050
+ }),
957
1051
  io,
958
1052
  );
959
1053
  return {
@@ -963,24 +1057,16 @@ export async function runAkRole(
963
1057
  }
964
1058
  const result = await runPublicResume(
965
1059
  resumeRequest,
966
- {
1060
+ createRoleEnvironment(env, {
1061
+ role: "judge",
967
1062
  home,
968
1063
  agentDir,
969
- packageRoot: env.packageRoot,
970
1064
  cwd,
971
1065
  credentials,
972
- ...(env.correlationId === undefined
973
- ? {}
974
- : { correlationId: env.correlationId }),
975
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
976
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
977
- ...(env.judgeExtraPiArgs === undefined
978
- ? {}
979
- : { extraPiArgs: env.judgeExtraPiArgs }),
980
- ...(env.judgeTimeoutMs === undefined
981
- ? {}
982
- : { timeoutMs: env.judgeTimeoutMs }),
983
- },
1066
+ seat,
1067
+ config,
1068
+ resume: true,
1069
+ }),
984
1070
  io,
985
1071
  );
986
1072
  return {
@@ -1008,30 +1094,7 @@ export async function runAkRole(
1008
1094
  );
1009
1095
  const result = await runPublicJudge(
1010
1096
  parsed.args,
1011
- {
1012
- home,
1013
- agentDir,
1014
- packageRoot: env.packageRoot,
1015
- cwd,
1016
- credentials,
1017
- ...(env.correlationId === undefined
1018
- ? {}
1019
- : { correlationId: env.correlationId }),
1020
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1021
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1022
- ...projectSeatEngine(seat),
1023
- ...(env.judgeExtraPiArgs === undefined
1024
- ? {}
1025
- : { extraPiArgs: env.judgeExtraPiArgs }),
1026
- ...(env.judgeTimeoutMs === undefined
1027
- ? {}
1028
- : { timeoutMs: env.judgeTimeoutMs }),
1029
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1030
- // #422: effective auto-resume ceiling resolved once here; the loop never re-reads disk.
1031
- ...(config.autoResumeLimit === undefined
1032
- ? {}
1033
- : { autoResumeLimit: config.autoResumeLimit }),
1034
- },
1097
+ createRoleEnvironment(env, { role: "judge", home, agentDir, cwd, credentials, seat, config }),
1035
1098
  io,
1036
1099
  PUBLIC_ROLE_ARGV.judge.parse,
1037
1100
  );
@@ -1056,30 +1119,7 @@ export async function runAkRole(
1056
1119
  );
1057
1120
  const result = await runPublicCoder(
1058
1121
  parsed.args,
1059
- {
1060
- home,
1061
- agentDir,
1062
- packageRoot: env.packageRoot,
1063
- cwd,
1064
- credentials,
1065
- ...(env.correlationId === undefined
1066
- ? {}
1067
- : { correlationId: env.correlationId }),
1068
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1069
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1070
- ...projectSeatEngine(seat),
1071
- ...(env.coderExtraPiArgs === undefined
1072
- ? {}
1073
- : { extraPiArgs: env.coderExtraPiArgs }),
1074
- ...(env.coderTimeoutMs === undefined
1075
- ? {}
1076
- : { timeoutMs: env.coderTimeoutMs }),
1077
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1078
- // #422: effective auto-resume ceiling resolved once here; the loop never re-reads disk.
1079
- ...(config.autoResumeLimit === undefined
1080
- ? {}
1081
- : { autoResumeLimit: config.autoResumeLimit }),
1082
- },
1122
+ createRoleEnvironment(env, { role: "coder", home, agentDir, cwd, credentials, seat, config }),
1083
1123
  io,
1084
1124
  PUBLIC_ROLE_ARGV.coder.parse,
1085
1125
  );
@@ -1104,30 +1144,7 @@ export async function runAkRole(
1104
1144
  );
1105
1145
  const result = await runPublicFixer(
1106
1146
  parsed.args,
1107
- {
1108
- home,
1109
- agentDir,
1110
- packageRoot: env.packageRoot,
1111
- cwd,
1112
- credentials,
1113
- ...(env.correlationId === undefined
1114
- ? {}
1115
- : { correlationId: env.correlationId }),
1116
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1117
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1118
- ...projectSeatEngine(seat),
1119
- ...(env.fixerExtraPiArgs === undefined
1120
- ? {}
1121
- : { extraPiArgs: env.fixerExtraPiArgs }),
1122
- ...(env.fixerTimeoutMs === undefined
1123
- ? {}
1124
- : { timeoutMs: env.fixerTimeoutMs }),
1125
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1126
- // #422: effective auto-resume ceiling resolved once here; the loop never re-reads disk.
1127
- ...(config.autoResumeLimit === undefined
1128
- ? {}
1129
- : { autoResumeLimit: config.autoResumeLimit }),
1130
- },
1147
+ createRoleEnvironment(env, { role: "fixer", home, agentDir, cwd, credentials, seat, config }),
1131
1148
  io,
1132
1149
  PUBLIC_ROLE_ARGV.fixer.parse,
1133
1150
  );
@@ -1152,26 +1169,7 @@ export async function runAkRole(
1152
1169
  );
1153
1170
  const result = await runPublicCollector(
1154
1171
  parsed.args,
1155
- {
1156
- home,
1157
- agentDir,
1158
- packageRoot: env.packageRoot,
1159
- cwd,
1160
- credentials,
1161
- ...(env.correlationId === undefined
1162
- ? {}
1163
- : { correlationId: env.correlationId }),
1164
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1165
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1166
- ...projectSeatEngine(seat),
1167
- ...(env.collectorExtraPiArgs === undefined
1168
- ? {}
1169
- : { extraPiArgs: env.collectorExtraPiArgs }),
1170
- ...(env.collectorTimeoutMs === undefined
1171
- ? {}
1172
- : { timeoutMs: env.collectorTimeoutMs }),
1173
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1174
- },
1172
+ createRoleEnvironment(env, { role: "collector", home, agentDir, cwd, credentials, seat, config }),
1175
1173
  io,
1176
1174
  PUBLIC_ROLE_ARGV.collector.parse,
1177
1175
  );
@@ -1196,30 +1194,7 @@ export async function runAkRole(
1196
1194
  );
1197
1195
  const result = await runPublicReviewer(
1198
1196
  parsed.args,
1199
- {
1200
- home,
1201
- agentDir,
1202
- packageRoot: env.packageRoot,
1203
- cwd,
1204
- credentials,
1205
- ...(env.correlationId === undefined
1206
- ? {}
1207
- : { correlationId: env.correlationId }),
1208
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1209
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1210
- ...projectSeatEngine(seat),
1211
- ...(env.reviewerExtraPiArgs === undefined
1212
- ? {}
1213
- : { extraPiArgs: env.reviewerExtraPiArgs }),
1214
- ...(env.reviewerTimeoutMs === undefined
1215
- ? {}
1216
- : { timeoutMs: env.reviewerTimeoutMs }),
1217
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1218
- // #422: effective auto-resume ceiling resolved once here; the loop never re-reads disk.
1219
- ...(config.autoResumeLimit === undefined
1220
- ? {}
1221
- : { autoResumeLimit: config.autoResumeLimit }),
1222
- },
1197
+ createRoleEnvironment(env, { role: "reviewer", home, agentDir, cwd, credentials, seat, config }),
1223
1198
  io,
1224
1199
  PUBLIC_ROLE_ARGV.reviewer.parse,
1225
1200
  );
@@ -1244,26 +1219,7 @@ export async function runAkRole(
1244
1219
  );
1245
1220
  const result = await runPublicDoctor(
1246
1221
  parsed.args,
1247
- {
1248
- home,
1249
- agentDir,
1250
- packageRoot: env.packageRoot,
1251
- cwd,
1252
- credentials,
1253
- ...(env.correlationId === undefined
1254
- ? {}
1255
- : { correlationId: env.correlationId }),
1256
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1257
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1258
- ...projectSeatEngine(seat),
1259
- ...(env.doctorExtraPiArgs === undefined
1260
- ? {}
1261
- : { extraPiArgs: env.doctorExtraPiArgs }),
1262
- ...(env.doctorTimeoutMs === undefined
1263
- ? {}
1264
- : { timeoutMs: env.doctorTimeoutMs }),
1265
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1266
- },
1222
+ createRoleEnvironment(env, { role: "doctor", home, agentDir, cwd, credentials, seat, config }),
1267
1223
  io,
1268
1224
  PUBLIC_ROLE_ARGV.doctor.parse,
1269
1225
  );
@@ -1288,26 +1244,7 @@ export async function runAkRole(
1288
1244
  );
1289
1245
  const result = await runPublicNotary(
1290
1246
  parsed.args,
1291
- {
1292
- home,
1293
- agentDir,
1294
- packageRoot: env.packageRoot,
1295
- cwd,
1296
- credentials,
1297
- ...(env.correlationId === undefined
1298
- ? {}
1299
- : { correlationId: env.correlationId }),
1300
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1301
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1302
- ...projectSeatEngine(seat),
1303
- ...(env.notaryExtraPiArgs === undefined
1304
- ? {}
1305
- : { extraPiArgs: env.notaryExtraPiArgs }),
1306
- ...(env.notaryTimeoutMs === undefined
1307
- ? {}
1308
- : { timeoutMs: env.notaryTimeoutMs }),
1309
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1310
- },
1247
+ createRoleEnvironment(env, { role: "notary", home, agentDir, cwd, credentials, seat, config }),
1311
1248
  io,
1312
1249
  PUBLIC_ROLE_ARGV.notary.parse,
1313
1250
  );
@@ -1332,30 +1269,7 @@ export async function runAkRole(
1332
1269
  );
1333
1270
  const result = await runPublicMerger(
1334
1271
  parsed.args,
1335
- {
1336
- home,
1337
- agentDir,
1338
- packageRoot: env.packageRoot,
1339
- cwd,
1340
- credentials,
1341
- ...(env.correlationId === undefined
1342
- ? {}
1343
- : { correlationId: env.correlationId }),
1344
- ...(env.piRunner === undefined ? {} : { piRunner: env.piRunner }),
1345
- ...(seat.selection === undefined ? {} : { model: seat.selection }),
1346
- ...projectSeatEngine(seat),
1347
- ...(env.mergerExtraPiArgs === undefined
1348
- ? {}
1349
- : { extraPiArgs: env.mergerExtraPiArgs }),
1350
- ...(env.mergerTimeoutMs === undefined
1351
- ? {}
1352
- : { timeoutMs: env.mergerTimeoutMs }),
1353
- ...(env.createRunId === undefined ? {} : { createRunId: env.createRunId }),
1354
- // #422: effective auto-resume ceiling resolved once here; the loop never re-reads disk.
1355
- ...(config.autoResumeLimit === undefined
1356
- ? {}
1357
- : { autoResumeLimit: config.autoResumeLimit }),
1358
- },
1272
+ createRoleEnvironment(env, { role: "merger", home, agentDir, cwd, credentials, seat, config }),
1359
1273
  io,
1360
1274
  PUBLIC_ROLE_ARGV.merger.parse,
1361
1275
  );