@akagilnc/pi-workflow-roles 0.1.5241 → 0.1.5252
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.
- package/README.md +2 -3
- package/README.zh-CN.md +2 -3
- package/dist/acp-host/production-host.js +482 -3141
- package/dist/collector-config.js +0 -1
- package/dist/headless-host/production-host.js +590 -3249
- package/dist/migrate-book-topology.js +40 -107
- package/dist/navigator-invocation-identity.js +0 -57
- package/dist/package-contracts/collector-output.js +1 -90
- package/dist/package-contracts/terminating-tools.js +2 -2
- package/dist/packaged-role-registry.js +8 -11
- package/dist/public-cli/invocation.js +2 -22
- package/dist/public-cli/main.js +256 -749
- package/dist/public-cli/option-definitions.js +4 -19
- package/dist/public-cli/settlement.js +12 -138
- package/package.json +1 -1
- package/resources/collector-bot-handbook.md +4 -2
- package/src/collector-config.ts +0 -1
- package/src/collector-role.ts +40 -535
- package/src/collector-tool-schemas.ts +7 -117
- package/src/gh-api-runner.ts +102 -0
- package/src/navigator-invocation-identity.ts +4 -121
- package/src/package-contracts/collector-output.ts +15 -174
- package/src/package-contracts/terminating-tools.ts +0 -2
- package/src/packaged-role-registry.ts +7 -10
- package/src/public-cli/invocation.ts +3 -27
- package/src/public-cli/option-definitions.ts +4 -19
- package/src/public-cli/settlement.ts +11 -177
- package/src/role-runtime-dependencies.ts +0 -4
- package/src/role-runtime.ts +39 -103
- package/src/ticket-snapshot.ts +1 -1
- package/dist/collector-evidence.js +0 -319
- package/dist/collector-github.js +0 -725
- package/dist/collector-identity.js +0 -92
- package/dist/collector-ledger.js +0 -888
- package/dist/collector-target.js +0 -169
- package/src/collector-evidence.ts +0 -466
- package/src/collector-github.ts +0 -1032
- package/src/collector-handbook.ts +0 -194
- package/src/collector-identity.ts +0 -151
- package/src/collector-ledger.ts +0 -1186
- package/src/collector-target.ts +0 -207
|
@@ -69,7 +69,6 @@ import {
|
|
|
69
69
|
parseCollectorRepository,
|
|
70
70
|
type CollectorRepository,
|
|
71
71
|
} from "../collector-config.ts";
|
|
72
|
-
import { resolveCollectorTarget } from "../collector-target.ts";
|
|
73
72
|
import { ownerRepoFromGitHubRemoteUrl } from "./github-remote.ts";
|
|
74
73
|
import {
|
|
75
74
|
FixerPacketValidationError,
|
|
@@ -231,13 +230,11 @@ export type AdmittedFixerInvocation = AdmittedRoleInvocationBase & {
|
|
|
231
230
|
|
|
232
231
|
export type AdmittedCollectorInvocation = AdmittedRoleInvocationBase & {
|
|
233
232
|
readonly role: "collector";
|
|
234
|
-
/** Bound at admission when explicit
|
|
233
|
+
/** Bound at admission when explicit --pr; otherwise the LLM locates via host CLI. */
|
|
235
234
|
readonly prNumber?: number;
|
|
236
235
|
readonly repository: CollectorRepository;
|
|
237
236
|
readonly requestManifestPath?: string;
|
|
238
237
|
readonly manifestDigest: string;
|
|
239
|
-
/** Wait-window ms (#678 D4); default applied at role activate when omitted. */
|
|
240
|
-
readonly waitWindowMs?: number;
|
|
241
238
|
};
|
|
242
239
|
|
|
243
240
|
export type AdmittedDoctorInvocation = AdmittedRoleInvocationBase & {
|
|
@@ -899,7 +896,6 @@ type SeatArgvFields = {
|
|
|
899
896
|
prNumber?: number;
|
|
900
897
|
repo?: string;
|
|
901
898
|
requestManifestPath?: string;
|
|
902
|
-
waitWindowMs?: number;
|
|
903
899
|
issueNumber?: number;
|
|
904
900
|
runs?: string;
|
|
905
901
|
sourceRun?: string;
|
|
@@ -975,17 +971,6 @@ function assignPublicSeatOption(
|
|
|
975
971
|
case "request-manifest":
|
|
976
972
|
fields.requestManifestPath = requireOptionPath(taken.def.canonical, value);
|
|
977
973
|
return;
|
|
978
|
-
case "wait-ms": {
|
|
979
|
-
if (value === undefined || !/^[1-9]\d*$/.test(value.trim())) {
|
|
980
|
-
throw new CliUsageError("--wait-ms requires a positive safe-integer millisecond value");
|
|
981
|
-
}
|
|
982
|
-
const parsed = Number(value.trim());
|
|
983
|
-
if (!Number.isSafeInteger(parsed) || parsed < 1) {
|
|
984
|
-
throw new CliUsageError("--wait-ms requires a positive safe-integer millisecond value");
|
|
985
|
-
}
|
|
986
|
-
fields.waitWindowMs = parsed;
|
|
987
|
-
return;
|
|
988
|
-
}
|
|
989
974
|
case "issue": {
|
|
990
975
|
if (value === undefined || value.trim() === "") {
|
|
991
976
|
throw new CliUsageError("doctor --issue requires a positive integer");
|
|
@@ -1100,7 +1085,6 @@ export function parsePublicSeatArgv(
|
|
|
1100
1085
|
...(fields.prNumber === undefined ? {} : { prNumber: fields.prNumber }),
|
|
1101
1086
|
...(fields.repo === undefined ? {} : { repo: fields.repo }),
|
|
1102
1087
|
...(fields.requestManifestPath === undefined ? {} : { requestManifestPath: fields.requestManifestPath }),
|
|
1103
|
-
...(fields.waitWindowMs === undefined ? {} : { waitWindowMs: fields.waitWindowMs }),
|
|
1104
1088
|
...(fields.issueNumber === undefined ? {} : { issueNumber: fields.issueNumber }),
|
|
1105
1089
|
...(fields.runs === undefined ? {} : { runs: fields.runs }),
|
|
1106
1090
|
...(fields.sourceRun === undefined ? {} : { sourceRun: fields.sourceRun }),
|
|
@@ -1485,7 +1469,6 @@ export type PublicSeatParse = {
|
|
|
1485
1469
|
readonly prNumber?: number;
|
|
1486
1470
|
readonly repo?: string;
|
|
1487
1471
|
readonly requestManifestPath?: string;
|
|
1488
|
-
readonly waitWindowMs?: number;
|
|
1489
1472
|
readonly issueNumber?: number;
|
|
1490
1473
|
readonly runs?: string;
|
|
1491
1474
|
readonly sourceRun?: string;
|
|
@@ -1676,24 +1659,17 @@ export async function admitPublicRole(
|
|
|
1676
1659
|
attachmentPaths,
|
|
1677
1660
|
...project,
|
|
1678
1661
|
placedFields: async (placed) => {
|
|
1679
|
-
//
|
|
1680
|
-
const target = await resolveCollectorTarget({
|
|
1681
|
-
projectRoot,
|
|
1682
|
-
repository,
|
|
1683
|
-
...(explicitPrNumber === undefined ? {} : { explicitPrNumber }),
|
|
1684
|
-
});
|
|
1685
|
-
const prNumber = target.kind === "bound" ? target.prNumber : undefined;
|
|
1662
|
+
// #1088: explicit --pr only. Unbound PR is located by the LLM via host CLI.
|
|
1686
1663
|
let requestManifestPath: string | undefined;
|
|
1687
1664
|
if (manifestCanonicalJson !== undefined) {
|
|
1688
1665
|
requestManifestPath = join(placed.runDirectory, "request-manifest.json");
|
|
1689
1666
|
await writeFile(requestManifestPath, manifestCanonicalJson, "utf8");
|
|
1690
1667
|
}
|
|
1691
1668
|
return {
|
|
1692
|
-
...(
|
|
1669
|
+
...(explicitPrNumber === undefined ? {} : { prNumber: explicitPrNumber }),
|
|
1693
1670
|
repository: repository.canonical,
|
|
1694
1671
|
repositoryDisplay: repository.display,
|
|
1695
1672
|
...(requestManifestPath === undefined ? {} : { requestManifestPath }),
|
|
1696
|
-
...(parsed.waitWindowMs === undefined ? {} : { waitWindowMs: parsed.waitWindowMs }),
|
|
1697
1673
|
manifestDigest,
|
|
1698
1674
|
};
|
|
1699
1675
|
},
|
|
@@ -524,13 +524,12 @@ const COLLECTOR_OPTIONS = [
|
|
|
524
524
|
canonical: "--pr",
|
|
525
525
|
aliases: [],
|
|
526
526
|
valueMetavar: "number",
|
|
527
|
-
// #676 D1: optional when context uniquely determines the PR; ambiguous → require explicit.
|
|
528
527
|
required: false,
|
|
529
528
|
repeatable: false,
|
|
530
529
|
form: "option",
|
|
531
530
|
description: {
|
|
532
|
-
en: "Positive GitHub pull request number. Optional when
|
|
533
|
-
zh: "正整数 GitHub PR
|
|
531
|
+
en: "Positive GitHub pull request number. Optional when the Collector role locates the PR via host CLI from task materials.",
|
|
532
|
+
zh: "正整数 GitHub PR 号。可选;省略时由通进司经宿主 CLI 从任务材料自行定位。",
|
|
534
533
|
},
|
|
535
534
|
},
|
|
536
535
|
{
|
|
@@ -557,22 +556,8 @@ const COLLECTOR_OPTIONS = [
|
|
|
557
556
|
repeatable: false,
|
|
558
557
|
form: "option",
|
|
559
558
|
description: {
|
|
560
|
-
en: "Optional request manifest JSON path ({requests:[{id,body}]}).
|
|
561
|
-
zh: "可选 request manifest JSON 路径({requests:[{id,body}]}
|
|
562
|
-
},
|
|
563
|
-
},
|
|
564
|
-
{
|
|
565
|
-
id: "wait-ms",
|
|
566
|
-
owner: "collector",
|
|
567
|
-
canonical: "--wait-ms",
|
|
568
|
-
aliases: [],
|
|
569
|
-
valueMetavar: "ms",
|
|
570
|
-
required: false,
|
|
571
|
-
repeatable: false,
|
|
572
|
-
form: "option",
|
|
573
|
-
description: {
|
|
574
|
-
en: "Wait-window duration in milliseconds after the work step opens (default 600000 = 10 minutes). Does not require a code change to adjust.",
|
|
575
|
-
zh: "工作步骤开启后的等待窗时长(毫秒;默认 600000=十分钟)。改配置即可,无需改代码。",
|
|
559
|
+
en: "Optional request manifest JSON path ({requests:[{id,body}]}). Parsed for semantics and passed to the Collector as materials — not a machine collection directive.",
|
|
560
|
+
zh: "可选 request manifest JSON 路径({requests:[{id,body}]})。按语义解析后作为材料递给通进司,不是机器代收 finding 的指令。",
|
|
576
561
|
},
|
|
577
562
|
},
|
|
578
563
|
] as const satisfies readonly PublicOptionDefinition[];
|
|
@@ -42,13 +42,8 @@ import {
|
|
|
42
42
|
// COMPLIANCE_RESPONSE_ENTRY_TYPE remains for boundRetainedAuditResponse (call/result
|
|
43
43
|
// interval binding on historical session bytes). Provider-stop retain authority is Sitian.
|
|
44
44
|
import {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
COLLECTOR_READ_TOOL,
|
|
48
|
-
COLLECTOR_REQUEST_TOOL,
|
|
49
|
-
COLLECTOR_WAIT_TOOL,
|
|
50
|
-
} from "../collector-ledger.ts";
|
|
51
|
-
import { ENGINE_DETOUR_TOOL_NAME } from "../engine-detour.ts";
|
|
45
|
+
ENGINE_DETOUR_TOOL_NAME,
|
|
46
|
+
} from "../engine-detour.ts";
|
|
52
47
|
import {
|
|
53
48
|
projectEngineDetourToolUsageForPublicTerminal,
|
|
54
49
|
readEngineDetourToolUsage,
|
|
@@ -61,9 +56,6 @@ import {
|
|
|
61
56
|
JUDGE_OUTPUT_TOOL_NAME,
|
|
62
57
|
type JudgeVerdict,
|
|
63
58
|
} from "../package-contracts/judge-output.ts";
|
|
64
|
-
import {
|
|
65
|
-
COLLECTOR_OUTPUT_TOOL,
|
|
66
|
-
} from "../package-contracts/collector-output.ts";
|
|
67
59
|
import {
|
|
68
60
|
CODER_OUTPUT_TOOL_NAME,
|
|
69
61
|
FIXER_OUTPUT_TOOL_NAME,
|
|
@@ -80,7 +72,6 @@ import {
|
|
|
80
72
|
import {
|
|
81
73
|
packagedAuditToolName,
|
|
82
74
|
packagedDurableOfficerEntry,
|
|
83
|
-
packagedProjectsTargetBindRejection,
|
|
84
75
|
packagedRoleAcceptedOutputTool,
|
|
85
76
|
packagedRoleMetadata,
|
|
86
77
|
packagedSkipsGateOnInfrastructureStage,
|
|
@@ -97,11 +88,7 @@ import {
|
|
|
97
88
|
findLatestDurablePackagedRoleTerminal,
|
|
98
89
|
hasNavigatorInfrastructureFailureBase,
|
|
99
90
|
isAcceptedPackagedRoleTerminalResult,
|
|
100
|
-
isReceiptSettlementBindingClear,
|
|
101
|
-
NAVIGATOR_INVOCATION_ENTRY,
|
|
102
91
|
NAVIGATOR_ROUTE_PLAYBOOK_FAILURE_ENTRY,
|
|
103
|
-
parseInvocationMarkerIdentity,
|
|
104
|
-
type InvocationMarkerIdentity,
|
|
105
92
|
} from "../navigator-invocation-identity.ts";
|
|
106
93
|
import {
|
|
107
94
|
NO_RECEIPT_LIFECYCLE_ENTRY_TYPE,
|
|
@@ -1504,34 +1491,6 @@ function toolResultText(message: SessionMessage): string {
|
|
|
1504
1491
|
.trim();
|
|
1505
1492
|
}
|
|
1506
1493
|
|
|
1507
|
-
/**
|
|
1508
|
-
* #676 D1/J3: durable bind-target rejection on the current attempt → public no_receipt facts.
|
|
1509
|
-
* Callers must learn they need explicit --pr without opening the session 正本.
|
|
1510
|
-
* Authority is the latest bind-target toolResult only — a later success clears an earlier failure.
|
|
1511
|
-
*/
|
|
1512
|
-
function extractCollectorTargetBindRejection(
|
|
1513
|
-
entries: readonly SessionEntry[],
|
|
1514
|
-
): { readonly diagnostic: string; readonly code?: string } | undefined {
|
|
1515
|
-
for (let i = entries.length - 1; i >= 0; i -= 1) {
|
|
1516
|
-
const entry = entries[i];
|
|
1517
|
-
if (entry?.type !== "message") continue;
|
|
1518
|
-
const message = entry.message;
|
|
1519
|
-
if (message?.role !== "toolResult") continue;
|
|
1520
|
-
if (message.toolName !== COLLECTOR_BIND_TARGET_TOOL) continue;
|
|
1521
|
-
// Latest bind result wins: success means the attempt is no longer rejected.
|
|
1522
|
-
if (message.isError !== true) return undefined;
|
|
1523
|
-
const diagnostic = toolResultText(message);
|
|
1524
|
-
if (diagnostic.length === 0) return undefined;
|
|
1525
|
-
const details = message.details;
|
|
1526
|
-
const code =
|
|
1527
|
-
isRecord(details) && typeof details.code === "string" && details.code.trim() !== ""
|
|
1528
|
-
? details.code
|
|
1529
|
-
: undefined;
|
|
1530
|
-
return code === undefined ? { diagnostic } : { diagnostic, code };
|
|
1531
|
-
}
|
|
1532
|
-
return undefined;
|
|
1533
|
-
}
|
|
1534
|
-
|
|
1535
1494
|
type BoundErroredToolCandidate = {
|
|
1536
1495
|
candidate: unknown;
|
|
1537
1496
|
diagnostic: string;
|
|
@@ -1552,14 +1511,6 @@ function boundErroredToolCandidate(
|
|
|
1552
1511
|
: { candidate: bound.candidate, diagnostic, callIndex: bound.callIndex };
|
|
1553
1512
|
}
|
|
1554
1513
|
|
|
1555
|
-
/** Collector operational tools that fail closed via host infrastructure abort. */
|
|
1556
|
-
const COLLECTOR_INFRASTRUCTURE_TOOLS = new Set<string>([
|
|
1557
|
-
COLLECTOR_OBSERVE_TOOL,
|
|
1558
|
-
COLLECTOR_READ_TOOL,
|
|
1559
|
-
COLLECTOR_REQUEST_TOOL,
|
|
1560
|
-
COLLECTOR_WAIT_TOOL,
|
|
1561
|
-
]);
|
|
1562
|
-
|
|
1563
1514
|
/** Shared match/cause/identity knobs for session-principal infrastructure failures. */
|
|
1564
1515
|
type InfrastructureFailureSpec = Readonly<{
|
|
1565
1516
|
matchTool: (toolName: string) => boolean;
|
|
@@ -1567,22 +1518,11 @@ type InfrastructureFailureSpec = Readonly<{
|
|
|
1567
1518
|
identityName: string;
|
|
1568
1519
|
/**
|
|
1569
1520
|
* Errored results only count as infrastructure when the durable details carry
|
|
1570
|
-
* the typed navigator fact.
|
|
1571
|
-
* misuses (CollectorUnknownEvidenceError pointer bounces) as errored tool
|
|
1572
|
-
* results — those must not surface as CollectorInfrastructureError.
|
|
1521
|
+
* the typed navigator fact.
|
|
1573
1522
|
*/
|
|
1574
1523
|
requireInfrastructureFact?: (toolName: string) => boolean;
|
|
1575
1524
|
}>;
|
|
1576
1525
|
|
|
1577
|
-
const COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC: InfrastructureFailureSpec = {
|
|
1578
|
-
matchTool: (toolName) => COLLECTOR_INFRASTRUCTURE_TOOLS.has(toolName),
|
|
1579
|
-
cause: "activation",
|
|
1580
|
-
identityName: "CollectorInfrastructureError",
|
|
1581
|
-
// read alone has a correctable rejection mode (unknown/non-openable pointers);
|
|
1582
|
-
// only its typed infrastructure-failure fact counts as a real host failure.
|
|
1583
|
-
requireInfrastructureFact: (toolName) => toolName === COLLECTOR_READ_TOOL,
|
|
1584
|
-
};
|
|
1585
|
-
|
|
1586
1526
|
const ENGINE_DETOUR_INFRASTRUCTURE_FAILURE_SPEC: InfrastructureFailureSpec = {
|
|
1587
1527
|
matchTool: (toolName) => toolName === ENGINE_DETOUR_TOOL_NAME,
|
|
1588
1528
|
cause: "output",
|
|
@@ -1645,33 +1585,6 @@ async function readInfrastructureToolFailure(
|
|
|
1645
1585
|
}
|
|
1646
1586
|
}
|
|
1647
1587
|
|
|
1648
|
-
/**
|
|
1649
|
-
* Prefer a real Collector infrastructure tool failure already on the session
|
|
1650
|
-
* principal over a later secondary provider-stop (failure-honesty).
|
|
1651
|
-
* Observe/request/wait host failures keep their diagnostic identity (e.g. HTTP 404).
|
|
1652
|
-
*/
|
|
1653
|
-
export function extractCollectorInfrastructureFailure(
|
|
1654
|
-
entries: readonly SessionEntry[],
|
|
1655
|
-
): ControlledFailure | undefined {
|
|
1656
|
-
return extractInfrastructureToolFailure(
|
|
1657
|
-
entries,
|
|
1658
|
-
COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC,
|
|
1659
|
-
);
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
/** Read the bound session principal for a Collector infrastructure tool failure. */
|
|
1663
|
-
export async function readCollectorInfrastructureFailure(
|
|
1664
|
-
sessionFile: string,
|
|
1665
|
-
): Promise<ControlledFailure | undefined> {
|
|
1666
|
-
return readInfrastructureToolFailure(
|
|
1667
|
-
sessionFile,
|
|
1668
|
-
COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC,
|
|
1669
|
-
// Multi-attempt resume: only a current-attempt infrastructure failure
|
|
1670
|
-
// may preempt the current failure cause (#633).
|
|
1671
|
-
{ currentAttemptOnly: true },
|
|
1672
|
-
);
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
1588
|
/**
|
|
1676
1589
|
* Prefer a real engine-detour infrastructure tool failure already on the session
|
|
1677
1590
|
* principal over a later secondary provider-stop (failure-honesty / #357 T2).
|
|
@@ -1713,10 +1626,6 @@ const RUNNER_FAILURE_POLICY = {
|
|
|
1713
1626
|
read: readEngineDetourInfrastructureFailure,
|
|
1714
1627
|
rank: "record-first",
|
|
1715
1628
|
},
|
|
1716
|
-
"collector-known-first": {
|
|
1717
|
-
read: readCollectorInfrastructureFailure,
|
|
1718
|
-
rank: "known-first",
|
|
1719
|
-
},
|
|
1720
1629
|
} as const;
|
|
1721
1630
|
|
|
1722
1631
|
/**
|
|
@@ -2008,23 +1917,6 @@ export async function appendRunAttemptHistory(
|
|
|
2008
1917
|
} catch {}
|
|
2009
1918
|
}
|
|
2010
1919
|
|
|
2011
|
-
/**
|
|
2012
|
-
* Minimal attendance provenance against the bound marker (ADR 0043).
|
|
2013
|
-
* Keep only invocationId + post-terminal ordering. Runtime-self-produced
|
|
2014
|
-
* role/phase/subject/version are not re-reconciled here (ADR 0042).
|
|
2015
|
-
*/
|
|
2016
|
-
function navigatorAttendanceCorrelatedWithBoundMarker(
|
|
2017
|
-
details: Record<string, unknown>,
|
|
2018
|
-
attendanceIndex: number,
|
|
2019
|
-
terminalIndex: number,
|
|
2020
|
-
marker: InvocationMarkerIdentity,
|
|
2021
|
-
): boolean {
|
|
2022
|
-
if (attendanceIndex <= terminalIndex) return false;
|
|
2023
|
-
// Exact current invocation token is the bound marker principal.
|
|
2024
|
-
if (details.invocationId !== marker.invocationId) return false;
|
|
2025
|
-
return true;
|
|
2026
|
-
}
|
|
2027
|
-
|
|
2028
1920
|
function parseNavigatorAttendanceDetails(
|
|
2029
1921
|
details: Record<string, unknown>,
|
|
2030
1922
|
): TerminalNavigatorFact {
|
|
@@ -2303,10 +2195,9 @@ export function extractNavigatorFact(
|
|
|
2303
2195
|
function extractNavigatorAttendanceFact(
|
|
2304
2196
|
entries: readonly SessionEntry[],
|
|
2305
2197
|
): TerminalNavigatorFact {
|
|
2306
|
-
// Affirmative attendance only. Missing /
|
|
2307
|
-
//
|
|
2308
|
-
//
|
|
2309
|
-
// receipt settlement (isReceiptSettlementBindingClear), not attendance extraction.
|
|
2198
|
+
// Affirmative attendance only. Missing / unparseable is never no-advice.
|
|
2199
|
+
// The shared lifecycle places the settled event on this submission's closure;
|
|
2200
|
+
// an unrelated attendance message cannot supply another call's result.
|
|
2310
2201
|
const terminal = findLatestDurablePackagedRoleTerminal(entries);
|
|
2311
2202
|
if (terminal === undefined) {
|
|
2312
2203
|
return {
|
|
@@ -2316,57 +2207,12 @@ function extractNavigatorAttendanceFact(
|
|
|
2316
2207
|
};
|
|
2317
2208
|
}
|
|
2318
2209
|
|
|
2319
|
-
let
|
|
2320
|
-
for (let i = terminal.index - 1; i >= 0; i -= 1) {
|
|
2210
|
+
for (let i = terminal.index; i < entries.length; i += 1) {
|
|
2321
2211
|
const entry = entries[i];
|
|
2322
|
-
if (entry?.type
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
}
|
|
2327
|
-
if (markerIndex < 0) {
|
|
2328
|
-
return {
|
|
2329
|
-
disposition: "unavailable",
|
|
2330
|
-
source: "unknown",
|
|
2331
|
-
reason: "Navigator attendance is uncorrelated with session invocation facts",
|
|
2332
|
-
};
|
|
2333
|
-
}
|
|
2334
|
-
const marker = parseInvocationMarkerIdentity(entries[markerIndex]?.data);
|
|
2335
|
-
if (marker === undefined) {
|
|
2336
|
-
return {
|
|
2337
|
-
disposition: "unavailable",
|
|
2338
|
-
source: "unknown",
|
|
2339
|
-
reason: "Navigator attendance is uncorrelated with session invocation facts",
|
|
2340
|
-
};
|
|
2341
|
-
}
|
|
2342
|
-
|
|
2343
|
-
for (let i = entries.length - 1; i >= 0; i -= 1) {
|
|
2344
|
-
const entry = entries[i];
|
|
2345
|
-
if (entry?.type === "custom_message" && entry.customType === "ak-navigator-attendance") {
|
|
2346
|
-
const details = entry.message?.details ?? (entry as { details?: unknown }).details;
|
|
2347
|
-
if (!isRecord(details)) {
|
|
2348
|
-
return {
|
|
2349
|
-
disposition: "unavailable",
|
|
2350
|
-
source: "unknown",
|
|
2351
|
-
reason: "Navigator attendance is unparseable",
|
|
2352
|
-
};
|
|
2353
|
-
}
|
|
2354
|
-
if (
|
|
2355
|
-
!navigatorAttendanceCorrelatedWithBoundMarker(
|
|
2356
|
-
details,
|
|
2357
|
-
i,
|
|
2358
|
-
terminal.index,
|
|
2359
|
-
marker,
|
|
2360
|
-
)
|
|
2361
|
-
) {
|
|
2362
|
-
return {
|
|
2363
|
-
disposition: "unavailable",
|
|
2364
|
-
source: "unknown",
|
|
2365
|
-
reason: "Navigator attendance is uncorrelated with session invocation facts",
|
|
2366
|
-
};
|
|
2367
|
-
}
|
|
2368
|
-
return parseNavigatorAttendanceDetails(details);
|
|
2369
|
-
}
|
|
2212
|
+
if (entry?.type !== "custom" || entry.customType !== "ak-role-submission-closure") continue;
|
|
2213
|
+
const details = isRecord(entry.data) ? entry.data.navigator : undefined;
|
|
2214
|
+
if (!isRecord(details)) break;
|
|
2215
|
+
return parseNavigatorAttendanceDetails(details);
|
|
2370
2216
|
}
|
|
2371
2217
|
// Absence is not successful no-advice — require affirmative typed attendance.
|
|
2372
2218
|
return {
|
|
@@ -3391,18 +3237,6 @@ export async function settleFailureTerminalResult(
|
|
|
3391
3237
|
facts.attemptPointer === `current:${admitted.runDirectory}`
|
|
3392
3238
|
) {
|
|
3393
3239
|
let decisiveFacts: NoReceiptLifecycleFacts & Record<string, unknown> = facts;
|
|
3394
|
-
// #676 D1/J3: project durable bind-target rejection onto public no_receipt facts.
|
|
3395
|
-
if (packagedProjectsTargetBindRejection(admitted.role)) {
|
|
3396
|
-
const bindRejection = extractCollectorTargetBindRejection(entries.slice(attemptStart));
|
|
3397
|
-
if (bindRejection !== undefined) {
|
|
3398
|
-
decisiveFacts = {
|
|
3399
|
-
...facts,
|
|
3400
|
-
targetBindRejected: true,
|
|
3401
|
-
targetBindDiagnostic: bindRejection.diagnostic,
|
|
3402
|
-
...(bindRejection.code === undefined ? {} : { targetBindCode: bindRejection.code }),
|
|
3403
|
-
};
|
|
3404
|
-
}
|
|
3405
|
-
}
|
|
3406
3240
|
// #478: no_receipt is still a public Terminal — project accepted gate facts.
|
|
3407
3241
|
// #953: empty public terminal face — clear every reader-adoptable prior face.
|
|
3408
3242
|
await clearOppositeTerminalArtifactFace(admitted.runDirectory);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
|
-
import { createGhCollectorGitHubTransport } from "./collector-github.ts";
|
|
5
4
|
import { loadDoctorCase } from "./doctor-evidence.ts";
|
|
6
5
|
import { createNativeNavigatorSessionFactory, createNavigatorAttendance } from "./navigator-attendance.ts";
|
|
7
6
|
import { loadNavigatorWorkContext } from "./navigator-work-context.ts";
|
|
@@ -41,7 +40,6 @@ export function createRoleRuntimeDependencies(packageRoot: string): RoleRuntimeD
|
|
|
41
40
|
// packageRoot is the install root (resources/ lives there). Never resolve via
|
|
42
41
|
// import.meta.url — headless/acp production-host bundles live under dist/*/
|
|
43
42
|
// and would otherwise look for dist/resources/ (#962).
|
|
44
|
-
const collectorHandbookSeedPath = join(packageRoot, "resources/collector-bot-handbook.md");
|
|
45
43
|
const navigatorSessionFactory = createNativeNavigatorSessionFactory();
|
|
46
44
|
return {
|
|
47
45
|
packageRoot,
|
|
@@ -49,8 +47,6 @@ export function createRoleRuntimeDependencies(packageRoot: string): RoleRuntimeD
|
|
|
49
47
|
loadRoleSoul: loadRegisteredRoleSoul,
|
|
50
48
|
loadFixPacket: (path) => readFile(path, "utf8"),
|
|
51
49
|
loadCoderTask: (path) => readFile(path, "utf8"),
|
|
52
|
-
loadCollectorHandbookSeed: () => readFile(collectorHandbookSeedPath, "utf8"),
|
|
53
|
-
createCollectorTransport: () => createGhCollectorGitHubTransport(),
|
|
54
50
|
loadDoctorCase,
|
|
55
51
|
loadNotarySourceRun: loadNotarySourceRunLocator,
|
|
56
52
|
loadMergerInput: async (path) => JSON.parse(await readFile(path, "utf8")),
|