@wildorder/nightshift 0.16.0 → 0.17.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 (50) hide show
  1. package/README.md +20 -0
  2. package/dist/agent-runner.d.ts +56 -4
  3. package/dist/agent-runner.d.ts.map +1 -1
  4. package/dist/agent-runner.js +253 -28
  5. package/dist/agent-runner.js.map +1 -1
  6. package/dist/author.d.ts +8 -0
  7. package/dist/author.d.ts.map +1 -1
  8. package/dist/author.js +84 -57
  9. package/dist/author.js.map +1 -1
  10. package/dist/causal-analysis.d.ts +212 -0
  11. package/dist/causal-analysis.d.ts.map +1 -0
  12. package/dist/causal-analysis.js +733 -0
  13. package/dist/causal-analysis.js.map +1 -0
  14. package/dist/decider-review.d.ts +6 -1
  15. package/dist/decider-review.d.ts.map +1 -1
  16. package/dist/decider-review.js +19 -7
  17. package/dist/decider-review.js.map +1 -1
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/preflight.d.ts +3 -0
  23. package/dist/preflight.d.ts.map +1 -1
  24. package/dist/preflight.js +73 -57
  25. package/dist/preflight.js.map +1 -1
  26. package/dist/prompt-telemetry.d.ts +64 -0
  27. package/dist/prompt-telemetry.d.ts.map +1 -0
  28. package/dist/prompt-telemetry.js +112 -0
  29. package/dist/prompt-telemetry.js.map +1 -0
  30. package/dist/provider-telemetry.d.ts +106 -0
  31. package/dist/provider-telemetry.d.ts.map +1 -0
  32. package/dist/provider-telemetry.js +423 -0
  33. package/dist/provider-telemetry.js.map +1 -0
  34. package/dist/run-analytics-report.d.ts +173 -0
  35. package/dist/run-analytics-report.d.ts.map +1 -0
  36. package/dist/run-analytics-report.js +650 -0
  37. package/dist/run-analytics-report.js.map +1 -0
  38. package/dist/run-analytics.d.ts +738 -0
  39. package/dist/run-analytics.d.ts.map +1 -0
  40. package/dist/run-analytics.js +545 -0
  41. package/dist/run-analytics.js.map +1 -0
  42. package/dist/run-program.d.ts +69 -1
  43. package/dist/run-program.d.ts.map +1 -1
  44. package/dist/run-program.js +1254 -714
  45. package/dist/run-program.js.map +1 -1
  46. package/dist/whole-program-review.d.ts +3 -0
  47. package/dist/whole-program-review.d.ts.map +1 -1
  48. package/dist/whole-program-review.js +8 -1
  49. package/dist/whole-program-review.js.map +1 -1
  50. package/package.json +2 -2
