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.
- package/README.md +100 -11
- package/dist/blockers.js +149 -0
- package/dist/blockers.js.map +7 -0
- package/dist/display.js +12 -4
- package/dist/display.js.map +2 -2
- package/dist/docs-templates/issue-tracker.md +9 -1
- package/dist/index.js +740 -137
- package/dist/index.js.map +4 -4
- package/dist/learnings.js +4 -0
- package/dist/learnings.js.map +2 -2
- package/dist/meta.json +69 -16
- package/dist/orchestrator.js +325 -93
- package/dist/orchestrator.js.map +2 -2
- package/dist/resolve.js +98 -9
- package/dist/resolve.js.map +2 -2
- package/dist/review.js +9 -2
- package/dist/review.js.map +2 -2
- package/dist/rules.js +13 -0
- package/dist/rules.js.map +2 -2
- package/dist/skills/to-tickets/SKILL.md +5 -5
- package/dist/src/blockers.d.ts +45 -0
- package/dist/src/blockers.d.ts.map +1 -0
- package/dist/src/display.d.ts +9 -0
- package/dist/src/display.d.ts.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/learnings.d.ts +2 -0
- package/dist/src/learnings.d.ts.map +1 -1
- package/dist/src/orchestrator.d.ts +71 -17
- package/dist/src/orchestrator.d.ts.map +1 -1
- package/dist/src/resolve.d.ts +24 -0
- package/dist/src/resolve.d.ts.map +1 -1
- package/dist/src/review.d.ts +4 -0
- package/dist/src/review.d.ts.map +1 -1
- package/dist/src/rules.d.ts +1 -0
- package/dist/src/rules.d.ts.map +1 -1
- package/dist/src/stats.d.ts +43 -0
- package/dist/src/stats.d.ts.map +1 -0
- package/dist/stats.js +111 -0
- package/dist/stats.js.map +7 -0
- package/package.json +3 -3
package/dist/src/display.d.ts
CHANGED
|
@@ -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":"AAAA,MAAM,MAAM,YAAY,GAClB,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,MAAM,GACN,QAAQ,GACR,SAAS,CAAA;AAEf,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,GAAG,EAAC,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAC,MAAM,CAAA;IACxB,MAAM,EAAC,YAAY,CAAA;IACnB,SAAS,CAAC,EAAC,aAAa,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/display.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";
|
|
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"}
|
package/dist/src/learnings.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../../src/learnings.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,eAAe,IAAI,CAAA;AAChC,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,UAAU,yBAAyB,CAAA;AAGhD,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAE7C,eAAO,MAAM,iBAAiB,+EAQpB,CAAA;AACV,MAAM,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAA;AAE9D,MAAM,MAAM,aAAa,GAAG;IACxB,GAAG,EAAC,MAAM,CAAA;IACV,OAAO,EAAC,MAAM,CAAA;IACd,OAAO,EAAC,eAAe,CAAA;IACvB,QAAQ,EAAC,OAAO,CAAA;IAGhB,IAAI,EAAC,MAAM,CAAA;CACd,CAAA;AAED,KAAK,SAAS,GAAG;IACb,GAAG,EAAC,MAAM,CAAA;IACV,KAAK,EAAC,MAAM,CAAA;IACZ,OAAO,EAAC,MAAM,CAAA;IACd,GAAG,EAAC,IAAI,CAAA;CACX,CAAA;AAID,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,EAAC,MAAM,CAAA;IACf,cAAc,EAAC,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAC,OAAO,CAAA;IAChB,KAAK,EAAC,MAAM,GAAC,IAAI,CAAA;
|
|
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:
|
|
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
|
-
|
|
23
|
-
|
|
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
|
|
28
|
-
* depend on
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
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,
|
|
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.
|
|
98
|
-
*
|
|
99
|
-
*
|
|
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
|
-
|
|
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":"AAwCA,OAAO,EAIH,KAAK,qBAAqB,EAC7B,MAAM,YAAY,CAAA;AACnB,OAAO,EAIH,KAAK,OAAO,EAEf,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"AAwCA,OAAO,EAIH,KAAK,qBAAqB,EAC7B,MAAM,YAAY,CAAA;AACnB,OAAO,EAIH,KAAK,OAAO,EAEf,MAAM,cAAc,CAAA;AAerB,OAAO,EAQH,KAAK,aAAa,EACrB,MAAM,YAAY,CAAA;AACnB,OAAO,EAMH,KAAK,WAAW,EAEnB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACH,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,GACpB,MAAM,YAAY,CAAA;AAenB,OAAO,EAGH,KAAK,UAAU,EACf,KAAK,cAAc,EACtB,MAAM,eAAe,CAAA;AAEtB,MAAM,MAAM,MAAM,GAAG;IACjB,GAAG,EAAC,MAAM,CAAA;IACV,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAC,MAAM,CAAA;IACf,QAAQ,EAAC,MAAM,CAAA;IACf,IAAI,EAAC,MAAM,CAAA;IACX,MAAM,EAAC,MAAM,CAAA;IACb,QAAQ,EAAC,UAAU,EAAE,CAAA;IACrB,OAAO,EAAC,MAAM,CAAA;CACjB,CAAA;AAED,wBAAgB,kBAAkB,CAAE,KAAK,EAAC,OAAO,GAAE,MAAM,CAIxD;AA0DD,eAAO,MAAM,SAAS,QAAqB,CAAA;AAE3C,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAC,MAAM,GACjB;IAAE,GAAG,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAE,GAAC,IAAI,CAIjC;AAED,wBAAgB,WAAW,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAG/C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACvB,GAAG,EAAC,MAAM,EACV,OAAO,GAAC,MAAW,EACnB,aAAa,GAAC,WAAW,CAAC,MAAM,CAAa,GAC/C,MAAM,EAAE,CA2BT;AAED,wBAAgB,SAAS,CAAE,OAAO,EAAC,MAAM,EAAE,GAAG,EAAC,MAAM,GAAE,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC5B,GAAG,EAAC,UAAU,EACd,QAAQ,EAAC,WAAW,CAAC,MAAM,CAAC,GAC9B,OAAO,CAQR;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAE,GAAG,EAAC,UAAU,GAAE,MAAM,CAQnD;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,MAAM,EAAE,CAUT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,EAC7B,UAAU,EAAC,WAAW,CAAC,MAAM,CAAC,GAChC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CA0C1B;AAKD,eAAO,MAAM,YAAY,QAAgC,CAAA;AACzD,eAAO,MAAM,WAAW,QAAgB,CAAA;AAoExC,wBAAgB,UAAU,CACtB,MAAM,EAAC,MAAM,EACb,cAAc,EAAC,MAAM,EAAE,GACzB,IAAI,CAiCL;AAqBD,wBAAgB,QAAQ,CAAE,MAAM,EAAC,MAAM,GAAE,IAAI,CAqB5C;AAKD,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAC,MAAM,EACf,OAAO,EAAC,MAAM,GAChB,MAAM,CAgCP;AAcD,wBAAgB,UAAU,CACtB,UAAU,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAC,SAAS,EACxC,QAAQ,EAAC,MAAM,EACf,OAAO,EAAC,MAAM,GAChB,MAAM,CAGP;AAOD,wBAAgB,YAAY,CACxB,QAAQ,EAAC,MAAM,EACf,MAAM,EAAC,MAAM,EACb,IAAI,EAAC;IACD,OAAO,EAAC,MAAM,CAAA;IACd,UAAU,CAAC,EAAC,MAAM,CAAA;IAClB,OAAO,CAAC,EAAC,MAAM,CAAA;IACf,cAAc,CAAC,EAAC,MAAM,CAAA;CACzB,GACH,MAAM,CA6CP;AAED,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAC,MAAM,EACf,MAAM,EAAC,MAAM,EACb,IAAI,GAAC;IAAE,UAAU,CAAC,EAAC,MAAM,CAAC;IAAC,cAAc,CAAC,EAAC,MAAM,CAAA;CAAO,GAC1D,MAAM,CAmCP;AA2GD,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE,MAAM,EAAE,CAGpD;AAED,wBAAgB,gBAAgB,CAC5B,IAAI,EAAC,MAAM,GACb,MAAM,GAAC,IAAI,CAQZ;AAyDD,MAAM,MAAM,iBAAiB,GAAG;IAC5B,OAAO,EAAC,CAAC,IAAI,EAAC,MAAM,KAAK,MAAM,EAAE,CAAA;IACjC,KAAK,EAAC,MAAM,MAAM,EAAE,CAAA;CACvB,CAAA;AAED,wBAAgB,uBAAuB,IACrC,iBAAiB,CAwFlB;AAkBD,MAAM,MAAM,WAAW,GAAG;IACtB,QAAQ,EAAC,MAAM,CAAA;IACf,cAAc,EAAC,MAAM,EAAE,CAAA;IAGvB,QAAQ,EAAC,OAAO,CAAA;IAGhB,SAAS,CAAC,EAAC,MAAM,CAAA;IACjB,OAAO,CAAC,EAAC,MAAM,CAAA;CAClB,CAAA;AAcD,wBAAgB,gBAAgB,CAAE,GAAG,EAAC,MAAM,GAAC,SAAS,GAAE,IAAI,CAe3D;AAOD,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC;IAC7B,MAAM,EAAC,MAAM,CAAA;IACb,QAAQ,EAAC,MAAM,CAAA;IACf,KAAK,EAAC,MAAM,GAAC,IAAI,CAAA;IACjB,OAAO,EAAC,MAAM,CAAA;IACd,OAAO,EAAC,MAAM,CAAA;IACd,GAAG,CAAC,EAAC,MAAM,CAAA;IACX,KAAK,CAAC,EAAC,MAAM,CAAA;IACb,QAAQ,CAAC,EAAC,MAAM,CAAA;IAChB,MAAM,CAAC,EAAC,WAAW,CAAA;IACnB,MAAM,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,KAAK,IAAI,CAAA;IAE7B,cAAc,CAAC,EAAC,MAAM,CAAA;IAEtB,OAAO,CAAC,EAAC,CAAC,KAAK,EAAC,aAAa,KAAK,IAAI,CAAA;CACzC,GAAE,OAAO,CAAC,WAAW,CAAC,CAwStB;AAED,wBAAgB,MAAM,CAClB,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,EACrB,QAAQ,EAAC,MAAM,EACf,OAAO,EAAC,MAAM,EACd,cAAc,CAAC,EAAC,MAAM,GACxB,IAAI,CAiCL;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAC;IACjC,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACrB,QAAQ,EAAC,MAAM,CAAA;IACf,QAAQ,EAAC,MAAM,CAAA;IACf,gBAAgB,EAAC,qBAAqB,CAAA;IACtC,YAAY,EAAC,MAAM,CAAA;IACnB,OAAO,EAAC,MAAM,CAAA;IACd,UAAU,CAAC,EAAC,MAAM,CAAA;IAClB,MAAM,CAAC,EAAC,WAAW,CAAA;IACnB,OAAO,CAAC,EAAC,MAAM,CAAA;IACf,UAAU,CAAC,EAAC,MAAM,CAAA;IAClB,WAAW,CAAC,EAAC,MAAM,CAAA;IAEnB,cAAc,CAAC,EAAC,MAAM,CAAA;CACzB,GAAE,IAAI,CAkFN;AA0ND,eAAO,MAAM,eAAe,IAAI,CAAA;AAKhC,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAGrC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAMpC,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC9B,KAAK,EAAC,CAAC,EAAE,EACT,KAAK,EAAC,MAAM,EACZ,EAAE,EAAC,CAAC,IAAI,EAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAyBnC;AA+ED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACtB,aAAa,EAAC,MAAM,EACpB,MAAM,EAAC,MAAM,GACf,MAAM,CAwBP;AA6bD,eAAO,MAAM,YAAY,oBAAoB,CAAA;AAuH7C;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,EAC7B,cAAc,EAAC,MAAM,EACrB,UAAU,EAAC,WAAW,CAAC,MAAM,CAAC,EAC9B,QAAQ,GAAC,aAAa,CAAC,cAAc,CAAM,GAC7C,MAAM,CAgDP;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,OAAO,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,EAC7B,QAAQ,EAAC,aAAa,CAAC,cAAc,CAAC,GACxC,MAAM,CAkDP;AA4CD,wBAAsB,QAAQ,CAC1B,OAAO,EAAC,MAAM,EAAE,EAChB,QAAQ,EAAC,MAAM,EACf,QAAQ,EAAC,MAAM,EACf,KAAK,EAAC,MAAM,GAAC,IAAI,EACjB,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,MAAM,EACd,OAAO,CAAC,EAAC,OAAO,EAChB,QAAQ,CAAC,EAAC,MAAM,EAChB,MAAM,CAAC,EAAC,WAAW,EACnB,OAAO,CAAC,EAAC,MAAM,EACf,UAAU,CAAC,EAAC,MAAM,EAClB,WAAW,CAAC,EAAC,MAAM,EAEnB,QAAQ,GAAC,aAAa,CAAC,cAAc,CAAM,EAE3C,cAAc,CAAC,EAAC,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAC,OAAO,CAAA;CAAE,CAAC,CAqM7B;AAED,wBAAsB,gBAAgB,CAAE,IAAI,EAAC;IACzC,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACrB,QAAQ,EAAC,MAAM,CAAA;IACf,UAAU,CAAC,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,QAAQ,EAAC,MAAM,CAAA;IACf,KAAK,EAAC,MAAM,GAAC,IAAI,CAAA;IACjB,OAAO,EAAC,MAAM,CAAA;IACd,OAAO,EAAC,MAAM,CAAA;IACd,WAAW,EAAC,MAAM,CAAA;IAClB,gBAAgB,EAAC,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAC,OAAO,CAAA;IAChB,OAAO,EAAC,MAAM,CAAA;IAGd,UAAU,CAAC,EAAC,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAC,MAAM,CAAA;IAEhB,MAAM,CAAC,EAAC,WAAW,CAAA;IAEnB,OAAO,CAAC,EAAC,MAAM,CAAA;IAEf,UAAU,CAAC,EAAC,MAAM,CAAA;IAElB,WAAW,CAAC,EAAC,MAAM,CAAA;IAEnB,cAAc,CAAC,EAAC,MAAM,CAAA;IAEtB,aAAa,CAAC,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAElC,QAAQ,CAAC,EAAC,aAAa,CAAC,cAAc,CAAC,CAAA;IAGvC,MAAM,CAAC,EAAC;QACJ,UAAU,EAAC,MAAM,CAAA;QAGjB,UAAU,CAAC,EAAC,MAAM,CAAA;KACrB,CAAA;CACJ,GAAE,OAAO,CAAC;IAAE,OAAO,EAAC,OAAO,CAAC;IAAC,MAAM,EAAC,MAAM,CAAA;CAAE,CAAC,CAumB7C"}
|
package/dist/src/resolve.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/src/review.d.ts
CHANGED
|
@@ -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;
|
package/dist/src/review.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"AAWA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAc7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"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"}
|
package/dist/src/rules.d.ts
CHANGED
|
@@ -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;
|
package/dist/src/rules.d.ts.map
CHANGED
|
@@ -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.
|
|
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": "
|
|
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
|
},
|