@akagilnc/pi-workflow-roles 0.1.5066 → 0.1.5079

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.
@@ -2165,6 +2165,15 @@ ${serializeReceipt(result.submission)}`;
2165
2165
  }
2166
2166
  return `\u95E8\u4E0B\u7701 ${result.status}\uFF08${result.stage}\uFF09\uFF1A${result.reason}`;
2167
2167
  }
2168
+ function unreadableDiscriminatorNotice(field, received) {
2169
+ if (received === void 0) return `\u8BFB\u4E0D\u51FA ${field}`;
2170
+ return `\u8BFB\u4E0D\u51FA ${field}\uFF1A${readableGateItem(received)}`;
2171
+ }
2172
+ function receivedDiscriminator(receipt, field) {
2173
+ if (receipt === null || typeof receipt !== "object" || Array.isArray(receipt)) return void 0;
2174
+ if (!Object.hasOwn(receipt, field)) return void 0;
2175
+ return receipt[field];
2176
+ }
2168
2177
  var GatekeeperDecisionError, WorkerCommitReminderError, WorkerPrefixReminderError, WorkerUnfinishedReasonReminderError, ParentQueueReaskError;
2169
2178
  var init_submission_errors = __esm({
2170
2179
  "src/submission-errors.ts"() {
@@ -3141,7 +3150,10 @@ function openToolObjectFromUnion(schema) {
3141
3150
  }
3142
3151
  function openToolObject(schema) {
3143
3152
  const object = Type2.Object(
3144
- Object.fromEntries(Object.entries(schema.properties).map(([name, declaration]) => [name, Type2.Optional(described(name, declaration))])),
3153
+ Object.fromEntries(Object.entries(schema.properties).map(([name, declaration]) => [
3154
+ name,
3155
+ Type2.Optional(described(name, declaration))
3156
+ ])),
3145
3157
  { additionalProperties: true }
3146
3158
  );
3147
3159
  object.required = [];
@@ -3167,7 +3179,9 @@ function withTerminatingOutputDeclarations(schema) {
3167
3179
  [INFRASTRUCTURE_FAILURE_DECLARATION_KEY]: infrastructureFailureDeclarationSchema.properties[INFRASTRUCTURE_FAILURE_DECLARATION_KEY]
3168
3180
  };
3169
3181
  const object = Type3.Object(properties, { additionalProperties: true });
3170
- object.required = [];
3182
+ const incoming = schema.required;
3183
+ const preserved = Array.isArray(incoming) ? incoming.filter((key) => typeof key === "string" && Object.hasOwn(properties, key)) : [];
3184
+ object.required = preserved;
3171
3185
  return object;
3172
3186
  }
3173
3187
  function isInfrastructureFailureDeclaration(parameters) {
@@ -3325,51 +3339,41 @@ var init_navigator_output = __esm({
3325
3339
 
3326
3340
  // src/review-submission.ts
3327
3341
  import { Type as Type6 } from "typebox";
3328
- var REVIEW_SUBMISSION_OUTPUT_TOOL_NAME, reviewSubmissionSchema;
3342
+ var REVIEW_SUBMISSION_OUTPUT_TOOL_NAME, REVIEW_QUEUE_WORDS, REVIEW_QUEUE_STATUSES, reviewSubmissionSchema;
3329
3343
  var init_review_submission = __esm({
3330
3344
  "src/review-submission.ts"() {
3331
3345
  "use strict";
3332
- init_open_tool_schema();
3333
3346
  init_terminating_infrastructure();
3334
3347
  REVIEW_SUBMISSION_OUTPUT_TOOL_NAME = "ak_submission_output";
3348
+ REVIEW_QUEUE_WORDS = ["converged", "continue", "escalate"];
3349
+ REVIEW_QUEUE_STATUSES = new Set(REVIEW_QUEUE_WORDS);
3335
3350
  reviewSubmissionSchema = withTerminatingOutputDeclarations(
3336
- openToolObject(
3337
- Type6.Object({
3338
- status: Type6.Optional(Type6.Unknown({
3339
- description: "converged | continue | escalate \u2014 \u975E\u4E09\u6001\u65F6\u8BF7\u91CD\u8BFB\u540E\u91CD\u4EA4\uFF0C\u52FF\u6539\u6807\u3002"
3340
- })),
3341
- findings: Type6.Optional(Type6.Unknown({ description: "\u5BA1\u6838\u53D1\u73B0\uFF0C\u539F\u6837\u7559\u5B58" })),
3342
- reason: Type6.Optional(Type6.Unknown({ description: "\u4E0A\u5448\u7406\u7531" })),
3343
- violations: Type6.Optional(Type6.Unknown({ description: "\u8FDD\u89C4\u6761\u76EE" })),
3344
- conflicts: Type6.Optional(Type6.Unknown({ description: "\u5F85\u51B3\u51B2\u7A81" })),
3345
- fix: Type6.Optional(Type6.Unknown({ description: "continue \u65F6\u7684\u8865\u6551\u8BF4\u660E\uFF1B\u53EF\u5199 summary \u6458\u8981\uFF0C\u5176\u4F59\u5185\u5BB9\u539F\u6837\u7559\u5B58" })),
3346
- classes: Type6.Optional(Type6.Unknown({ description: "\u5DF2\u88C1\u51B3 finding \u7C7B\uFF1B\u53EF\u8BF4\u660E name\u3001owner\u3001boundary\u3001disposition\uFF0C\u539F\u6837\u7559\u5B58" })),
3347
- note: Type6.Optional(Type6.Unknown({ description: "\u88C1\u51B3\u9644\u6CE8" })),
3348
- evidence: Type6.Optional(Type6.Unknown({ description: "\u7559\u5B58\u8BC1\u636E" })),
3349
- decisionGate: Type6.Optional(Type6.Unknown({ description: "\u9700\u4EBA\u6743\u5A01\u5904\u7F6E\u7684\u95EE\u9898\u4E0E\u9009\u9879\uFF1B\u53EF\u8BF4\u660E question\u3001options\uFF0C\u539F\u6837\u7559\u5B58" }))
3350
- })
3351
- )
3351
+ Type6.Object({
3352
+ status: Type6.Union(
3353
+ [
3354
+ Type6.Literal(REVIEW_QUEUE_WORDS[0]),
3355
+ Type6.Literal(REVIEW_QUEUE_WORDS[1]),
3356
+ Type6.Literal(REVIEW_QUEUE_WORDS[2])
3357
+ ],
3358
+ {
3359
+ description: "\u5BA1\u6838\u961F\u5217\u4E09\u6001\u679A\u4E3E\uFF0C\u5FC5\u586B\u3002\u5BA1\u6838\u5E2D\u4ECD\u80FD\u4EA4\u5377\u800C\u5B8C\u6210\u5BA1\u6838\u6240\u9700\u7684\u5916\u90E8\u4F9D\u8D56\u53D1\u751F\u771F\u5B9E\u57FA\u7840\u8BBE\u65BD\u5931\u8D25\u65F6\uFF0Cstatus \u53D6 escalate\uFF0C\u7EC6\u8282\u5199\u5165 infrastructureFailure\u3002\u4E0D\u5F97\u7701\u7565 status\uFF0C\u4E0D\u5F97\u7528\u53E6\u4E24\u4E2A\u679A\u4E3E\u503C\u5145\u5F53\u653E\u884C\u6216\u5C01\u9A73\u3002\u5305\u4FA7\u4E0D\u56E0\u683C\u5F0F\u62D2\u6536\u3002"
3360
+ }
3361
+ ),
3362
+ findings: Type6.Optional(Type6.Unknown({ description: "\u5BA1\u6838\u53D1\u73B0\uFF0C\u539F\u6837\u7559\u5B58" })),
3363
+ reason: Type6.Optional(Type6.Unknown({ description: "\u4E0A\u5448\u7406\u7531" })),
3364
+ violations: Type6.Optional(Type6.Unknown({ description: "\u8FDD\u89C4\u6761\u76EE" })),
3365
+ conflicts: Type6.Optional(Type6.Unknown({ description: "\u5F85\u51B3\u51B2\u7A81" })),
3366
+ fix: Type6.Optional(Type6.Unknown({ description: "continue \u65F6\u7684\u8865\u6551\u8BF4\u660E\uFF1B\u53EF\u5199 summary \u6458\u8981\uFF0C\u5176\u4F59\u5185\u5BB9\u539F\u6837\u7559\u5B58" })),
3367
+ classes: Type6.Optional(Type6.Unknown({ description: "\u5DF2\u88C1\u51B3 finding \u7C7B\uFF1B\u53EF\u8BF4\u660E name\u3001owner\u3001boundary\u3001disposition\uFF0C\u539F\u6837\u7559\u5B58" })),
3368
+ note: Type6.Optional(Type6.Unknown({ description: "\u88C1\u51B3\u9644\u6CE8" })),
3369
+ evidence: Type6.Optional(Type6.Unknown({ description: "\u7559\u5B58\u8BC1\u636E" })),
3370
+ decisionGate: Type6.Optional(Type6.Unknown({ description: "\u9700\u4EBA\u6743\u5A01\u5904\u7F6E\u7684\u95EE\u9898\u4E0E\u9009\u9879\uFF1B\u53EF\u8BF4\u660E question\u3001options\uFF0C\u539F\u6837\u7559\u5B58" }))
3371
+ }, { additionalProperties: true })
3352
3372
  );
3353
3373
  }
3354
3374
  });
3355
3375
 
3356
3376
  // src/package-contracts/judge-output.ts
3357
- function validateAcceptedJudgeDetails(verdict) {
3358
- if (verdict === null || typeof verdict !== "object" || Array.isArray(verdict)) throw new Error("Judge verdict has no execution discriminator");
3359
- let status;
3360
- try {
3361
- status = verdict.status;
3362
- } catch {
3363
- throw new Error("Judge verdict has no execution discriminator");
3364
- }
3365
- if (typeof status !== "string") {
3366
- throw new Error("Judge verdict has no execution discriminator");
3367
- }
3368
- if (["converged", "continue", "escalate"].includes(status)) {
3369
- return verdict;
3370
- }
3371
- throw new Error("Judge verdict has no execution discriminator");
3372
- }
3373
3377
  var JUDGE_OUTPUT_TOOL_NAME;
3374
3378
  var init_judge_output = __esm({
3375
3379
  "src/package-contracts/judge-output.ts"() {
@@ -4935,10 +4939,7 @@ function readRecord(value) {
4935
4939
  return value;
4936
4940
  }
4937
4941
  function reviewQueueStatus(status) {
4938
- if (status === "converged") return "converged";
4939
- if (status === "continue") return "continue";
4940
- if (status === "escalate") return "escalate";
4941
- return void 0;
4942
+ return REVIEW_QUEUE_STATUSES.has(status) ? status : void 0;
4942
4943
  }
4943
4944
  function projectOfficerDecision(officer, decision, fallbackStatus) {
4944
4945
  const receipt = retainedReceipt(decision);
@@ -4951,7 +4952,7 @@ function projectOfficerDecision(officer, decision, fallbackStatus) {
4951
4952
  if (queueStatus === "continue" || queueStatus === "escalate") {
4952
4953
  return { status: queueStatus, officer, receipt };
4953
4954
  }
4954
- return { status: "needs_reask", officer, receipt };
4955
+ return { status: "needs_reask", officer, receipt, receivedStatus: status };
4955
4956
  }
4956
4957
  function thisCourtOfficerPayloads(terminal) {
4957
4958
  const outcome = terminal?.roleOutcome;
@@ -5037,18 +5038,20 @@ function projectOfficerTerminal(officer, summoned) {
5037
5038
  summoned
5038
5039
  );
5039
5040
  }
5041
+ const receipt = thisCourt.length > 0 ? thisCourt[thisCourt.length - 1] : retainedReceipt(outcome);
5040
5042
  return withOfficerRunId(
5041
5043
  {
5042
5044
  status: "needs_reask",
5043
5045
  officer,
5044
5046
  // This-court receipt only (#879).
5045
- receipt: thisCourt.length > 0 ? thisCourt[thisCourt.length - 1] : retainedReceipt(outcome)
5047
+ receipt,
5048
+ receivedStatus: receivedDiscriminator(receipt, "status")
5046
5049
  },
5047
5050
  summoned
5048
5051
  );
5049
5052
  }
5050
- function officerConclusionReask(officer) {
5051
- return OFFICER_CONCLUSION_REASK;
5053
+ function officerConclusionReask(received) {
5054
+ return unreadableDiscriminatorNotice("status", received);
5052
5055
  }
5053
5056
  async function projectGatekeeperRun(options) {
5054
5057
  const officer = gateOfficerForSubject(options.subject);
@@ -5084,7 +5087,7 @@ async function projectGatekeeperRun(options) {
5084
5087
  summoned
5085
5088
  };
5086
5089
  }
5087
- var GATE_OFFICER_BY_SUBJECT, GATEKEEPER_TOOL_SPEC, OFFICER_CONCLUSION_REASK;
5090
+ var GATE_OFFICER_BY_SUBJECT, GATEKEEPER_TOOL_SPEC;
5088
5091
  var init_gatekeeper_role = __esm({
5089
5092
  "src/gatekeeper-role.ts"() {
5090
5093
  "use strict";
@@ -5110,7 +5113,6 @@ var init_gatekeeper_role = __esm({
5110
5113
  promptSnippet: "\u95E8\u4E0B\u7701\u51B3\u8BAE",
5111
5114
  parameters: gatekeeperOutputSchema
5112
5115
  };
5113
- OFFICER_CONCLUSION_REASK = "\u4E0A\u6B21\u4EA4\u5377\u7684 status \u4E0D\u662F converged\u3001continue\u3001escalate \u4E09\u6001\u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u8F93\u51FA\uFF0Cstatus \u5199\u660E\u5176\u4E00\uFF1Bcontinue \u6216 escalate \u7684\u8BDD\u5C31\u662F\u7ED9\u5BF9\u65B9\u770B\u7684\u539F\u6587\u3002";
5114
5116
  }
5115
5117
  });
5116
5118
 
@@ -6427,7 +6429,7 @@ async function runComplianceAudit(options) {
6427
6429
  const summoned = await summon(subject, runDirectory, options.signal, reask, submission);
6428
6430
  const decision = await projectAuditorTerminal(summoned);
6429
6431
  if (decision.status === "received") {
6430
- reask = OFFICER_CONCLUSION_REASK;
6432
+ reask = officerConclusionReask(receivedDiscriminator(decision.reply, "status"));
6431
6433
  continue;
6432
6434
  }
6433
6435
  return decision;
@@ -6439,6 +6441,7 @@ var init_compliance_transport = __esm({
6439
6441
  "use strict";
6440
6442
  init_auditor_dossier_tool();
6441
6443
  init_gatekeeper_role();
6444
+ init_submission_errors();
6442
6445
  init_terminal();
6443
6446
  init_readable_gate_item();
6444
6447
  AUDITOR_DOSSIER_PROMPT = "\u5377\u5B97\u6307\u9488\uFF1A";
@@ -13919,17 +13922,20 @@ function createSubmissionLedgerHost(host, outputTools, failInfrastructure2 = (er
13919
13922
  });
13920
13923
  let result;
13921
13924
  try {
13922
- failOnInfrastructureFailureDeclaration(
13923
- params,
13924
- {
13925
- failInfrastructure(error, ctx) {
13926
- failInfrastructure2(error, ctx);
13927
- }
13928
- },
13929
- context,
13930
- toolCallId,
13931
- tool.bounceInfrastructureDeclaration
13932
- );
13925
+ const reviewEscalate = tool.name === REVIEW_SUBMISSION_OUTPUT_TOOL_NAME && infrastructureFailureDiagnostic(params) !== void 0 && params !== null && typeof params === "object" && !Array.isArray(params) && params.status === "escalate";
13926
+ if (!reviewEscalate) {
13927
+ failOnInfrastructureFailureDeclaration(
13928
+ params,
13929
+ {
13930
+ failInfrastructure(error, ctx) {
13931
+ failInfrastructure2(error, ctx);
13932
+ }
13933
+ },
13934
+ context,
13935
+ toolCallId,
13936
+ tool.bounceInfrastructureDeclaration
13937
+ );
13938
+ }
13933
13939
  result = await tool.execute(toolCallId, params, signal, update, context);
13934
13940
  } catch (error) {
13935
13941
  if (isCorrectableExecuteError(error)) {
@@ -14008,6 +14014,7 @@ var init_submission_ledger = __esm({
14008
14014
  init_run_lifecycle();
14009
14015
  init_submission_correctable_error();
14010
14016
  init_terminating_infrastructure();
14017
+ init_review_submission();
14011
14018
  }
14012
14019
  });
14013
14020
 
@@ -23094,7 +23101,7 @@ async function requireSubmissionGate(options) {
23094
23101
  };
23095
23102
  }
23096
23103
  if (gatekeeper.status === "needs_reask") {
23097
- reask = officerConclusionReask(projected.officer);
23104
+ reask = officerConclusionReask(gatekeeper.receivedStatus);
23098
23105
  continue;
23099
23106
  }
23100
23107
  if (gatekeeper.status === "transport_failure") {
@@ -25691,12 +25698,7 @@ init_submission_errors();
25691
25698
  init_audit_escalation();
25692
25699
  init_readable_gate_item();
25693
25700
  init_judge_output();
25694
- var JUDGE_QUEUE_STATUSES = /* @__PURE__ */ new Set(["converged", "continue", "escalate"]);
25695
- var JUDGE_STATUS_REASK = "status \u4E0D\u662F converged\u3001continue\u3001escalate \u4E09\u6001\u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u4EA4\u5377\uFF0Cstatus \u5199\u660E\u5176\u4E00\u3002";
25696
25701
  var judgeVerdictSchema = reviewSubmissionSchema;
25697
- function validateVerdict(verdict) {
25698
- return validateAcceptedJudgeDetails(verdict);
25699
- }
25700
25702
  function createJudgeRoleRuntime(pi, dependencies, hostActions) {
25701
25703
  let soul;
25702
25704
  let lifecycleRegistered = false;
@@ -25715,18 +25717,17 @@ function createJudgeRoleRuntime(pi, dependencies, hostActions) {
25715
25717
  async execute(toolCallId, parameters, signal, _onUpdate, ctx) {
25716
25718
  if (soul === void 0) throw new Error("\u5927\u7406\u5BFA\u804C\u5206\u672A\u88C5\u8F7D");
25717
25719
  const rawStatus = parameters !== null && typeof parameters === "object" && !Array.isArray(parameters) && typeof parameters.status === "string" ? parameters.status : void 0;
25718
- if (rawStatus === void 0 || !JUDGE_QUEUE_STATUSES.has(rawStatus)) {
25719
- throw new ParentQueueReaskError(JUDGE_STATUS_REASK);
25720
+ if (rawStatus === void 0 || !REVIEW_QUEUE_STATUSES.has(rawStatus)) {
25721
+ const received = parameters !== null && typeof parameters === "object" && !Array.isArray(parameters) ? parameters.status : void 0;
25722
+ throw new ParentQueueReaskError(unreadableDiscriminatorNotice("status", received));
25720
25723
  }
25721
25724
  if (rawStatus === "escalate") {
25722
- const verdict2 = validateVerdict(parameters);
25723
25725
  return {
25724
25726
  content: [],
25725
- details: verdict2,
25727
+ details: parameters,
25726
25728
  terminate: true
25727
25729
  };
25728
25730
  }
25729
- const verdict = validateVerdict(parameters);
25730
25731
  let draftPass;
25731
25732
  try {
25732
25733
  const obtainedDraftPass = await pi.requireSubmissionGate({
@@ -25742,7 +25743,7 @@ function createJudgeRoleRuntime(pi, dependencies, hostActions) {
25742
25743
  if (draftPass?.status === "continue") {
25743
25744
  return {
25744
25745
  content: [{ type: "text", text: readableGateItem(draftPass.receipt) }],
25745
- details: verdict,
25746
+ details: parameters,
25746
25747
  terminate: false
25747
25748
  };
25748
25749
  }
@@ -25759,18 +25760,18 @@ function createJudgeRoleRuntime(pi, dependencies, hostActions) {
25759
25760
  if (compliancePass?.status === "continue") {
25760
25761
  return {
25761
25762
  content: [draftPass, compliancePass].filter((pass) => pass !== void 0).map((pass) => ({ type: "text", text: readableGateItem(pass.receipt) })),
25762
- details: verdict,
25763
+ details: parameters,
25763
25764
  terminate: false
25764
25765
  };
25765
25766
  }
25766
25767
  return {
25767
25768
  content: [draftPass, compliancePass].filter((pass) => pass !== void 0).map((pass) => ({ type: "text", text: readableGateItem(pass.receipt) })),
25768
- details: verdict,
25769
+ details: parameters,
25769
25770
  terminate: true
25770
25771
  };
25771
25772
  } catch (error) {
25772
25773
  if (error instanceof GatekeeperDecisionError && error.result.status === "escalate") {
25773
- return projectGatekeeperEscalation(error.result, verdict);
25774
+ return projectGatekeeperEscalation(error.result, parameters);
25774
25775
  }
25775
25776
  throw error;
25776
25777
  }
@@ -26192,14 +26193,13 @@ var WORKER_ROUTING_STATUSES = /* @__PURE__ */ new Set([
26192
26193
  "partially_completed",
26193
26194
  "unfinished"
26194
26195
  ]);
26195
- var WORKER_STATUS_REASK = "status \u4E0D\u662F planned\u3001completed\u3001refused\u3001partially_completed\u3001unfinished \u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u4EA4\u5377\uFF0Cstatus \u5199\u660E\u5176\u4E00\u3002";
26196
26196
  function workerStatusOf(output) {
26197
26197
  return isRecord18(output) && typeof output.status === "string" ? output.status : void 0;
26198
26198
  }
26199
26199
  function requireReadableWorkerStatus(output) {
26200
26200
  const status = workerStatusOf(output);
26201
26201
  if (status === void 0 || !WORKER_ROUTING_STATUSES.has(status)) {
26202
- throw new ParentQueueReaskError(WORKER_STATUS_REASK);
26202
+ throw new ParentQueueReaskError(unreadableDiscriminatorNotice("status", isRecord18(output) ? output.status : void 0));
26203
26203
  }
26204
26204
  return status;
26205
26205
  }
@@ -26542,6 +26542,7 @@ ${JSON.stringify(admitted)}
26542
26542
  init_navigator_invocation_identity();
26543
26543
  init_gatekeeper_role();
26544
26544
  init_submission_errors();
26545
+ init_review_submission();
26545
26546
  init_doctor_contracts();
26546
26547
  init_doctor_evidence();
26547
26548
  init_engine_detour();
@@ -26984,7 +26985,6 @@ function readDiaristRunCoordinates(ctx) {
26984
26985
  }
26985
26986
  var DIARIST_BOUNDS_REASK = "\u8FB9\u754C\u65E0\u6CD5\u4F7F\u7528\u3002\u8BF7\u91CD\u4EA4 sessions\uFF1A\u6BCF\u5377 path + ranges\uFF0C\u6BCF\u7AEF\u4EE5\u539F\u751F id \u6216\u672C\u8F6E\u884C\u53F7\u4E8C\u9009\u4E00\u6307\u540D\u3002";
26986
26987
  var DIARIST_ROUTING_STATUSES = /* @__PURE__ */ new Set(["completed", "escalate"]);
26987
- var DIARIST_STATUS_REASK = "status \u4E0D\u662F completed\u3001escalate \u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u4EA4\u5377\uFF0Cstatus \u5199\u660E\u5176\u4E00\u3002";
26988
26988
  function createDiaristRoleRuntime(roleHost, dependencies) {
26989
26989
  return createFiledOfficerRuntime(
26990
26990
  roleHost,
@@ -26996,7 +26996,7 @@ function createDiaristRoleRuntime(roleHost, dependencies) {
26996
26996
  const submitted = parameters !== null && typeof parameters === "object" && !Array.isArray(parameters) ? parameters : void 0;
26997
26997
  const status = submitted?.status;
26998
26998
  if (typeof status !== "string" || !DIARIST_ROUTING_STATUSES.has(status)) {
26999
- throw new ParentQueueReaskError(DIARIST_STATUS_REASK);
26999
+ throw new ParentQueueReaskError(unreadableDiscriminatorNotice("status", submitted?.status));
27000
27000
  }
27001
27001
  if (status === "escalate") return parameters;
27002
27002
  const assertion = readDiaristTicketAssertion(submitted);
@@ -27036,10 +27036,7 @@ ${error.message}`
27036
27036
  dependencies