@@ -0,0 +1,212 @@
1
+ import { type AgentRunner } from "./agent-runner.js";
2
+ import type { NightshiftConfig } from "./config.js";
3
+ import type { DecisionLedgerView } from "./decision-ledger.js";
4
+ import type { ProgramManifest } from "./manifest.js";
5
+ import { type PermitsContext } from "./permits.js";
6
+ import { type PromptComponentSize } from "./prompt-telemetry.js";
7
+ import { type RunAnalytics, type RunRecorder } from "./run-analytics.js";
8
+ import { aggregateRunAnalytics, type RunAnalyticsSummary } from "./run-analytics-report.js";
9
+ export interface WorkstreamTimelineEntry {
10
+ id: string;
11
+ name: string;
12
+ /** The caller's own outcome-status vocabulary, verbatim. */
13
+ status: string;
14
+ reason?: string;
15
+ failureDiagnoses?: ReadonlyArray<{
16
+ attempt: string;
17
+ verdict: string;
18
+ }>;
19
+ testCritique?: {
20
+ stopReason: string;
21
+ roundsRun: number;
22
+ openSubjects: readonly string[];
23
+ resolvedSubjects: readonly string[];
24
+ };
25
+ }
26
+ /**
27
+ * One workstream's actual spec-file content, as read by the caller from
28
+ * `taskFile` (SC-12: the analyzer must consume the specifications
29
+ * themselves, not merely a path to them). `spec` is `undefined` when the
30
+ * file could not be read — an honest per-workstream gap, never a thrown run
31
+ * (fail-open, SC-13).
32
+ */
33
+ export interface WorkstreamSpecInput {
34
+ id: string;
35
+ name: string;
36
+ taskFile: string;
37
+ spec?: string;
38
+ }
39
+ /** Combines every workstream's spec content into one labelled block, ready for the caller to clip like the diff and program narrative. Pure. */
40
+ export declare function combineWorkstreamSpecs(specs: readonly WorkstreamSpecInput[]): string;
41
+ export type HandleKind = "span" | "point" | "evidence" | "ledger-event" | "bucket" | "workstream" | "verify-command";
42
+ export interface HandleEntry {
43
+ kind: HandleKind;
44
+ /** A duration, a count, a coverage label, a ledger claim — resolved from the snapshot/summary/ledger, never authored by a model. */
45
+ value: string;
46
+ }
47
+ /** span, point, evidence, and ledger-event handles are concrete observations; bucket/workstream/verify-command are category labels — context, never support on their own (D2). */
48
+ export declare function isConcreteHandleKind(kind: HandleKind): boolean;
49
+ export type HandleRegistry = ReadonlyMap<string, HandleEntry>;
50
+ /**
51
+ * Builds the citable-handle registry from what this run actually observed
52
+ * (D2): every span and point id in `snapshot`, every `EvidenceReference.ref`
53
+ * carried on them, every ledger event id, and — only when the run actually
54
+ * has a span under them — bucket, workstream, and verify-command category
55
+ * labels sourced from `summary`'s own already-observed groupings. Pure,
56
+ * deterministic; never a static vocabulary dump.
57
+ */
58
+ export declare function buildHandleRegistry(snapshot: RunAnalytics, summary: RunAnalyticsSummary, ledger: DecisionLedgerView): HandleRegistry;
59
+ export interface CausalStep {
60
+ claim: string;
61
+ cites: string[];
62
+ from?: string;
63
+ to?: string;
64
+ }
65
+ export interface PlanningConstraint {
66
+ constraint: string;
67
+ cites: string[];
68
+ }
69
+ export interface CausalAnalysisReply {
70
+ interpretation: CausalStep[];
71
+ constraints: PlanningConstraint[];
72
+ unresolved: string[];
73
+ /** Malformed-block errors. Reported, never fatal. */
74
+ errors: string[];
75
+ /** True when none of the three fenced blocks appeared at all — the analyzer-error path. */
76
+ blockless: boolean;
77
+ }
78
+ /** Parses the analyzer's three-layer reply. Total: a missing block is empty, malformed JSON is a recorded error and an empty layer, and a reply with none of the three blocks is `blockless` — the analyzer-error path (§3.4). */
79
+ export declare function parseCausalAnalysis(output: string): CausalAnalysisReply;
80
+ export interface ResolvedCitation {
81
+ handle: string;
82
+ kind: HandleKind;
83
+ value: string;
84
+ }
85
+ export interface ValidatedClaim<T> {
86
+ source: T;
87
+ resolved: ResolvedCitation[];
88
+ unresolvedCites: string[];
89
+ supported: boolean;
90
+ }
91
+ export interface ValidatedCausalAnalysis {
92
+ supportedSteps: ValidatedClaim<CausalStep>[];
93
+ unsupportedSteps: ValidatedClaim<CausalStep>[];
94
+ supportedConstraints: ValidatedClaim<PlanningConstraint>[];
95
+ unsupportedConstraints: ValidatedClaim<PlanningConstraint>[];
96
+ }
97
+ /** The deterministic gate: proves every rendered causal step cites at least one concrete observation the run actually retained, and no cited handle is fabricated. Never judges whether a resolving citation logically supports its claim (D2) — that is left to the human. Pure. */
98
+ export declare function validateCausalEvidence(reply: CausalAnalysisReply, registry: HandleRegistry): ValidatedCausalAnalysis;
99
+ /** The ```interpretation/```constraints/```unresolved block-format instructions. */
100
+ export declare function causalAnalysisContract(): string;
101
+ export interface CausalAnalysisBriefInput {
102
+ manifest: ProgramManifest;
103
+ programId: string;
104
+ summary: RunAnalyticsSummary;
105
+ registry: HandleRegistry;
106
+ ledger: DecisionLedgerView;
107
+ workstreams: readonly WorkstreamTimelineEntry[];
108
+ diff: string;
109
+ baseCommit?: string;
110
+ /**
111
+ * The program document's own narrative (`docs/programs/<id>-program.md`),
112
+ * already clipped by the caller — SC-12 requires the analyzer to consume
113
+ * the plan, not just the manifest's roster/success-criteria fields.
114
+ * Absent when the document could not be read; rendered as an honest gap,
115
+ * never silently dropped (fail-open, SC-13).
116
+ */
117
+ programNarrative?: string;
118
+ /**
119
+ * Every workstream's actual spec file content, already combined and
120
+ * clipped by the caller — SC-12 requires the analyzer to consume the
121
+ * specifications, not merely a path to them. A workstream whose spec could
122
+ * not be read renders as an honest per-workstream gap, never a silent
123
+ * omission (fail-open, SC-13).
124
+ */
125
+ workstreamSpecsText: string;
126
+ }
127
+ export interface CausalAnalysisBrief {
128
+ brief: string;
129
+ components: PromptComponentSize[];
130
+ }
131
+ /**
132
+ * Assembles the analyzer's read-only brief (§3.3): framing, the
133
+ * software-rendered observed measurements, the citable span/point/evidence/
134
+ * ledger handles (drawn straight from `registry`, so what is shown is
135
+ * exactly what is citable), the plan, the ledger, the verification/retry
136
+ * timeline, the clipped final diff, and the response contract. Pure;
137
+ * returns the per-component byte sizes for SC-07 prompt telemetry.
138
+ */
139
+ export declare function causalAnalysisBrief(input: CausalAnalysisBriefInput): CausalAnalysisBrief;
140
+ export type CausalAnalysisStatus = "no-reviewer" | "no-analytics" | "analyzer-error" | "unresolved" | "analyzed";
141
+ export interface CausalAnalysisOutcome {
142
+ ran: boolean;
143
+ status: CausalAnalysisStatus;
144
+ reason?: string;
145
+ validated?: ValidatedCausalAnalysis;
146
+ unresolvedQuestions: string[];
147
+ parseErrors: string[];
148
+ inputClipped: boolean;
149
+ /** The analyzer's own summary block, verbatim, for the report. */
150
+ note?: string;
151
+ }
152
+ /** The outcome recorded when no reviewerAgent is configured. */
153
+ export declare function causalAnalysisReviewerAbsent(): CausalAnalysisOutcome;
154
+ export interface RunCausalAnalysisOptions {
155
+ root: string;
156
+ programId: string;
157
+ manifest: ProgramManifest;
158
+ config: NightshiftConfig;
159
+ agentRunner: AgentRunner;
160
+ /** Defaults to a no-op context; the caller threads the run's real `PermitsContext` through. */
161
+ permits?: PermitsContext;
162
+ /** The run's analytics recorder; a caller with no run-scoped recorder gets a shared no-op default. */
163
+ recorder?: RunRecorder;
164
+ /**
165
+ * The snapshot the caller already took, **before** spawning this pass, via
166
+ * `recorder.snapshot()` — so the analyzer never reasons about its own
167
+ * cost (§3.2). `undefined` routes to `no-analytics`.
168
+ */
169
+ snapshot: RunAnalytics | undefined;
170
+ ledger: DecisionLedgerView;
171
+ workstreams: readonly WorkstreamTimelineEntry[];
172
+ diff: string;
173
+ baseCommit?: string;
174
+ /**
175
+ * The program document's own narrative, read by the caller from
176
+ * `docs/programs/<id>-program.md`. `undefined` when the file could not be
177
+ * read — a fail-open gap noted in the brief, never a thrown run (§3.3/SC-12).
178
+ */
179
+ programNarrative?: string;
180
+ /**
181
+ * Every workstream's spec file content, read by the caller from its own
182
+ * `taskFile` (SC-12). Defaults to empty — a program with no workstreams
183
+ * yields an honest empty specs section, never a thrown run.
184
+ */
185
+ workstreamSpecs?: readonly WorkstreamSpecInput[];
186
+ log?: (line: string) => void;
187
+ }
188
+ /**
189
+ * Runs the pass once: resolve reviewer → build brief → spawn → parse →
190
+ * validate → outcome. Never throws — every failure becomes a status and a
191
+ * `reason` sentence on the returned outcome (§3.5).
192
+ */
193
+ export declare function runCausalAnalysis(options: RunCausalAnalysisOptions): Promise<CausalAnalysisOutcome>;
194
+ /**
195
+ * A human-facing render of one completed (or absent) causal analysis, for
196
+ * the run report. Markdown lines, no heading — the caller splices them
197
+ * under its own `## Why the time went there` heading, immediately after
198
+ * WS-04's own section. Total, never-throwing.
199
+ */
200
+ export declare function renderCausalAnalysis(outcome: CausalAnalysisOutcome, summary: RunAnalyticsSummary): string[];
201
+ /**
202
+ * The run's own fail-open isolation boundary for the causal-analysis section
203
+ * (mirrors `renderAnalyticsSection` in run-analytics-report.ts): always
204
+ * returns a `## Why the time went there` section, never throws. `artifact`
205
+ * accepts a thunk so an evaluation failure of `recorder.snapshot()` itself
206
+ * stays inside this function's own try/catch rather than escaping before it
207
+ * is reached.
208
+ */
209
+ export declare function renderCausalAnalysisSection(outcome: CausalAnalysisOutcome, artifact: RunAnalytics | undefined | (() => RunAnalytics | undefined), deps?: {
210
+ aggregate?: typeof aggregateRunAnalytics;
211
+ }): string[];
212
+ //# sourceMappingURL=causal-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causal-analysis.d.ts","sourceRoot":"","sources":["../src/causal-analysis.ts"],"names":[],"mappings":"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"}