nightralph 0.0.54 → 0.0.56

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.
@@ -1,3 +1,4 @@
1
+ import { type SubagentStats } from './stats.js';
1
2
  export type TicketStatus = 'pending' | 'in-progress' | 'awaiting-merge' | 'done' | 'failed' | 'blocked';
2
3
  export type DisplayTicket = {
3
4
  readonly num: number;
@@ -5,6 +6,7 @@ export type DisplayTicket = {
5
6
  readonly feature?: string;
6
7
  status: TicketStatus;
7
8
  blockedBy?: ReadonlyArray<string>;
9
+ stats?: SubagentStats;
8
10
  };
9
11
  export type TicketRef = {
10
12
  readonly num: number;
@@ -41,6 +43,11 @@ export type Display = {
41
43
  * of the upstream tickets that failed or need a human.
42
44
  */
43
45
  setBlocked(num: number, feature: string | undefined, blockedBy: ReadonlyArray<string>): void;
46
+ /**
47
+ * Subagent stats for a ticket's row: the running total of
48
+ * its attempts so far.
49
+ */
50
+ setTicketStats(num: number, feature: string | undefined, stats: SubagentStats): void;
44
51
  log(message: string): void;
45
52
  cleanup(): void;
46
53
  };
@@ -94,6 +101,7 @@ export declare class StatusDisplay implements Display {
94
101
  startWave(waveNum: number, totalWaves: number, tickets: ReadonlyArray<TicketRef>, _progress?: RunProgress): void;
95
102
  setTicketStatus(num: number, status: TicketStatus, feature?: string): void;
96
103
  setBlocked(num: number, feature: string | undefined, blockedBy: ReadonlyArray<string>): void;
104
+ setTicketStats(num: number, feature: string | undefined, stats: SubagentStats): void;
97
105
  log(message: string): void;
98
106
  cleanup(): void;
99
107
  private render;
@@ -103,6 +111,7 @@ export declare class PlainDisplay implements Display {
103
111
  startWave(waveNum: number, _totalWaves: number, tickets: ReadonlyArray<TicketRef>, progress?: RunProgress): void;
104
112
  setTicketStatus(_num: number, _status: TicketStatus, _feature?: string): void;
105
113
  setBlocked(_num: number, _feature: string | undefined, _blockedBy: ReadonlyArray<string>): void;
114
+ setTicketStats(_num: number, _feature: string | undefined, _stats: SubagentStats): void;
106
115
  log(message: string): void;
107
116
  cleanup(): void;
108
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/display.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/display.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AA4BA,OAAO,EACH,eAAe,EACf,gBAAgB,EAGnB,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AA6BA,OAAO,EACH,eAAe,EACf,gBAAgB,EAKnB,MAAM,cAAc,CAAA;AAarB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAA"}
@@ -23,6 +23,8 @@ export type AgentRunRecord = {
23
23
  completedItems: string[];
24
24
  timedOut: boolean;
25
25
  notes: string | null;
26
+ subagents?: number;
27
+ costUsd?: number;
26
28
  };
27
29
  type AgentFields = {
28
30
  run: AgentRunRecord;
@@ -1 +1 @@
1
- {"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../../src/learnings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../../src/learnings.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { type MergeConflictStrategy } from './merge.js';
2
2
  import { type Display } from './display.js';
3
+ import { type SubagentStats } from './stats.js';
3
4
  import { type EffortLevel } from './retry.js';
4
5
  export { EFFORT_LADDERS, ALL_EFFORT_LEVELS, escalateEffort, retryDelayFor, type EffortLevel, type ProviderName, } from './retry.js';
6
+ import { type BlockerRef, type BlockerWarning } from './blockers.js';
5
7
  export type Ticket = {
6
8
  num: number;
7
9
  slug: string;
@@ -9,7 +11,7 @@ export type Ticket = {
9
11
  filepath: string;
10
12
  body: string;
11
13
  status: string;
12
- blockers: number[];
14
+ blockers: BlockerRef[];
13
15
  feature: string;
14
16
  };
15
17
  export declare function formatErrorMessage(error: unknown): string;
@@ -19,20 +21,38 @@ export declare function parseTicketFilename(filename: string): {
19
21
  slug: string;
20
22
  } | null;
21
23
  export declare function parseStatus(body: string): string;
22
- export declare function parseBlockers(body: string): number[];
23
- export declare function scanTickets(dir: string, feature?: string): Ticket[];
24
+ /**
25
+ * Reads every ticket file in `dir`. Blocker refs are provisional
26
+ * (every ref `where:'run'`) until `loadSelection` resolves them
27
+ * against the run; a word in `knownFeatures` before a number names
28
+ * that number's feature.
29
+ */
30
+ export declare function scanTickets(dir: string, feature?: string, knownFeatures?: ReadonlySet<string>): Ticket[];
24
31
  export declare function ticketKey(feature: string, num: number): string;
32
+ /**
33
+ * Whether one blocker ref lets its dependent run. `run` refs are
34
+ * decided by the live status of the ticket in this run; refs
35
+ * outside the run were classified at load time.
36
+ */
37
+ export declare function blockerSatisfied(ref: BlockerRef, doneKeys: ReadonlySet<string>): boolean;
38
+ /**
39
+ * Display name of a blocker: `<feature>/<NN>`, plus why it is dead
40
+ * when it is outside the run.
41
+ */
42
+ export declare function blockerLabel(ref: BlockerRef): string;
25
43
  export declare function findReadyTickets(tickets: ReadonlyArray<Ticket>): Ticket[];
26
44
  /**
27
- * Tickets that cannot run this session because a ticket they
28
- * depend on (directly or through a chain, within their own
29
- * feature) is dead: in `failedKeys`, or in a status that is
30
- * neither done nor ready-for-agent, e.g. ready-for-human.
31
- * Returns ticketKey -> dead upstream ticketKeys. Only
32
- * ready-for-agent tickets that have not failed are keys. A
33
- * blocker number with no matching ticket is not dead.
45
+ * Tickets that cannot run this session because a blocker they
46
+ * depend on, directly or through a chain of in-run refs (across
47
+ * features), is dead. Dead means a `pending` or `missing` ref, or
48
+ * an in-run ticket that is in `failedKeys` or whose status is
49
+ * neither done nor ready-for-agent, e.g. ready-for-human. A `done`
50
+ * ref, or a done in-run ticket, ends the walk. An in-run ref with
51
+ * no matching ticket (bare scans only) is not dead.
52
+ * Returns ticketKey -> dead upstream refs. Only ready-for-agent
53
+ * tickets that have not failed are keys.
34
54
  */
35
- export declare function findBlockedTickets(tickets: ReadonlyArray<Ticket>, failedKeys: ReadonlySet<string>): Map<string, Array<string>>;
55
+ export declare function findBlockedTickets(tickets: ReadonlyArray<Ticket>, failedKeys: ReadonlySet<string>): Map<string, BlockerRef[]>;
36
56
  export declare const COMPLETED_RE: RegExp;
37
57
  export declare const TOOL_USE_RE: RegExp;
38
58
  export declare function checkItems(ticket: Ticket, completedItems: string[]): void;
@@ -43,9 +63,11 @@ export declare function renderPrompt(specBody: string, ticket: Ticket, opts: {
43
63
  testCmd: string;
44
64
  installCmd?: string;
45
65
  history?: string;
66
+ preferSubagent?: string;
46
67
  }): string;
47
68
  export declare function renderMergePrompt(specBody: string, ticket: Ticket, opts?: {
48
69
  installCmd?: string;
70
+ preferSubagent?: string;
49
71
  }): string;
50
72
  export declare function getProviderArgs(cmd: string): string[];
51
73
  export declare function formatStreamLine(line: string): string | null;
@@ -58,6 +80,8 @@ export type AgentResult = {
58
80
  exitCode: number;
59
81
  completedItems: string[];
60
82
  timedOut: boolean;
83
+ subagents?: number;
84
+ costUsd?: number;
61
85
  };
62
86
  export declare function killProcessGroup(pid: number | undefined): void;
63
87
  export declare function killRunningAgents(): number;
@@ -72,8 +96,10 @@ export declare function spawnAgent(opts: {
72
96
  maxTurns?: number;
73
97
  effort?: EffortLevel;
74
98
  onLine?: (line: string) => void;
99
+ preferSubagent?: string;
100
+ onStats?: (stats: SubagentStats) => void;
75
101
  }): Promise<AgentResult>;
76
- export declare function dryRun(tickets: Array<Ticket>, specBody: string, testCmd: string): void;
102
+ export declare function dryRun(tickets: Array<Ticket>, specBody: string, testCmd: string, preferSubagent?: string): void;
77
103
  export declare function dryRunIsolated(opts: {
78
104
  tickets: Array<Ticket>;
79
105
  specBody: string;
@@ -86,21 +112,47 @@ export declare function dryRunIsolated(opts: {
86
112
  retries?: number;
87
113
  retryDelay?: number;
88
114
  concurrency?: number;
115
+ preferSubagent?: string;
89
116
  }): void;
90
117
  export declare const DEFAULT_RETRIES = 3;
91
118
  export declare const DEFAULT_RETRY_DELAY = 30;
92
119
  export declare const DEFAULT_CONCURRENCY = 5;
93
120
  export declare function runPool<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>): Promise<PromiseSettledResult<R>[]>;
121
+ /**
122
+ * The ticket's own earlier attempts and its direct blockers' last
123
+ * successful runs, rendered for the prompt. A blocker in another
124
+ * feature is read from that feature's learnings.md, under the same
125
+ * .scratch dir as this ticket's feature. Throws when a log cannot
126
+ * be read.
127
+ */
128
+ export declare function historyFor(learningsPath: string, ticket: Ticket): string;
94
129
  export declare const HUMAN_STATUS = "ready-for-human";
95
130
  /**
96
131
  * The text logged when a run ends. The first line is the
97
- * count summary. When tickets marked ready-for-human are
98
- * still open, further lines name them and say that an
99
- * agent cannot finish them, so a run that exits with open
132
+ * count summary. Further paragraphs (`explainOpen`) name
133
+ * open ready-for-human tickets and say that an agent cannot
134
+ * finish them, list tickets waiting on blockers outside the
135
+ * run and blocker refs that match no ticket, and repeat the
136
+ * typo `warnings` from loading, so a run that exits with open
100
137
  * tickets never looks like it silently gave up.
101
138
  */
102
- export declare function renderFinishSummary(tickets: ReadonlyArray<Ticket>, totalCompleted: number, failedKeys: ReadonlySet<string>): string;
103
- export declare function runWaves(tickets: Ticket[], specBody: string, agentCmd: string, model: string | null, timeout: number, logsDir: string, testCmd: string, display?: Display, maxTurns?: number, effort?: EffortLevel, retries?: number, retryDelay?: number, concurrency?: number): Promise<{
139
+ export declare function renderFinishSummary(tickets: ReadonlyArray<Ticket>, totalCompleted: number, failedKeys: ReadonlySet<string>, warnings?: ReadonlyArray<BlockerWarning>): string;
140
+ /**
141
+ * The zero-ready stop rule: nothing can start, yet a
142
+ * ready-for-agent ticket is waiting on a blocker. A run with no
143
+ * ready-for-agent ticket left (all done, or only human work) is
144
+ * not a stop: it still gets its finish summary and review.
145
+ */
146
+ export declare function nothingReady(tickets: ReadonlyArray<Ticket>): boolean;
147
+ /**
148
+ * Why nothing can run: the same paragraphs as the finish summary
149
+ * (human work, tickets outside the run, refs that match nothing,
150
+ * typos), plus tickets waiting on an in-run ticket in another
151
+ * status (e.g. needs-triage) and tickets that wait on each other
152
+ * in a cycle.
153
+ */
154
+ export declare function renderNothingReady(tickets: ReadonlyArray<Ticket>, warnings: ReadonlyArray<BlockerWarning>): string;
155
+ export declare function runWaves(tickets: Ticket[], specBody: string, agentCmd: string, model: string | null, timeout: number, logsDir: string, testCmd: string, display?: Display, maxTurns?: number, effort?: EffortLevel, retries?: number, retryDelay?: number, concurrency?: number, warnings?: ReadonlyArray<BlockerWarning>, preferSubagent?: string): Promise<{
104
156
  allDone: boolean;
105
157
  }>;
106
158
  export declare function runWavesIsolated(opts: {
@@ -121,7 +173,9 @@ export declare function runWavesIsolated(opts: {
121
173
  retries?: number;
122
174
  retryDelay?: number;
123
175
  concurrency?: number;
176
+ preferSubagent?: string;
124
177
  progressPaths?: Map<string, string>;
178
+ warnings?: ReadonlyArray<BlockerWarning>;
125
179
  review?: {
126
180
  reviewPath: string;
127
181
  forkedFrom?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
+ import { type Ticket } from './orchestrator.js';
2
+ import { type BlockerWarning } from './blockers.js';
3
+ export type { BlockerWarning };
1
4
  export type FeatureSelection = {
2
5
  dir: string;
3
6
  spec: string;
@@ -9,5 +12,26 @@ export declare function findFeatureDirs(cwd: string): {
9
12
  dir: string;
10
13
  spec: string;
11
14
  }[];
15
+ export type LoadedSelection = {
16
+ tickets: Ticket[];
17
+ warnings: BlockerWarning[];
18
+ };
19
+ /**
20
+ * Tickets of the named features with every blocker resolved, and
21
+ * the problems found on the way. An unselected feature is scanned
22
+ * only when a ref points into it, once.
23
+ */
24
+ export declare function loadSelection(scratchDir: string, names: ReadonlyArray<string>): LoadedSelection;
25
+ export type FeatureCounts = {
26
+ ready: number;
27
+ total: number;
28
+ badBlockers: number;
29
+ };
30
+ /**
31
+ * Counts for one feature as if it ran alone: the same
32
+ * loadSelection a `--spec <name>` run uses.
33
+ */
34
+ export declare function featureCounts(scratchDir: string, name: string): FeatureCounts;
35
+ export declare function featureChoiceLabel(scratchDir: string, name: string): string;
12
36
  export declare function resolveIssuesDir(specName: string | undefined, cwd?: string): Promise<FeatureSelection[]>;
13
37
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAC;IACZ,IAAI,EAAC,MAAM,CAAC;CACf,CAAA;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CA4BF;AAID,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6D5B"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,EAIH,KAAK,MAAM,EACd,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAC;IACZ,IAAI,EAAC,MAAM,CAAC;CACf,CAAA;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CA4BF;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAC,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAC,cAAc,EAAE,CAAC;CAC7B,CAAA;AAuBD;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAC,MAAM,EACjB,KAAK,EAAC,aAAa,CAAC,MAAM,CAAC,GAC7B,eAAe,CA+ChB;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,EAAC,MAAM,CAAC;IACb,KAAK,EAAC,MAAM,CAAC;IACb,WAAW,EAAC,MAAM,CAAC;CACtB,CAAA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAC,MAAM,EACjB,IAAI,EAAC,MAAM,GACb,aAAa,CAOd;AAED,wBAAgB,kBAAkB,CAC9B,UAAU,EAAC,MAAM,EACjB,IAAI,EAAC,MAAM,GACb,MAAM,CAOP;AAID,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0D5B"}
@@ -13,6 +13,7 @@ export declare function renderReviewPrompt(opts: {
13
13
  from: string;
14
14
  to: string;
15
15
  exclude?: string;
16
+ preferSubagent?: string;
16
17
  }): string;
17
18
  export type FixFailure = 'install' | 'exit' | 'no-commits' | 'tests' | 'merge';
18
19
  export declare const FIX_FAILURE_TEXT: Record<FixFailure, string>;
@@ -21,6 +22,7 @@ export declare function renderFixPrompt(opts: {
21
22
  findings: ReadonlyArray<Finding>;
22
23
  testCmd: string;
23
24
  installCmd?: string;
25
+ preferSubagent?: string;
24
26
  previous?: {
25
27
  reason: FixFailure;
26
28
  notes: string | null;
@@ -81,6 +83,7 @@ export type SpawnAgentFn = (opts: {
81
83
  label?: string;
82
84
  maxTurns?: number;
83
85
  effort?: EffortLevel;
86
+ preferSubagent?: string;
84
87
  onLine?: (line: string) => void;
85
88
  }) => Promise<AgentResult>;
86
89
  export type ReviewDeps = {
@@ -103,6 +106,7 @@ export type ReviewPassOpts = {
103
106
  installCmd?: string;
104
107
  maxTurns?: number;
105
108
  effort?: EffortLevel;
109
+ preferSubagent?: string;
106
110
  retries: number;
107
111
  retryDelay: number;
108
112
  log: (msg: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export declare function readDocsRule(subject: string): string;
2
2
  export declare function installRule(installCmd?: string): string[];
3
+ export declare function subagentRule(preferSubagent?: string, readOnly?: boolean): string[];
3
4
  export declare function testGateRule(testCmd: string, subject: string): string;
4
5
  export declare const LINT_RULE: string;
5
6
  export declare function integrityRule(unit: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAOnD;AAID,wBAAgB,WAAW,CAAE,UAAU,CAAC,EAAC,MAAM,GAAE,MAAM,EAAE,CAUxD;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenE;AAED,eAAO,MAAM,SAAS,QACQ,CAAA;AAE9B,wBAAgB,aAAa,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAQjD;AAED,eAAO,MAAM,iBAAiB,EAAC,MAAM,EAIpC,CAAA;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAI9C;AAED,wBAAgB,SAAS,CAAE,IAAI,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAU7D;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenD"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAOnD;AAID,wBAAgB,WAAW,CAAE,UAAU,CAAC,EAAC,MAAM,GAAE,MAAM,EAAE,CAUxD;AAMD,wBAAgB,YAAY,CACxB,cAAc,CAAC,EAAC,MAAM,EACtB,QAAQ,UAAQ,GAClB,MAAM,EAAE,CAiBT;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenE;AAED,eAAO,MAAM,SAAS,QACQ,CAAA;AAE9B,wBAAgB,aAAa,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAQjD;AAED,eAAO,MAAM,iBAAiB,EAAC,MAAM,EAIpC,CAAA;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAI9C;AAED,wBAAgB,SAAS,CAAE,IAAI,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAU7D;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenD"}
@@ -0,0 +1,43 @@
1
+ export type SubagentStats = {
2
+ subagents: number;
3
+ costUsd?: number;
4
+ };
5
+ export type StreamStatsState = {
6
+ readonly stats: SubagentStats;
7
+ readonly seenToolIds: ReadonlySet<string>;
8
+ };
9
+ export type RunStats = {
10
+ readonly agentRuns: number;
11
+ readonly withCost: number;
12
+ readonly subagents: number;
13
+ readonly costUsd: number;
14
+ };
15
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
16
+ export declare function emptyStreamStats(): StreamStatsState;
17
+ /**
18
+ * Fold one parsed stream-json value into the state. Returns the
19
+ * same `state` object when nothing changed, so callers can detect
20
+ * a change by identity. Never throws.
21
+ */
22
+ export declare function nextStreamStats(state: StreamStatsState, obj: unknown): StreamStatsState;
23
+ export declare function addStats(total: SubagentStats, run: {
24
+ subagents?: number;
25
+ costUsd?: number;
26
+ }): SubagentStats;
27
+ /**
28
+ * The display row suffix, e.g. `2 subagents, $0.42`, or `null`
29
+ * when there is nothing to show.
30
+ */
31
+ export declare function formatStats(stats?: SubagentStats): string | null;
32
+ export declare function emptyRunStats(): RunStats;
33
+ export declare function addRun(run: RunStats, result: {
34
+ subagents?: number;
35
+ costUsd?: number;
36
+ }): RunStats;
37
+ /**
38
+ * The one-line total logged after the finish summary, or `null`
39
+ * when no run reported a subagent or a cost (codex and pi never
40
+ * do).
41
+ */
42
+ export declare function renderRunStats(run: RunStats): string | null;
43
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IACxB,SAAS,EAAC,MAAM,CAAA;IAEhB,OAAO,CAAC,EAAC,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,KAAK,EAAC,aAAa,CAAA;IAE5B,QAAQ,CAAC,WAAW,EAAC,WAAW,CAAC,MAAM,CAAC,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IAEnB,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAA;IAEzB,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAA;CAC1B,CAAA;AAMD,wBAAgB,QAAQ,CAAE,KAAK,EAAC,OAAO,GAAE,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIxE;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAC,gBAAgB,EACtB,GAAG,EAAC,OAAO,GACb,gBAAgB,CAKjB;AAyED,wBAAgB,QAAQ,CACpB,KAAK,EAAC,aAAa,EACnB,GAAG,EAAC;IAAE,SAAS,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAA;CAAE,GAC5C,aAAa,CASd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAE,KAAK,CAAC,EAAC,aAAa,GAAE,MAAM,GAAC,IAAI,CAU7D;AAED,wBAAgB,aAAa,IAAI,QAAQ,CAExC;AAED,wBAAgB,MAAM,CAClB,GAAG,EAAC,QAAQ,EACZ,MAAM,EAAC;IAAE,SAAS,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAA;CAAE,GAC/C,QAAQ,CAOT;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAE,GAAG,EAAC,QAAQ,GAAE,MAAM,GAAC,IAAI,CAUxD"}
package/dist/stats.js ADDED
@@ -0,0 +1,111 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ const SUBAGENT_TOOLS = /* @__PURE__ */ new Set(["Agent", "Task"]);
4
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ __name(isRecord, "isRecord");
8
+ function emptyStreamStats() {
9
+ return { stats: { subagents: 0 }, seenToolIds: /* @__PURE__ */ new Set() };
10
+ }
11
+ __name(emptyStreamStats, "emptyStreamStats");
12
+ function nextStreamStats(state, obj) {
13
+ if (!isRecord(obj)) return state;
14
+ if (obj.type === "assistant") return countSubagents(state, obj);
15
+ if (obj.type === "result") return applyResult(state, obj);
16
+ return state;
17
+ }
18
+ __name(nextStreamStats, "nextStreamStats");
19
+ function countSubagents(state, obj) {
20
+ if (obj.parent_tool_use_id != null) return state;
21
+ const message = obj.message;
22
+ if (!isRecord(message) || !Array.isArray(message.content)) {
23
+ return state;
24
+ }
25
+ const ids = [];
26
+ for (const block of message.content) {
27
+ if (!isRecord(block) || block.type !== "tool_use") continue;
28
+ if (typeof block.name !== "string" || !SUBAGENT_TOOLS.has(block.name)) continue;
29
+ if (typeof block.id !== "string") continue;
30
+ if (state.seenToolIds.has(block.id)) continue;
31
+ if (ids.includes(block.id)) continue;
32
+ ids.push(block.id);
33
+ }
34
+ if (ids.length === 0) return state;
35
+ return {
36
+ stats: {
37
+ ...state.stats,
38
+ subagents: state.stats.subagents + ids.length
39
+ },
40
+ seenToolIds: /* @__PURE__ */ new Set([...state.seenToolIds, ...ids])
41
+ };
42
+ }
43
+ __name(countSubagents, "countSubagents");
44
+ function applyResult(state, obj) {
45
+ const cost = obj.total_cost_usd;
46
+ const hasCost = typeof cost === "number" && Number.isFinite(cost);
47
+ const subagentStats = obj.subagent_stats;
48
+ const spawned = isRecord(subagentStats) ? subagentStats.spawned : void 0;
49
+ const hasSpawned = typeof spawned === "number" && Number.isInteger(spawned) && spawned >= 0;
50
+ if (!hasCost && !hasSpawned) return state;
51
+ const subagents = hasSpawned ? spawned : state.stats.subagents;
52
+ const costUsd = hasCost ? cost : state.stats.costUsd;
53
+ if (subagents === state.stats.subagents && costUsd === state.stats.costUsd) return state;
54
+ return {
55
+ stats: costUsd === void 0 ? { subagents } : { subagents, costUsd },
56
+ seenToolIds: state.seenToolIds
57
+ };
58
+ }
59
+ __name(applyResult, "applyResult");
60
+ function addStats(total, run) {
61
+ const subagents = total.subagents + (run.subagents ?? 0);
62
+ if (total.costUsd === void 0 && run.costUsd === void 0) {
63
+ return { subagents };
64
+ }
65
+ return {
66
+ subagents,
67
+ costUsd: (total.costUsd ?? 0) + (run.costUsd ?? 0)
68
+ };
69
+ }
70
+ __name(addStats, "addStats");
71
+ function formatStats(stats) {
72
+ if (!stats) return null;
73
+ if (stats.subagents === 0 && stats.costUsd === void 0) {
74
+ return null;
75
+ }
76
+ const count = `${stats.subagents} ` + (stats.subagents === 1 ? "subagent" : "subagents");
77
+ return stats.costUsd === void 0 ? count : `${count}, $${stats.costUsd.toFixed(2)}`;
78
+ }
79
+ __name(formatStats, "formatStats");
80
+ function emptyRunStats() {
81
+ return { agentRuns: 0, withCost: 0, subagents: 0, costUsd: 0 };
82
+ }
83
+ __name(emptyRunStats, "emptyRunStats");
84
+ function addRun(run, result) {
85
+ return {
86
+ agentRuns: run.agentRuns + 1,
87
+ withCost: run.withCost + (result.costUsd === void 0 ? 0 : 1),
88
+ subagents: run.subagents + (result.subagents ?? 0),
89
+ costUsd: run.costUsd + (result.costUsd ?? 0)
90
+ };
91
+ }
92
+ __name(addRun, "addRun");
93
+ function renderRunStats(run) {
94
+ if (run.agentRuns === 0) return null;
95
+ if (run.withCost === 0 && run.subagents === 0) return null;
96
+ const runs = `${run.agentRuns} agent ` + (run.agentRuns === 1 ? "run" : "runs");
97
+ const partial = run.withCost < run.agentRuns ? ` (cost from ${run.withCost} of ${run.agentRuns} runs)` : "";
98
+ return `Subagents: ${run.subagents} started across ${runs}, cost $${run.costUsd.toFixed(2)}${partial}`;
99
+ }
100
+ __name(renderRunStats, "renderRunStats");
101
+ export {
102
+ addRun,
103
+ addStats,
104
+ emptyRunStats,
105
+ emptyStreamStats,
106
+ formatStats,
107
+ isRecord,
108
+ nextStreamStats,
109
+ renderRunStats
110
+ };
111
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/stats.ts"],
4
+ "sourcesContent": ["// Subagent counts and cost read from claude's stream-json output,\n// and the run-wide total. Pure: imports nothing, so the\n// orchestrator, display and tests can all use it.\n\nexport type SubagentStats = {\n subagents:number\n // absent until a `result` message reports it\n costUsd?:number\n}\n\nexport type StreamStatsState = {\n readonly stats:SubagentStats\n // tool_use ids already counted, so a repeated id counts once\n readonly seenToolIds:ReadonlySet<string>\n}\n\nexport type RunStats = {\n // spawnAgent results tallied\n readonly agentRuns:number\n // of those, how many reported a cost\n readonly withCost:number\n readonly subagents:number\n readonly costUsd:number\n}\n\n// Starting a subagent is a tool_use named `Agent`; Claude Code\n// named it `Task` before 2.1.63.\nconst SUBAGENT_TOOLS:ReadonlySet<string> = new Set(['Agent', 'Task'])\n\nexport function isRecord (value:unknown):value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n}\n\nexport function emptyStreamStats ():StreamStatsState {\n return { stats:{ subagents:0 }, seenToolIds:new Set() }\n}\n\n/**\n * Fold one parsed stream-json value into the state. Returns the\n * same `state` object when nothing changed, so callers can detect\n * a change by identity. Never throws.\n */\nexport function nextStreamStats (\n state:StreamStatsState,\n obj:unknown\n):StreamStatsState {\n if (!isRecord(obj)) return state\n if (obj.type === 'assistant') return countSubagents(state, obj)\n if (obj.type === 'result') return applyResult(state, obj)\n return state\n}\n\nfunction countSubagents (\n state:StreamStatsState,\n obj:Record<string, unknown>\n):StreamStatsState {\n // A message from inside a subagent carries the id of the\n // tool_use that started it; only the main loop is counted.\n if (obj.parent_tool_use_id != null) return state\n const message = obj.message\n if (!isRecord(message) || !Array.isArray(message.content)) {\n return state\n }\n const ids:string[] = []\n for (const block of message.content) {\n if (!isRecord(block) || block.type !== 'tool_use') continue\n if (\n typeof block.name !== 'string' ||\n !SUBAGENT_TOOLS.has(block.name)\n ) continue\n if (typeof block.id !== 'string') continue\n if (state.seenToolIds.has(block.id)) continue\n if (ids.includes(block.id)) continue\n ids.push(block.id)\n }\n if (ids.length === 0) return state\n return {\n stats:{\n ...state.stats,\n subagents:state.stats.subagents + ids.length,\n },\n seenToolIds:new Set([...state.seenToolIds, ...ids]),\n }\n}\n\n// `total_cost_usd` is cumulative and a process can emit several\n// `result` messages, so the latest one replaces earlier values.\nfunction applyResult (\n state:StreamStatsState,\n obj:Record<string, unknown>\n):StreamStatsState {\n const cost = obj.total_cost_usd\n const hasCost = typeof cost === 'number' && Number.isFinite(cost)\n const subagentStats = obj.subagent_stats\n const spawned = isRecord(subagentStats) ?\n subagentStats.spawned :\n undefined\n const hasSpawned = typeof spawned === 'number' &&\n Number.isInteger(spawned) &&\n spawned >= 0\n if (!hasCost && !hasSpawned) return state\n\n const subagents = hasSpawned ?\n spawned :\n state.stats.subagents\n const costUsd = hasCost ?\n cost :\n state.stats.costUsd\n // A repeated result with the same values is not a change\n if (\n subagents === state.stats.subagents &&\n costUsd === state.stats.costUsd\n ) return state\n return {\n stats:costUsd === undefined ?\n { subagents } :\n { subagents, costUsd },\n seenToolIds:state.seenToolIds,\n }\n}\n\n// The running total of a ticket's attempts. A cost is kept as\n// soon as either side reports one.\nexport function addStats (\n total:SubagentStats,\n run:{ subagents?:number; costUsd?:number }\n):SubagentStats {\n const subagents = total.subagents + (run.subagents ?? 0)\n if (total.costUsd === undefined && run.costUsd === undefined) {\n return { subagents }\n }\n return {\n subagents,\n costUsd:(total.costUsd ?? 0) + (run.costUsd ?? 0),\n }\n}\n\n/**\n * The display row suffix, e.g. `2 subagents, $0.42`, or `null`\n * when there is nothing to show.\n */\nexport function formatStats (stats?:SubagentStats):string|null {\n if (!stats) return null\n if (stats.subagents === 0 && stats.costUsd === undefined) {\n return null\n }\n const count = `${stats.subagents} ` +\n (stats.subagents === 1 ? 'subagent' : 'subagents')\n return stats.costUsd === undefined ?\n count :\n `${count}, $${stats.costUsd.toFixed(2)}`\n}\n\nexport function emptyRunStats ():RunStats {\n return { agentRuns:0, withCost:0, subagents:0, costUsd:0 }\n}\n\nexport function addRun (\n run:RunStats,\n result:{ subagents?:number; costUsd?:number }\n):RunStats {\n return {\n agentRuns:run.agentRuns + 1,\n withCost:run.withCost + (result.costUsd === undefined ? 0 : 1),\n subagents:run.subagents + (result.subagents ?? 0),\n costUsd:run.costUsd + (result.costUsd ?? 0),\n }\n}\n\n/**\n * The one-line total logged after the finish summary, or `null`\n * when no run reported a subagent or a cost (codex and pi never\n * do).\n */\nexport function renderRunStats (run:RunStats):string|null {\n if (run.agentRuns === 0) return null\n if (run.withCost === 0 && run.subagents === 0) return null\n const runs = `${run.agentRuns} agent ` +\n (run.agentRuns === 1 ? 'run' : 'runs')\n const partial = run.withCost < run.agentRuns ?\n ` (cost from ${run.withCost} of ${run.agentRuns} runs)` :\n ''\n return `Subagents: ${run.subagents} started across ${runs}, ` +\n `cost $${run.costUsd.toFixed(2)}${partial}`\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nightralph",
3
- "version": "0.0.54",
3
+ "version": "0.0.56",
4
4
  "type": "module",
5
5
  "description": "Orchestrator that runs a single-agent session per issue.",
6
6
  "bin": {
@@ -17,14 +17,14 @@
17
17
  "lint": "eslint \"./**/*.{ts,js}\"",
18
18
  "start": "npm run build && node dist/index.js",
19
19
  "build": "mkdir -p ./dist && rm -rf ./dist/* && npm run build-esm && npm run copy",
20
- "build-esm": "esbuild src/index.ts --bundle --format=esm --platform=node --packages=external --metafile=dist/meta.json --keep-names --tsconfig=tsconfig.build.json --outfile=./dist/index.js --sourcemap && esbuild src/orchestrator.ts src/setup.ts src/resolve.ts src/worktree.ts src/progress.ts src/merge.ts src/display.ts src/testcmd.ts src/preflight.ts src/learnings.ts src/retry.ts src/rules.ts src/review.ts --format=esm --keep-names --tsconfig=tsconfig.build.json --outdir=./dist --sourcemap && tsc --emitDeclarationOnly --project tsconfig.build.json",
20
+ "build-esm": "esbuild src/index.ts --bundle --format=esm --platform=node --packages=external --metafile=dist/meta.json --keep-names --tsconfig=tsconfig.build.json --outfile=./dist/index.js --sourcemap && esbuild src/orchestrator.ts src/setup.ts src/resolve.ts src/worktree.ts src/progress.ts src/merge.ts src/display.ts src/testcmd.ts src/preflight.ts src/learnings.ts src/retry.ts src/rules.ts src/review.ts src/blockers.ts src/stats.ts --format=esm --keep-names --tsconfig=tsconfig.build.json --outdir=./dist --sourcemap && tsc --emitDeclarationOnly --project tsconfig.build.json",
21
21
  "copy": "mkdir -p ./dist/skills ./dist/docs-templates && cp -r ./src/skills/* ./dist/skills && cp -r ./src/docs-templates/* ./dist/docs-templates",
22
22
  "clone-skills": "bash scripts/clone-skills.sh",
23
23
  "toc": "markdown-toc --maxdepth 4 -i README.md",
24
24
  "preversion": "npm run lint",
25
25
  "prepublishOnly": "npm run build",
26
26
  "version": "npm run toc && git add README.md",
27
- "postversion": "npm publish && git push --follow-tags",
27
+ "postversion": "git push --follow-tags && npm publish",
28
28
  "demo": "npm run build && node test/demo-display.mjs",
29
29
  "test": "bash scripts/test.sh"
30
30
  },