@claudexor/schema 2.1.2 → 3.0.0

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 (174) hide show
  1. package/dist/agent-capabilities.d.ts +32 -24
  2. package/dist/agent-capabilities.d.ts.map +1 -1
  3. package/dist/agent-capabilities.js +20 -11
  4. package/dist/agent-capabilities.js.map +1 -1
  5. package/dist/apply-eligibility.d.ts +166 -0
  6. package/dist/apply-eligibility.d.ts.map +1 -1
  7. package/dist/apply-eligibility.js +63 -2
  8. package/dist/apply-eligibility.js.map +1 -1
  9. package/dist/attachment.d.ts +5 -5
  10. package/dist/budget.d.ts +4 -4
  11. package/dist/config.d.ts +59 -41
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +16 -6
  14. package/dist/config.js.map +1 -1
  15. package/dist/context.d.ts +6 -6
  16. package/dist/control-operation-responses.d.ts +190 -97
  17. package/dist/control-operation-responses.d.ts.map +1 -1
  18. package/dist/control-operation-responses.js +14 -1
  19. package/dist/control-operation-responses.js.map +1 -1
  20. package/dist/control-run-detail.d.ts +380 -215
  21. package/dist/control-run-detail.d.ts.map +1 -1
  22. package/dist/control-run-detail.js +54 -8
  23. package/dist/control-run-detail.js.map +1 -1
  24. package/dist/control-thread-apply.d.ts +5 -5
  25. package/dist/control-trust.d.ts +6 -6
  26. package/dist/control.d.ts +769 -323
  27. package/dist/control.d.ts.map +1 -1
  28. package/dist/control.js +164 -71
  29. package/dist/control.js.map +1 -1
  30. package/dist/credential-profile.d.ts +400 -1
  31. package/dist/credential-profile.d.ts.map +1 -1
  32. package/dist/credential-profile.js +109 -4
  33. package/dist/credential-profile.js.map +1 -1
  34. package/dist/decision.d.ts +78 -14
  35. package/dist/decision.d.ts.map +1 -1
  36. package/dist/decision.js +53 -20
  37. package/dist/decision.js.map +1 -1
  38. package/dist/delivery.d.ts +3 -3
  39. package/dist/delivery.js +1 -1
  40. package/dist/delivery.js.map +1 -1
  41. package/dist/events.d.ts +32 -6
  42. package/dist/events.d.ts.map +1 -1
  43. package/dist/events.js +46 -11
  44. package/dist/events.js.map +1 -1
  45. package/dist/gate.d.ts +4 -4
  46. package/dist/gate.d.ts.map +1 -1
  47. package/dist/gate.js +2 -2
  48. package/dist/gate.js.map +1 -1
  49. package/dist/harness.d.ts +137 -47
  50. package/dist/harness.d.ts.map +1 -1
  51. package/dist/harness.js +65 -16
  52. package/dist/harness.js.map +1 -1
  53. package/dist/index.d.ts +4 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +4 -3
  56. package/dist/index.js.map +1 -1
  57. package/dist/operation.d.ts +66 -7
  58. package/dist/operation.d.ts.map +1 -1
  59. package/dist/operation.js +29 -2
  60. package/dist/operation.js.map +1 -1
  61. package/dist/output-schema.d.ts +40 -0
  62. package/dist/output-schema.d.ts.map +1 -0
  63. package/dist/output-schema.js +109 -0
  64. package/dist/output-schema.js.map +1 -0
  65. package/dist/plan.d.ts +206 -0
  66. package/dist/plan.d.ts.map +1 -0
  67. package/dist/plan.js +107 -0
  68. package/dist/plan.js.map +1 -0
  69. package/dist/primitives.d.ts +14 -10
  70. package/dist/primitives.d.ts.map +1 -1
  71. package/dist/primitives.js +14 -11
  72. package/dist/primitives.js.map +1 -1
  73. package/dist/project.d.ts +75 -0
  74. package/dist/project.d.ts.map +1 -1
  75. package/dist/project.js +17 -0
  76. package/dist/project.js.map +1 -1
  77. package/dist/quota.d.ts +119 -0
  78. package/dist/quota.d.ts.map +1 -1
  79. package/dist/quota.js +22 -0
  80. package/dist/quota.js.map +1 -1
  81. package/dist/raw.d.ts +4 -4
  82. package/dist/readiness.d.ts +14 -7
  83. package/dist/readiness.d.ts.map +1 -1
  84. package/dist/run-strategy.d.ts +17 -0
  85. package/dist/run-strategy.d.ts.map +1 -0
  86. package/dist/run-strategy.js +47 -0
  87. package/dist/run-strategy.js.map +1 -0
  88. package/dist/setup.d.ts +160 -160
  89. package/dist/status-projection.d.ts +78 -0
  90. package/dist/status-projection.d.ts.map +1 -0
  91. package/dist/status-projection.js +171 -0
  92. package/dist/status-projection.js.map +1 -0
  93. package/dist/task.d.ts +48 -316
  94. package/dist/task.d.ts.map +1 -1
  95. package/dist/task.js +3 -60
  96. package/dist/task.js.map +1 -1
  97. package/dist/telemetry.d.ts +89 -89
  98. package/dist/thread.d.ts +167 -32
  99. package/dist/thread.d.ts.map +1 -1
  100. package/dist/thread.js +92 -28
  101. package/dist/thread.js.map +1 -1
  102. package/dist/tool-ref.d.ts +1 -1
  103. package/generated/AgentCapabilityCatalog.schema.json +4 -6
  104. package/generated/ApplyEligibility.schema.json +1 -1
  105. package/generated/BudgetLease.schema.json +1 -2
  106. package/generated/ConformanceReport.schema.json +1 -2
  107. package/generated/ContinuityDisclosure.schema.json +74 -0
  108. package/generated/ControlApplyRequest.schema.json +1 -2
  109. package/generated/ControlCredentialProfileUpdateRequest.schema.json +20 -0
  110. package/generated/ControlCredentialProfileUpdateResponse.schema.json +142 -0
  111. package/generated/ControlCredentialProfilesResponse.schema.json +126 -2
  112. package/generated/ControlDeliveryResponse.schema.json +0 -1
  113. package/generated/ControlHandshakeResponse.schema.json +31 -3
  114. package/generated/ControlHarnessListResponse.schema.json +11 -6
  115. package/generated/ControlHarnessSettingsPatch.schema.json +4 -0
  116. package/generated/ControlOperationCatalog.schema.json +16 -1
  117. package/generated/ControlOperationDescriptor.schema.json +15 -0
  118. package/generated/ControlProject.schema.json +35 -0
  119. package/generated/ControlProjectListResponse.schema.json +35 -0
  120. package/generated/ControlProjectOutputsResponse.schema.json +57 -0
  121. package/generated/ControlQueuedRunInfo.schema.json +2 -11
  122. package/generated/ControlQuotaResponse.schema.json +42 -0
  123. package/generated/ControlRunAgainDraft.schema.json +37 -35
  124. package/generated/ControlRunDecisionRequest.schema.json +0 -1
  125. package/generated/ControlRunDetail.schema.json +305 -213
  126. package/generated/ControlRunListResponse.schema.json +88 -27
  127. package/generated/ControlRunStartRequest.schema.json +37 -35
  128. package/generated/ControlRunStartResponse.schema.json +2 -11
  129. package/generated/ControlRunSummary.schema.json +88 -27
  130. package/generated/ControlSettingsSnapshot.schema.json +6 -11
  131. package/generated/ControlSettingsUpdateRequest.schema.json +5 -10
  132. package/generated/ControlThread.schema.json +21 -3
  133. package/generated/ControlThreadApplyResponse.schema.json +0 -1
  134. package/generated/ControlThreadCreateRequest.schema.json +12 -3
  135. package/generated/ControlThreadDetail.schema.json +174 -16
  136. package/generated/ControlThreadListResponse.schema.json +60 -3
  137. package/generated/ControlThreadTurnRequest.schema.json +40 -34
  138. package/generated/ControlThreadUpdateRequest.schema.json +19 -0
  139. package/generated/DecisionRecord.schema.json +73 -33
  140. package/generated/GateResult.schema.json +1 -2
  141. package/generated/GlobalConfig.schema.json +7 -12
  142. package/generated/HarnessManifest.schema.json +11 -6
  143. package/generated/HarnessStatusDto.schema.json +11 -6
  144. package/generated/LaneCheckpoint.schema.json +59 -0
  145. package/generated/McpRunHandleResult.schema.json +234 -0
  146. package/generated/McpRunToolResult.schema.json +124 -2
  147. package/generated/RoutePrimaryDivergedPayload.schema.json +56 -0
  148. package/generated/RunEvent.schema.json +10 -5
  149. package/generated/RunTelemetry.schema.json +2 -4
  150. package/generated/TaskContract.schema.json +3 -135
  151. package/generated/Thread.schema.json +21 -3
  152. package/generated/ThreadTurn.schema.json +88 -0
  153. package/package.json +2 -2
  154. package/dist/control-spec.d.ts +0 -592
  155. package/dist/control-spec.d.ts.map +0 -1
  156. package/dist/control-spec.js +0 -85
  157. package/dist/control-spec.js.map +0 -1
  158. package/dist/orchestrate.d.ts +0 -556
  159. package/dist/orchestrate.d.ts.map +0 -1
  160. package/dist/orchestrate.js +0 -356
  161. package/dist/orchestrate.js.map +0 -1
  162. package/dist/spec.d.ts +0 -678
  163. package/dist/spec.d.ts.map +0 -1
  164. package/dist/spec.js +0 -186
  165. package/dist/spec.js.map +0 -1
  166. package/generated/ControlSpecAnswersRequest.schema.json +0 -74
  167. package/generated/ControlSpecQuestionsRequest.schema.json +0 -206
  168. package/generated/ControlSpecSession.schema.json +0 -249
  169. package/generated/ControlSpecSessionListResponse.schema.json +0 -261
  170. package/generated/OrchestrateContract.schema.json +0 -119
  171. package/generated/OrchestratePlan.schema.json +0 -264
  172. package/generated/OrchestratePlanProgress.schema.json +0 -164
  173. package/generated/SessionReboundLineage.schema.json +0 -73
  174. package/generated/SpecPack.schema.json +0 -483
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import type { RunApplyState } from "./control.js";
3
+ import type { RunOutcomeFacts, RunReason } from "./decision.js";
4
+ /**
5
+ * THE single status-projection owner (v3 axes, D8/D18): every surface — CLI,
6
+ * control-api, MCP, ACP, macOS — projects run state through these helpers.
7
+ * Nobody re-derives labels, exit codes, stop reasons, terminal sets, or
8
+ * needs-decision from raw fields (INV-134: one presentational owner per
9
+ * fact; codex plan-review finding 7).
10
+ */
11
+ /** Job/run lifecycle: how far the PROCESS got. Outcome quality lives on the
12
+ * independent axes in RunOutcomeFacts — "blocked" is not a lifecycle. */
13
+ export declare const RunLifecycle: z.ZodEnum<["queued", "running", "succeeded", "failed", "cancelled", "interrupted"]>;
14
+ export type RunLifecycle = z.infer<typeof RunLifecycle>;
15
+ export declare const TERMINAL_LIFECYCLES: ReadonlySet<RunLifecycle>;
16
+ export declare function isTerminalLifecycle(state: string): boolean;
17
+ /** Process exit policy: the LIFECYCLE is the exit code. A finished run with
18
+ * open review findings exits 0 — "Done · needs review" is done; whether the
19
+ * result may be APPLIED is applyEligibility's answer, never the exit code. */
20
+ export declare function processExitCode(lifecycle: string): number;
21
+ /** The D8 user-facing label for a terminal run (English-only, INV-141). */
22
+ export declare function runOutcomeLabel(facts: RunOutcomeFacts): string;
23
+ /**
24
+ * THE single owner of the server-owned OUTCOME BANNER (D18): the one honest
25
+ * headline a surface shows above any model prose, so free-text from the harness
26
+ * can never outrank the arbitrated truth. It folds the terminal outcome quality
27
+ * (runOutcomeLabel) together with the delivery/apply state (RunApplyState) into
28
+ * one line — e.g. "Candidate ready — NOT APPLIED", "Applied", "Needs review".
29
+ *
30
+ * The delivery suffix ("— NOT APPLIED") is only appended when there is actually
31
+ * something to apply (`hasApplyableChange` — an unapplied patch candidate);
32
+ * answer/plan/report runs carry no apply affordance, so their banner is the
33
+ * outcome quality alone. Null while the run is not terminal (no honest headline
34
+ * yet). Every surface — CLI print, control-api ControlRunDetail, macOS Outcome
35
+ * tab — renders THIS, never its own.
36
+ */
37
+ export declare function outcomeBanner(facts: RunOutcomeFacts | null, delivery: {
38
+ applyState: RunApplyState;
39
+ hasApplyableChange: boolean;
40
+ }): string | null;
41
+ /**
42
+ * THE single owner of the continuity disclosure line (INV-137). Every surface
43
+ * — CLI print, macOS turn card, ACP — renders continuity through this helper
44
+ * so the phrasing never diverges. Returns null for the cases with nothing to
45
+ * disclose (a fresh first turn, or a plain in-lane native resume that carried
46
+ * no packet); a lane switch or a hydrated gap always yields a visible line.
47
+ */
48
+ export declare function continuityLabel(disclosure: {
49
+ kind: "native_resume" | "packet" | "fresh";
50
+ packetTurns?: number;
51
+ summarized?: boolean;
52
+ laneSwitchedFrom?: {
53
+ harness: string;
54
+ profileId?: string | null;
55
+ } | null;
56
+ }): string | null;
57
+ /** True when a terminal run is waiting on a human decision: finished work
58
+ * whose review blocked or checks failed, with no valid operator decision
59
+ * recorded yet. The ONE producer of the needs-me/inbox signal. */
60
+ export declare function needsDecision(facts: RunOutcomeFacts, hasValidOperatorDecision: boolean): boolean;
61
+ /** ACP stop-reason projection (3-bucket collapse, unchanged semantics). */
62
+ export declare function acpStopReason(lifecycle: string): "cancelled" | "refusal" | "end_turn";
63
+ /** Build a full RunOutcomeFacts from a lifecycle + optional partial axes,
64
+ * filling the honest defaults (no_changes-neutral, checks not_configured,
65
+ * review not_run, reason null). The ONE constructor used by terminal writers
66
+ * that don't already hold a facts record (executor-forced terminals, budget
67
+ * stops, failure-only terminals). */
68
+ export declare function makeOutcomeFacts(lifecycle: RunOutcomeFacts["lifecycle"], partial?: Partial<Omit<RunOutcomeFacts, "lifecycle">>): RunOutcomeFacts;
69
+ /** Coarse RunReason for a run that has NO decision.facts to project (a
70
+ * pre-arbitration failure: plan/readonly/enqueue/harness crash). Keyed on the
71
+ * typed failure category + lifecycle so a surface still shows an honest reason.
72
+ * Runs WITH a decision project decision.facts directly; this is the fallback. */
73
+ export declare function reasonFromFailureCategory(lifecycle: RunOutcomeFacts["lifecycle"], category: string | null | undefined): RunReason | null;
74
+ /** Derive RunOutcomeFacts for a decision-less terminal from its typed failure
75
+ * category + lifecycle. summarizeRun uses this ONLY when decision.facts is
76
+ * absent; it lives next to the projection owner so no surface re-derives. */
77
+ export declare function outcomeFactsFromFailure(lifecycle: RunOutcomeFacts["lifecycle"], category: string | null | undefined): RunOutcomeFacts;
78
+ //# sourceMappingURL=status-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-projection.d.ts","sourceRoot":"","sources":["../src/status-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEhE;;;;;;GAMG;AAEH;yEACyE;AACzE,eAAO,MAAM,YAAY,qFAItB,CAAC;AACJ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,YAAY,CAK/C,CAAC;AAEZ,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;8EAE8E;AAC9E,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkB9D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,QAAQ,EAAE;IAAE,UAAU,EAAE,aAAa,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAE,GACnE,MAAM,GAAG,IAAI,CAyBf;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAC1C,IAAI,EAAE,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1E,GAAG,MAAM,GAAG,IAAI,CAShB;AAED;;kEAEkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,OAAO,GAAG,OAAO,CAMhG;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAIrF;AAED;;;;qCAIqC;AACrC,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,EACvC,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAM,GACxD,eAAe,CAQjB;AAED;;;iFAGiF;AACjF,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,EACvC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,SAAS,GAAG,IAAI,CAYlB;AAED;;6EAE6E;AAC7E,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,EACvC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,eAAe,CAEjB"}
@@ -0,0 +1,171 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * THE single status-projection owner (v3 axes, D8/D18): every surface — CLI,
4
+ * control-api, MCP, ACP, macOS — projects run state through these helpers.
5
+ * Nobody re-derives labels, exit codes, stop reasons, terminal sets, or
6
+ * needs-decision from raw fields (INV-134: one presentational owner per
7
+ * fact; codex plan-review finding 7).
8
+ */
9
+ /** Job/run lifecycle: how far the PROCESS got. Outcome quality lives on the
10
+ * independent axes in RunOutcomeFacts — "blocked" is not a lifecycle. */
11
+ export const RunLifecycle = z
12
+ .enum(["queued", "running", "succeeded", "failed", "cancelled", "interrupted"])
13
+ .describe("Run lifecycle: queued, running, then exactly one of succeeded / failed / cancelled / interrupted. Outcome quality (checks, review, delivery) is orthogonal.");
14
+ export const TERMINAL_LIFECYCLES = new Set([
15
+ "succeeded",
16
+ "failed",
17
+ "cancelled",
18
+ "interrupted",
19
+ ]);
20
+ export function isTerminalLifecycle(state) {
21
+ return TERMINAL_LIFECYCLES.has(state);
22
+ }
23
+ /** Process exit policy: the LIFECYCLE is the exit code. A finished run with
24
+ * open review findings exits 0 — "Done · needs review" is done; whether the
25
+ * result may be APPLIED is applyEligibility's answer, never the exit code. */
26
+ export function processExitCode(lifecycle) {
27
+ return lifecycle === "succeeded" ? 0 : 1;
28
+ }
29
+ /** The D8 user-facing label for a terminal run (English-only, INV-141). */
30
+ export function runOutcomeLabel(facts) {
31
+ switch (facts.lifecycle) {
32
+ case "failed":
33
+ return facts.reason ? `Failed (${facts.reason.replaceAll("_", " ")})` : "Failed";
34
+ case "cancelled":
35
+ return "Cancelled";
36
+ case "interrupted":
37
+ return "Interrupted";
38
+ case "succeeded":
39
+ break;
40
+ default:
41
+ return "Working";
42
+ }
43
+ if (facts.review === "blocked" || facts.checks === "failed")
44
+ return "Needs review";
45
+ if (facts.review === "not_run" || facts.checks === "not_configured") {
46
+ return "Done · not verified";
47
+ }
48
+ return "Done";
49
+ }
50
+ /**
51
+ * THE single owner of the server-owned OUTCOME BANNER (D18): the one honest
52
+ * headline a surface shows above any model prose, so free-text from the harness
53
+ * can never outrank the arbitrated truth. It folds the terminal outcome quality
54
+ * (runOutcomeLabel) together with the delivery/apply state (RunApplyState) into
55
+ * one line — e.g. "Candidate ready — NOT APPLIED", "Applied", "Needs review".
56
+ *
57
+ * The delivery suffix ("— NOT APPLIED") is only appended when there is actually
58
+ * something to apply (`hasApplyableChange` — an unapplied patch candidate);
59
+ * answer/plan/report runs carry no apply affordance, so their banner is the
60
+ * outcome quality alone. Null while the run is not terminal (no honest headline
61
+ * yet). Every surface — CLI print, control-api ControlRunDetail, macOS Outcome
62
+ * tab — renders THIS, never its own.
63
+ */
64
+ export function outcomeBanner(facts, delivery) {
65
+ if (!facts)
66
+ return null; // not terminal — no honest headline yet
67
+ if (facts.lifecycle !== "succeeded")
68
+ return runOutcomeLabel(facts);
69
+ switch (delivery.applyState) {
70
+ case "applied":
71
+ return "Applied";
72
+ case "applied_review_blocked":
73
+ return "Applied · review blocked";
74
+ case "reverted":
75
+ return "Reverted — changes rolled back";
76
+ case "not_applied":
77
+ break;
78
+ }
79
+ const needsReview = facts.review === "blocked" || facts.checks === "failed";
80
+ const unverified = facts.review === "not_run" || facts.checks === "not_configured";
81
+ // Nothing to apply (answer / plan / report / no changes): the quality alone.
82
+ if (!delivery.hasApplyableChange) {
83
+ if (needsReview)
84
+ return "Needs review";
85
+ if (unverified)
86
+ return "Done · not verified";
87
+ return "Done";
88
+ }
89
+ // A patch candidate exists but has NOT been applied — always disclose that.
90
+ if (needsReview)
91
+ return "Needs review — NOT APPLIED";
92
+ if (unverified)
93
+ return "Candidate ready · not verified — NOT APPLIED";
94
+ return "Candidate ready — NOT APPLIED";
95
+ }
96
+ /**
97
+ * THE single owner of the continuity disclosure line (INV-137). Every surface
98
+ * — CLI print, macOS turn card, ACP — renders continuity through this helper
99
+ * so the phrasing never diverges. Returns null for the cases with nothing to
100
+ * disclose (a fresh first turn, or a plain in-lane native resume that carried
101
+ * no packet); a lane switch or a hydrated gap always yields a visible line.
102
+ */
103
+ export function continuityLabel(disclosure) {
104
+ if (disclosure.kind !== "packet")
105
+ return null;
106
+ const turns = disclosure.packetTurns ?? 0;
107
+ const noun = turns === 1 ? "turn" : "turns";
108
+ let line = `continued with thread context · ${turns} ${noun}`;
109
+ if (disclosure.summarized)
110
+ line += " (older turns condensed)";
111
+ if (disclosure.laneSwitchedFrom)
112
+ line += ` · switched from ${disclosure.laneSwitchedFrom.harness}`;
113
+ return line;
114
+ }
115
+ /** True when a terminal run is waiting on a human decision: finished work
116
+ * whose review blocked or checks failed, with no valid operator decision
117
+ * recorded yet. The ONE producer of the needs-me/inbox signal. */
118
+ export function needsDecision(facts, hasValidOperatorDecision) {
119
+ return (facts.lifecycle === "succeeded" &&
120
+ (facts.review === "blocked" || facts.checks === "failed") &&
121
+ !hasValidOperatorDecision);
122
+ }
123
+ /** ACP stop-reason projection (3-bucket collapse, unchanged semantics). */
124
+ export function acpStopReason(lifecycle) {
125
+ if (lifecycle === "cancelled")
126
+ return "cancelled";
127
+ if (lifecycle === "failed" || lifecycle === "interrupted")
128
+ return "refusal";
129
+ return "end_turn";
130
+ }
131
+ /** Build a full RunOutcomeFacts from a lifecycle + optional partial axes,
132
+ * filling the honest defaults (no_changes-neutral, checks not_configured,
133
+ * review not_run, reason null). The ONE constructor used by terminal writers
134
+ * that don't already hold a facts record (executor-forced terminals, budget
135
+ * stops, failure-only terminals). */
136
+ export function makeOutcomeFacts(lifecycle, partial = {}) {
137
+ return {
138
+ lifecycle,
139
+ noChanges: partial.noChanges ?? false,
140
+ checks: partial.checks ?? "not_configured",
141
+ review: partial.review ?? "not_run",
142
+ reason: partial.reason ?? null,
143
+ };
144
+ }
145
+ /** Coarse RunReason for a run that has NO decision.facts to project (a
146
+ * pre-arbitration failure: plan/readonly/enqueue/harness crash). Keyed on the
147
+ * typed failure category + lifecycle so a surface still shows an honest reason.
148
+ * Runs WITH a decision project decision.facts directly; this is the fallback. */
149
+ export function reasonFromFailureCategory(lifecycle, category) {
150
+ if (lifecycle === "cancelled")
151
+ return "user_cancelled";
152
+ if (lifecycle === "interrupted")
153
+ return "crash_interrupted";
154
+ if (lifecycle !== "failed")
155
+ return null;
156
+ switch (category) {
157
+ case "budget":
158
+ return "budget_exhausted";
159
+ case "cancelled":
160
+ return "user_cancelled";
161
+ default:
162
+ return "harness_failed";
163
+ }
164
+ }
165
+ /** Derive RunOutcomeFacts for a decision-less terminal from its typed failure
166
+ * category + lifecycle. summarizeRun uses this ONLY when decision.facts is
167
+ * absent; it lives next to the projection owner so no surface re-derives. */
168
+ export function outcomeFactsFromFailure(lifecycle, category) {
169
+ return makeOutcomeFacts(lifecycle, { reason: reasonFromFailureCategory(lifecycle, category) });
170
+ }
171
+ //# sourceMappingURL=status-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-projection.js","sourceRoot":"","sources":["../src/status-projection.ts"],"names":[],"mappings":"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"}