27037
27037
  );
27038
27038
  }
27039
- var COUNTERSIGN_QUEUE_STATUSES = /* @__PURE__ */ new Set(["converged", "continue", "escalate"]);
27040
- var COUNTERSIGN_STATUS_REASK = "status \u4E0D\u662F converged\u3001continue\u3001escalate \u4E09\u6001\u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u4EA4\u5377\uFF0Cstatus \u5199\u660E\u5176\u4E00\u3002";
27041
27039
  var SECRETARIAT_QUEUE_STATUSES = /* @__PURE__ */ new Set(["converged", "escalate"]);
27042
- var SECRETARIAT_STATUS_REASK = "secretariatStatus \u4E0D\u662F converged\u3001escalate \u4E4B\u4E00\u3002\u8BF7\u91CD\u65B0\u4EA4\u5377\uFF0Cstatus \u5199\u660E\u5176\u4E00\u3002";
27043
27040
  function createSecretariatRoleRuntime(roleHost, dependencies, hostActions) {
27044
27041
  const beforeAccept = hostActions !== void 0 ? async ({ toolCallId, parameters, signal, ctx }) => {
27045
27042
  if (roleHost.requireSubmissionGate === void 0) {
@@ -27050,7 +27047,9 @@ function createSecretariatRoleRuntime(roleHost, dependencies, hostActions) {
27050
27047
  const record4 = parameters !== null && typeof parameters === "object" && !Array.isArray(parameters) ? parameters : void 0;
27051
27048
  const status = record4 !== void 0 && typeof record4.secretariatStatus === "string" ? record4.secretariatStatus : void 0;
27052
27049
  if (status === void 0 || !SECRETARIAT_QUEUE_STATUSES.has(status)) {
27053
- throw new ParentQueueReaskError(SECRETARIAT_STATUS_REASK);
27050
+ throw new ParentQueueReaskError(
27051
+ unreadableDiscriminatorNotice("secretariatStatus", record4?.secretariatStatus)
27052
+ );
27054
27053
  }
27055
27054
  if (status === "escalate") {
27056
27055
  return void 0;
@@ -27144,8 +27143,8 @@ function createCountersignRoleRuntime(roleHost, dependencies, hostActions) {
27144
27143
  const beforeAccept = hostActions !== void 0 ? async ({ toolCallId, parameters, signal, ctx }) => {
27145
27144
  const record4 = parameters !== null && typeof parameters === "object" && !Array.isArray(parameters) ? parameters : void 0;
27146
27145
  const status = record4 !== void 0 && typeof record4.status === "string" ? record4.status : void 0;
27147
- if (status === void 0 || !COUNTERSIGN_QUEUE_STATUSES.has(status)) {
27148
- throw new ParentQueueReaskError(COUNTERSIGN_STATUS_REASK);
27146
+ if (status === void 0 || !REVIEW_QUEUE_STATUSES.has(status)) {
27147
+ throw new ParentQueueReaskError(unreadableDiscriminatorNotice("status", record4?.status));
27149
27148
  }
27150
27149
  if (status === "escalate") {
27151
27150
  return void 0;
@@ -1,5 +1,6 @@
1
1
  import { auditorRunDirectory } from "./auditor-dossier-tool.js";
2
- import { OFFICER_CONCLUSION_REASK } from "./gatekeeper-role.js";
2
+ import { officerConclusionReask } from "./gatekeeper-role.js";
3
+ import { receivedDiscriminator } from "./submission-errors.js";
3
4
  import { coalesceSubmissionRows } from "./public-cli/terminal.js";
4
5
  import { readableGateItem } from "./readable-gate-item.js";
5
6
  const AUDITOR_DOSSIER_PROMPT = "\u5377\u5B97\u6307\u9488\uFF1A";
@@ -122,7 +123,7 @@ async function runComplianceAudit(options) {
122
123
  const summoned = await summon(subject, runDirectory, options.signal, reask, submission);
123
124
  const decision = await projectAuditorTerminal(summoned);
124
125
  if (decision.status === "received") {
125
- reask = OFFICER_CONCLUSION_REASK;
126
+ reask = officerConclusionReask(receivedDiscriminator(decision.reply, "status"));
126
127
  continue;
127
128
  }
128
129
  return decision;
@@ -1,4 +1,4 @@
1
- import { REVIEW_SUBMISSION_OUTPUT_TOOL_NAME } from "./review-submission.js";
1
+ import { REVIEW_QUEUE_STATUSES, REVIEW_SUBMISSION_OUTPUT_TOOL_NAME } from "./review-submission.js";
2
2
  const COUNTERSIGN_OUTPUT_TOOL_NAME = REVIEW_SUBMISSION_OUTPUT_TOOL_NAME;
3
3
  function validateRecordedCountersignOutput(verdict) {
4
4
  if (verdict === null || typeof verdict !== "object" || Array.isArray(verdict)) {
@@ -13,7 +13,7 @@ function validateRecordedCountersignOutput(verdict) {
13
13
  if (typeof status !== "string") {
14
14
  throw new Error("Countersign verdict has no execution discriminator");
15
15
  }
16
- if (["converged", "continue", "escalate"].includes(status)) {
16
+ if (REVIEW_QUEUE_STATUSES.has(status)) {
17
17
  return verdict;
18
18
  }
19
19
  throw new Error("Countersign verdict has no execution discriminator");
@@ -1,8 +1,8 @@
1
1
  import { auditorRunDirectory } from "./auditor-dossier-tool.js";
2
2
  import { packagedGateStageLabel } from "./packaged-role-registry.js";
3
- import { GatekeeperDecisionError } from "./submission-errors.js";
3
+ import { GatekeeperDecisionError, receivedDiscriminator, unreadableDiscriminatorNotice } from "./submission-errors.js";
4
4
  import { INSPECTOR_OUTPUT_TOOL_NAME } from "./inspector-contracts.js";
5
- import { REVIEW_SUBMISSION_OUTPUT_TOOL_NAME } from "./review-submission.js";
5
+ import { REVIEW_QUEUE_STATUSES, REVIEW_SUBMISSION_OUTPUT_TOOL_NAME } from "./review-submission.js";
6
6
  import { GATEKEEPER_OUTPUT_TOOL_NAME, gatekeeperDecisionSchema, gatekeeperOutputSchema, } from "./package-contracts/gatekeeper-output.js";
7
7
  import { runIdFromRunDirectory } from "./run-terminal-artifacts.js";
8
8
  export const INSPECTOR_OUTPUT_TOOL = INSPECTOR_OUTPUT_TOOL_NAME;
@@ -73,15 +73,9 @@ function readRecord(value) {
73
73
  * `fallbackStatus` is the terminal outcome.status when the receipt body has no status key
74
74
  * (keeps missing-args sentinel intact as the receipt).
75
75
  */
76
- /** Map the shared review verdict onto the gate queue words (#1028). */
76
+ /** Map the shared review verdict onto the gate queue words (#1028 / #1055). */
77
77
  function reviewQueueStatus(status) {
78
- if (status === "converged")
79
- return "converged";
80
- if (status === "continue")
81
- return "continue";
82
- if (status === "escalate")
83
- return "escalate";
84
- return undefined;
78
+ return REVIEW_QUEUE_STATUSES.has(status) ? status : undefined;
85
79
  }
86
80
  function projectOfficerDecision(officer, decision, fallbackStatus) {
87
81
  const receipt = retainedReceipt(decision);
@@ -95,7 +89,7 @@ function projectOfficerDecision(officer, decision, fallbackStatus) {
95
89
  if (queueStatus === "continue" || queueStatus === "escalate") {
96
90
  return { status: queueStatus, officer, receipt };
97
91
  }
98
- return { status: "needs_reask", officer, receipt };
92
+ return { status: "needs_reask", officer, receipt, receivedStatus: status };
99
93
  }
100
94
  /**
101
95
  * This-court officer payloads for the parent return path (#879).
@@ -209,22 +203,21 @@ function projectOfficerTerminal(officer, summoned) {
209
203
  // lacking its own status, never substitute for a missing receipt.
210
204
  return withOfficerRunId(projectOfficerPayloads(officer, thisCourt, outcome.status), summoned);
211
205
  }
206
+ const receipt = thisCourt.length > 0 ? thisCourt[thisCourt.length - 1] : retainedReceipt(outcome);
212
207
  return withOfficerRunId({
213
208
  status: "needs_reask",
214
209
  officer,
215
210
  // This-court receipt only (#879).
216
- receipt: thisCourt.length > 0 ? thisCourt[thisCourt.length - 1] : retainedReceipt(outcome),
211
+ receipt,
212
+ receivedStatus: receivedDiscriminator(receipt, "status"),
217
213
  }, summoned);
218
214
  }
219
215
  /**
220
- * Plain-language re-ask when the officer conclusion is not converged|continue|escalate.
221
- * Not a packaged engine handbook line (#755 exception for 读不出三态).
222
- * Every review officer uses the same `status` field and three queue words (#1028).
216
+ * Officer conclusion was missing or not a queue word (#1055).
217
+ * `received` is the status value only, not the rest of the receipt.
223
218
  */
224
- export const OFFICER_CONCLUSION_REASK = "上次交卷的 status 不是 converged、continue、escalate 三态之一。请重新输出,status 写明其一;continue 或 escalate 的话就是给对方看的原文。";
225
- /** Pick the re-ask line for the officer under review. */
226
- export function officerConclusionReask(officer) {
227
- return OFFICER_CONCLUSION_REASK;
219
+ export function officerConclusionReask(received) {
220
+ return unreadableDiscriminatorNotice("status", received);
228
221
  }
229
222
  /**
230
223
  * Summon (via injected seam) + project. Default summonGateOfficer drive lives