@agentic-workflow-kit/orchestrator 0.1.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 (86) hide show
  1. package/LICENSE +21 -0
  2. package/dist/analysis/runAnalyzer.d.ts +22 -0
  3. package/dist/analysis/runAnalyzer.d.ts.map +1 -0
  4. package/dist/analysis/runAnalyzer.js +177 -0
  5. package/dist/artifacts/FileArtifactStore.d.ts +9 -0
  6. package/dist/artifacts/FileArtifactStore.d.ts.map +1 -0
  7. package/dist/artifacts/FileArtifactStore.js +21 -0
  8. package/dist/cli/args.d.ts +5 -0
  9. package/dist/cli/args.d.ts.map +1 -0
  10. package/dist/cli/args.js +213 -0
  11. package/dist/cli.d.ts +9 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +284 -0
  14. package/dist/clock/SystemClock.d.ts +6 -0
  15. package/dist/clock/SystemClock.d.ts.map +1 -0
  16. package/dist/clock/SystemClock.js +8 -0
  17. package/dist/config/configLoader.d.ts +5 -0
  18. package/dist/config/configLoader.d.ts.map +1 -0
  19. package/dist/config/configLoader.js +105 -0
  20. package/dist/config/generate-schema.d.ts +2 -0
  21. package/dist/config/generate-schema.d.ts.map +1 -0
  22. package/dist/config/generate-schema.js +8 -0
  23. package/dist/config/jsonSchema.d.ts +3 -0
  24. package/dist/config/jsonSchema.d.ts.map +1 -0
  25. package/dist/config/jsonSchema.js +44 -0
  26. package/dist/config/preset.d.ts +16 -0
  27. package/dist/config/preset.d.ts.map +1 -0
  28. package/dist/config/preset.js +14 -0
  29. package/dist/config/resolve.d.ts +12 -0
  30. package/dist/config/resolve.d.ts.map +1 -0
  31. package/dist/config/resolve.js +30 -0
  32. package/dist/config/schema.d.ts +68 -0
  33. package/dist/config/schema.d.ts.map +1 -0
  34. package/dist/config/schema.js +80 -0
  35. package/dist/drivers/StoryRunner.d.ts +24 -0
  36. package/dist/drivers/StoryRunner.d.ts.map +1 -0
  37. package/dist/drivers/StoryRunner.js +1 -0
  38. package/dist/drivers/codex-mcp/CodexMcpStoryRunner.d.ts +25 -0
  39. package/dist/drivers/codex-mcp/CodexMcpStoryRunner.d.ts.map +1 -0
  40. package/dist/drivers/codex-mcp/CodexMcpStoryRunner.js +145 -0
  41. package/dist/drivers/codex-mcp/schemaValidation.d.ts +7 -0
  42. package/dist/drivers/codex-mcp/schemaValidation.d.ts.map +1 -0
  43. package/dist/drivers/codex-mcp/schemaValidation.js +43 -0
  44. package/dist/drivers/codex-mcp/toolInput.d.ts +12 -0
  45. package/dist/drivers/codex-mcp/toolInput.d.ts.map +1 -0
  46. package/dist/drivers/codex-mcp/toolInput.js +82 -0
  47. package/dist/git/GitInspector.d.ts +34 -0
  48. package/dist/git/GitInspector.d.ts.map +1 -0
  49. package/dist/git/GitInspector.js +73 -0
  50. package/dist/index.d.ts +11 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +9 -0
  53. package/dist/internal/guards.d.ts +4 -0
  54. package/dist/internal/guards.d.ts.map +1 -0
  55. package/dist/internal/guards.js +9 -0
  56. package/dist/logging/ConsoleLogger.d.ts +7 -0
  57. package/dist/logging/ConsoleLogger.d.ts.map +1 -0
  58. package/dist/logging/ConsoleLogger.js +16 -0
  59. package/dist/metrics/aggregate.d.ts +6 -0
  60. package/dist/metrics/aggregate.d.ts.map +1 -0
  61. package/dist/metrics/aggregate.js +32 -0
  62. package/dist/metrics/liveMetrics.d.ts +16 -0
  63. package/dist/metrics/liveMetrics.d.ts.map +1 -0
  64. package/dist/metrics/liveMetrics.js +16 -0
  65. package/dist/runner/CompletionGate.d.ts +25 -0
  66. package/dist/runner/CompletionGate.d.ts.map +1 -0
  67. package/dist/runner/CompletionGate.js +49 -0
  68. package/dist/runner/MetricsCollector.d.ts +27 -0
  69. package/dist/runner/MetricsCollector.d.ts.map +1 -0
  70. package/dist/runner/MetricsCollector.js +49 -0
  71. package/dist/runner/RunJournal.d.ts +32 -0
  72. package/dist/runner/RunJournal.d.ts.map +1 -0
  73. package/dist/runner/RunJournal.js +78 -0
  74. package/dist/runner/WorkflowRunner.d.ts +45 -0
  75. package/dist/runner/WorkflowRunner.d.ts.map +1 -0
  76. package/dist/runner/WorkflowRunner.js +289 -0
  77. package/dist/scheduler/scheduler.d.ts +8 -0
  78. package/dist/scheduler/scheduler.d.ts.map +1 -0
  79. package/dist/scheduler/scheduler.js +8 -0
  80. package/dist/tracks/markdownTracker.d.ts +29 -0
  81. package/dist/tracks/markdownTracker.d.ts.map +1 -0
  82. package/dist/tracks/markdownTracker.js +349 -0
  83. package/dist/types.d.ts +222 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +1 -0
  86. package/package.json +75 -0
@@ -0,0 +1,349 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import matter from 'gray-matter';
4
+ import { toString as mdastToString } from 'mdast-util-to-string';
5
+ import { remark } from 'remark';
6
+ import remarkGfm from 'remark-gfm';
7
+ import { glob } from 'tinyglobby';
8
+ import { isNodeError } from '../internal/guards.js';
9
+ const UNOWNED_MARKERS = new Set(['', '—', '-']);
10
+ const CONTRACT_COLUMNS = ['id', 'name', 'depends on', 'wave', 'status', 'spec', 'plan', 'owner', 'pr'];
11
+ export class MarkdownTrackStorySource {
12
+ options;
13
+ trackId;
14
+ constructor(options, trackId) {
15
+ this.options = options;
16
+ this.trackId = trackId;
17
+ }
18
+ async listStories() {
19
+ const tracks = await discoverMarkdownTracks(this.options);
20
+ const track = tracks.find((entry) => entry.id === this.trackId);
21
+ if (!track)
22
+ throw new Error(`track ${this.trackId} was not found`);
23
+ return track.stories;
24
+ }
25
+ }
26
+ export class EmptyStorySource {
27
+ async listStories() {
28
+ return [];
29
+ }
30
+ }
31
+ export async function discoverMarkdownTracks(options) {
32
+ const tracksRoot = path.resolve(options.workspaceRoot, options.tracksDir);
33
+ const archiveRoot = path.resolve(options.workspaceRoot, options.archiveDir);
34
+ const readmes = await findReadmes(tracksRoot);
35
+ const tracks = [];
36
+ for (const readmePath of readmes) {
37
+ if (isPathUnder(readmePath, archiveRoot)) {
38
+ continue;
39
+ }
40
+ const markdown = await readFile(readmePath, 'utf8');
41
+ const frontmatter = parseFrontmatter(markdown);
42
+ if (frontmatter.status === 'archived') {
43
+ continue;
44
+ }
45
+ const relativePath = slash(path.relative(options.workspaceRoot, readmePath));
46
+ const trackId = trackIdFromPath(tracksRoot, readmePath);
47
+ const title = frontmatter.title ?? titleFromTrackId(trackId);
48
+ const stories = parseTrackerStories(markdown, {
49
+ completeStatuses: new Set(options.completeStatuses),
50
+ eligibleStatuses: new Set(options.eligibleStatuses),
51
+ idPattern: new RegExp(options.idPattern),
52
+ trackId,
53
+ trackTitle: title,
54
+ trackerPath: relativePath,
55
+ });
56
+ if (stories.length === 0)
57
+ continue;
58
+ tracks.push({
59
+ id: trackId,
60
+ title,
61
+ relativePath,
62
+ pathAbs: readmePath,
63
+ status: frontmatter.status,
64
+ owner: normalizeOwner(frontmatter.owner ?? ''),
65
+ stories,
66
+ });
67
+ }
68
+ return tracks.sort((left, right) => left.id.localeCompare(right.id));
69
+ }
70
+ export function parseTrackerStories(markdown, context) {
71
+ const rows = parseRows(markdown, context.trackerPath, context.idPattern);
72
+ validateUniqueStoryIds(rows, context.trackerPath);
73
+ const statusById = new Map(rows.map((row) => [row.id, row.status]));
74
+ return rows.map((row) => {
75
+ const blockedReason = blockedReasonFor(row, statusById, context.completeStatuses, context.eligibleStatuses);
76
+ return {
77
+ id: row.id,
78
+ title: row.title,
79
+ status: row.status,
80
+ owner: row.owner,
81
+ dependencies: row.dependencies,
82
+ eligible: blockedReason === null,
83
+ blockedReason,
84
+ metadata: {
85
+ trackId: context.trackId,
86
+ trackTitle: context.trackTitle,
87
+ trackerPath: context.trackerPath,
88
+ order: row.order,
89
+ wave: row.wave,
90
+ spec: row.spec,
91
+ plan: row.plan,
92
+ pr: row.pr,
93
+ invalidDependencies: row.invalidDependencies.length > 0 ? row.invalidDependencies : undefined,
94
+ },
95
+ };
96
+ });
97
+ }
98
+ async function findReadmes(root) {
99
+ try {
100
+ return await glob('**/README.md', { cwd: root, absolute: true, caseSensitiveMatch: false });
101
+ }
102
+ catch (error) {
103
+ if (isNodeError(error) && error.code === 'ENOENT')
104
+ return [];
105
+ throw error;
106
+ }
107
+ }
108
+ function parseRows(markdown, trackerPath, idPattern) {
109
+ const tableRows = extractTableRows(markdown, trackerPath);
110
+ const rows = [];
111
+ let columns = null;
112
+ let sawPotentialMatrix = false;
113
+ let currentTable = -1;
114
+ for (const tableRow of tableRows) {
115
+ if (tableRow.tableIndex !== currentTable) {
116
+ columns = null;
117
+ currentTable = tableRow.tableIndex;
118
+ }
119
+ const header = readHeader(tableRow.cells, trackerPath);
120
+ if (header) {
121
+ columns = header;
122
+ sawPotentialMatrix = false;
123
+ continue;
124
+ }
125
+ if (hasStoryTableMarkers(tableRow.cells)) {
126
+ sawPotentialMatrix = true;
127
+ }
128
+ if (!columns) {
129
+ continue;
130
+ }
131
+ const row = parseStoryRow(tableRow, columns, idPattern, trackerPath);
132
+ if (row)
133
+ rows.push(row);
134
+ }
135
+ if (rows.length === 0 && sawPotentialMatrix) {
136
+ throw new Error(`${trackerPath} must contain the contract status matrix columns`);
137
+ }
138
+ return rows;
139
+ }
140
+ function parseStoryRow(tableRow, columns, idPattern, trackerPath) {
141
+ const { cells, rawCells, line } = tableRow;
142
+ const id = stripMarkdown(cells[columns.id]);
143
+ if (!idPattern.test(id)) {
144
+ throw new Error(`invalid story id ${id} in ${trackerPath} at line ${line}`);
145
+ }
146
+ const parsedDependencies = parseDependencies(cells[columns.dependencies], idPattern);
147
+ return {
148
+ order: line,
149
+ id,
150
+ title: stripMarkdown(cells[columns.title]),
151
+ dependencies: parsedDependencies.dependencies,
152
+ invalidDependencies: parsedDependencies.invalidDependencies,
153
+ wave: readOptionalCell(cells, columns.wave),
154
+ status: stripMarkdown(cells[columns.status]).toLowerCase(),
155
+ spec: readOptionalCell(rawCells, columns.spec),
156
+ plan: readOptionalCell(rawCells, columns.plan),
157
+ owner: normalizeOwner(readOptionalCell(cells, columns.owner) ?? ''),
158
+ pr: readOptionalCell(rawCells, columns.pr),
159
+ };
160
+ }
161
+ function readHeader(cells, trackerPath) {
162
+ const normalized = cells.map((cell) => normalizeHeader(cell));
163
+ if (!normalized.includes('id') || !normalized.includes('status')) {
164
+ return null;
165
+ }
166
+ if (normalized.length < CONTRACT_COLUMNS.length ||
167
+ !CONTRACT_COLUMNS.every((column, index) => normalized[index] === column)) {
168
+ throw new Error(`${trackerPath} must contain the contract status matrix columns`);
169
+ }
170
+ return {
171
+ id: 0,
172
+ title: 1,
173
+ dependencies: 2,
174
+ wave: 3,
175
+ status: 4,
176
+ spec: 5,
177
+ plan: 6,
178
+ owner: 7,
179
+ pr: 8,
180
+ };
181
+ }
182
+ function blockedReasonFor(row, statusById, completeStatuses, eligibleStatuses) {
183
+ if (!eligibleStatuses.has(row.status))
184
+ return `status is ${row.status}`;
185
+ if (row.owner !== null)
186
+ return `owner is ${row.owner}`;
187
+ if (row.invalidDependencies.length > 0) {
188
+ return `dependencies could not be parsed: ${row.invalidDependencies.join(', ')}`;
189
+ }
190
+ const incomplete = row.dependencies.filter((dependency) => !completeStatuses.has(statusById.get(dependency) ?? ''));
191
+ if (incomplete.length > 0)
192
+ return `dependencies are not complete: ${incomplete.join(', ')}`;
193
+ return null;
194
+ }
195
+ function parseDependencies(value, idPattern) {
196
+ const clean = stripMarkdown(value);
197
+ if (UNOWNED_MARKERS.has(clean))
198
+ return { dependencies: [], invalidDependencies: [] };
199
+ const dependencies = [];
200
+ const invalidDependencies = [];
201
+ for (const token of clean
202
+ .split(/[,;/]+/)
203
+ .map((entry) => entry.trim())
204
+ .filter(Boolean)) {
205
+ if (idPattern.test(token)) {
206
+ dependencies.push(token);
207
+ }
208
+ else {
209
+ invalidDependencies.push(token);
210
+ }
211
+ }
212
+ return { dependencies, invalidDependencies };
213
+ }
214
+ function normalizeOwner(value) {
215
+ const owner = stripMarkdown(value);
216
+ return UNOWNED_MARKERS.has(owner) ? null : owner;
217
+ }
218
+ function readOptionalCell(cells, index) {
219
+ return cells[index]?.trim();
220
+ }
221
+ function parseFrontmatter(markdown) {
222
+ const { data } = matter(markdown);
223
+ const pick = (value) => (typeof value === 'string' ? value.trim() : undefined);
224
+ return { title: pick(data.title), status: pick(data.status), owner: pick(data.owner) };
225
+ }
226
+ function validateUniqueStoryIds(rows, trackerPath) {
227
+ const seen = new Set();
228
+ for (const row of rows) {
229
+ if (seen.has(row.id))
230
+ throw new Error(`duplicate story id ${row.id} in ${trackerPath}`);
231
+ seen.add(row.id);
232
+ }
233
+ }
234
+ function trackIdFromPath(tracksRoot, readmePath) {
235
+ const relativeDir = slash(path.relative(tracksRoot, path.dirname(readmePath)));
236
+ return relativeDir === '' ? 'root' : relativeDir;
237
+ }
238
+ function titleFromTrackId(trackId) {
239
+ return trackId
240
+ .split(/[/-]/)
241
+ .filter(Boolean)
242
+ .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))
243
+ .join(' ');
244
+ }
245
+ function stripMarkdown(value) {
246
+ return (value ?? '')
247
+ .replace(/\*\*/g, '')
248
+ .replace(/\[([^\]]+)]\([^)]+\)/g, '$1')
249
+ .trim();
250
+ }
251
+ function extractTableRows(markdown, trackerPath) {
252
+ const lines = markdown.split(/\r?\n/);
253
+ const tree = remark().use(remarkGfm).parse(markdown);
254
+ const rows = [];
255
+ const tableRanges = [];
256
+ let tableIndex = 0;
257
+ visitTables(tree, (table) => {
258
+ const start = table.position?.start?.line ?? 0;
259
+ const end = table.position?.end?.line ?? start;
260
+ tableRanges.push({ start, end });
261
+ for (const row of table.children ?? []) {
262
+ const line = row.position?.start?.line ?? 0;
263
+ rows.push({
264
+ tableIndex,
265
+ line,
266
+ // mdast-util-to-string intentionally strips all inline constructs from parsed story fields.
267
+ cells: (row.children ?? []).map((cell) => mdastToString(cell).trim()),
268
+ rawCells: parseRawTableCells(lines[line - 1] ?? ''),
269
+ });
270
+ }
271
+ tableIndex += 1;
272
+ });
273
+ assertNoUnparsedIndentedTables(lines, tableRanges, trackerPath);
274
+ return rows;
275
+ }
276
+ function visitTables(node, visitor) {
277
+ if (node.type === 'table') {
278
+ visitor(node);
279
+ return;
280
+ }
281
+ for (const child of node.children ?? []) {
282
+ visitTables(child, visitor);
283
+ }
284
+ }
285
+ function parseRawTableCells(line) {
286
+ const trimmed = line.trim();
287
+ if (!trimmed.startsWith('|') || !trimmed.endsWith('|'))
288
+ return [];
289
+ const cells = [];
290
+ let cell = '';
291
+ for (let index = 1; index < trimmed.length - 1; index += 1) {
292
+ const char = trimmed[index];
293
+ const next = trimmed[index + 1];
294
+ if (char === '\\' && next === '|') {
295
+ cell += '|';
296
+ index += 1;
297
+ continue;
298
+ }
299
+ if (char === '|') {
300
+ cells.push(cell.trim());
301
+ cell = '';
302
+ continue;
303
+ }
304
+ cell += char;
305
+ }
306
+ cells.push(cell.trim());
307
+ return cells;
308
+ }
309
+ function assertNoUnparsedIndentedTables(lines, tableRanges, trackerPath) {
310
+ lines.forEach((line, index) => {
311
+ const lineNumber = index + 1;
312
+ if (isLineInParsedTable(lineNumber, tableRanges))
313
+ return;
314
+ if (!hasLeadingWhitespace(line))
315
+ return;
316
+ if (!looksLikeGfmTableStart(line, lines[index + 1] ?? ''))
317
+ return;
318
+ throw new Error(`Tracker table at ${trackerPath}:${lineNumber} is indented; GFM tables must start at column 0`);
319
+ });
320
+ }
321
+ function isLineInParsedTable(lineNumber, tableRanges) {
322
+ return tableRanges.some((range) => lineNumber >= range.start && lineNumber <= range.end);
323
+ }
324
+ function hasLeadingWhitespace(line) {
325
+ return /^\s+\|/.test(line);
326
+ }
327
+ function looksLikeGfmTableStart(headerLine, delimiterLine) {
328
+ return isPipeTableLine(headerLine.trim()) && isGfmDelimiterLine(delimiterLine.trim());
329
+ }
330
+ function isPipeTableLine(line) {
331
+ return /^\|.*\|$/.test(line);
332
+ }
333
+ function isGfmDelimiterLine(line) {
334
+ return /^\|(\s*:?-+:?\s*\|)+$/.test(line);
335
+ }
336
+ function normalizeHeader(value) {
337
+ return stripMarkdown(value).toLowerCase();
338
+ }
339
+ function hasStoryTableMarkers(cells) {
340
+ const normalized = cells.map((cell) => normalizeHeader(cell));
341
+ return normalized.includes('id') && (normalized.includes('status') || normalized.includes('name'));
342
+ }
343
+ function isPathUnder(candidate, parent) {
344
+ const relative = path.relative(parent, candidate);
345
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
346
+ }
347
+ function slash(value) {
348
+ return value.split(path.sep).join('/');
349
+ }
@@ -0,0 +1,222 @@
1
+ export type OrchestratorDriver = 'codex-mcp';
2
+ export type RunStatus = 'blocked' | 'complete' | 'dry-run' | 'running';
3
+ export interface ResolvedGitConfig {
4
+ strategy: 'worktree' | 'branch';
5
+ branchPattern: string;
6
+ baseBranch: string;
7
+ commitOnBase: 'forbid' | 'allow';
8
+ }
9
+ export interface ResolvedWorkflowConfig {
10
+ version: 1;
11
+ configPath: string;
12
+ workspace: {
13
+ rootAbs: string;
14
+ };
15
+ paths: {
16
+ tracksDir: string;
17
+ tracksDirAbs: string;
18
+ archiveDir: string;
19
+ archiveDirAbs: string;
20
+ };
21
+ artifacts: {
22
+ rootDir: string;
23
+ rootDirAbs: string;
24
+ runsDirAbs: string;
25
+ };
26
+ statuses: {
27
+ eligible: string[];
28
+ inProgress: string;
29
+ complete: string[];
30
+ };
31
+ tracker: {
32
+ idPattern: string;
33
+ };
34
+ git: ResolvedGitConfig;
35
+ orchestrator: {
36
+ driver: OrchestratorDriver;
37
+ maxParallel: number;
38
+ stopLaunchingOnBlocked: boolean;
39
+ childTimeoutMs: number;
40
+ };
41
+ codex: {
42
+ childSession: ResolvedChildSessionConfig;
43
+ };
44
+ }
45
+ export type ApprovalPolicy = 'never' | 'on-failure' | 'on-request' | 'untrusted';
46
+ export type SandboxMode = 'danger-full-access' | 'read-only' | 'workspace-write';
47
+ export interface ResolvedChildSessionConfig {
48
+ cwdAbs: string;
49
+ model?: string;
50
+ approvalPolicy?: ApprovalPolicy;
51
+ sandbox?: SandboxMode;
52
+ config?: Record<string, unknown>;
53
+ }
54
+ export interface CliOverrides {
55
+ configPath?: string;
56
+ json?: boolean;
57
+ force?: boolean;
58
+ maxParallel?: number;
59
+ childTimeoutMs?: number;
60
+ track?: string;
61
+ tracksDir?: string;
62
+ dryRun?: boolean;
63
+ watch?: boolean;
64
+ sessionRoot?: string;
65
+ cwd?: string;
66
+ model?: string;
67
+ reasoning?: string;
68
+ approvalPolicy?: ApprovalPolicy;
69
+ sandbox?: SandboxMode;
70
+ }
71
+ export type WorkflowCommand = {
72
+ kind: 'help';
73
+ } | {
74
+ kind: 'list-tracks';
75
+ overrides: CliOverrides;
76
+ } | {
77
+ kind: 'list-stories';
78
+ overrides: CliOverrides;
79
+ } | {
80
+ kind: 'list-eligible';
81
+ overrides: CliOverrides;
82
+ } | {
83
+ kind: 'run-story';
84
+ storyId: string;
85
+ overrides: CliOverrides;
86
+ } | {
87
+ kind: 'run-eligible';
88
+ overrides: CliOverrides;
89
+ } | {
90
+ kind: 'watch-run';
91
+ runPath: string;
92
+ overrides: CliOverrides;
93
+ } | {
94
+ kind: 'analyze-run';
95
+ runPath: string;
96
+ overrides: CliOverrides;
97
+ } | {
98
+ kind: 'mcp-check';
99
+ overrides: CliOverrides;
100
+ };
101
+ export interface WorkflowStory {
102
+ id: string;
103
+ title: string;
104
+ status: string;
105
+ owner: string | null;
106
+ dependencies: string[];
107
+ eligible: boolean;
108
+ blockedReason: string | null;
109
+ metadata: {
110
+ trackId: string;
111
+ trackTitle: string;
112
+ trackerPath: string;
113
+ order: number;
114
+ wave?: string;
115
+ spec?: string;
116
+ plan?: string;
117
+ pr?: string;
118
+ invalidDependencies?: string[];
119
+ };
120
+ }
121
+ export interface WorkflowTrack {
122
+ id: string;
123
+ title: string;
124
+ relativePath: string;
125
+ pathAbs: string;
126
+ status?: string;
127
+ owner?: string | null;
128
+ stories: WorkflowStory[];
129
+ }
130
+ export interface StorySource {
131
+ listStories(): Promise<WorkflowStory[]>;
132
+ }
133
+ export interface ChildRunMetric {
134
+ storyId: string;
135
+ startedAt: string;
136
+ completedAt: string;
137
+ durationMs: number;
138
+ }
139
+ export interface TokenTotals {
140
+ inputTokens: number;
141
+ cachedInputTokens: number;
142
+ outputTokens: number;
143
+ reasoningOutputTokens: number;
144
+ totalTokens: number;
145
+ }
146
+ export interface ChildMetricsSnapshot {
147
+ storyId: string;
148
+ toolCounts: Record<string, number>;
149
+ subagentCounts: Record<string, number>;
150
+ tokenTotals: TokenTotals | null;
151
+ latestProgress: string | null;
152
+ sessionLogPath: string | null;
153
+ }
154
+ export interface LiveMetricsSnapshot {
155
+ runId: string;
156
+ status: RunStatus;
157
+ elapsedMs: number;
158
+ maxParallel: number;
159
+ active: string[];
160
+ completedCount: number;
161
+ blockedStoryId: string | null;
162
+ blockedReason: string | null;
163
+ children: Record<string, ChildMetricsSnapshot>;
164
+ aggregate: {
165
+ toolCounts: Record<string, number>;
166
+ subagentCounts: Record<string, number>;
167
+ tokenTotals: TokenTotals | null;
168
+ };
169
+ }
170
+ export interface RunMetrics {
171
+ elapsedMs: number;
172
+ launchedCount: number;
173
+ completedCount: number;
174
+ blockedCount: number;
175
+ blockedReason: string | null;
176
+ criticalPath: ChildRunMetric[];
177
+ }
178
+ export interface RunState {
179
+ runId: string;
180
+ command: string;
181
+ workspaceRoot: string;
182
+ artifactDir: string;
183
+ status: RunStatus;
184
+ maxParallel: number;
185
+ startedAt: string;
186
+ completedAt?: string;
187
+ active: string[];
188
+ completed: Array<{
189
+ storyId: string;
190
+ ok: boolean;
191
+ sessionId: string | null;
192
+ completedAt: string;
193
+ startedAt?: string;
194
+ durationMs?: number;
195
+ returnedStatus?: string | null;
196
+ returnedComplete?: boolean | null;
197
+ }>;
198
+ blockedStoryId: string | null;
199
+ blockedReason: string | null;
200
+ dryRunDispatch?: string[];
201
+ metrics?: RunMetrics;
202
+ }
203
+ export interface RunEvent {
204
+ ts: string;
205
+ type: string;
206
+ [key: string]: unknown;
207
+ }
208
+ export interface ArtifactStore {
209
+ writeJson(relativePath: string, value: unknown): Promise<void>;
210
+ writeText(relativePath: string, value: string): Promise<void>;
211
+ appendEvent(event: RunEvent): Promise<void>;
212
+ }
213
+ export interface Logger {
214
+ info(message: string, fields?: Record<string, unknown>): void;
215
+ warn(message: string, fields?: Record<string, unknown>): void;
216
+ error(message: string, fields?: Record<string, unknown>): void;
217
+ }
218
+ export interface Clock {
219
+ now(): string;
220
+ nowMs(): number;
221
+ }
222
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@agentic-workflow-kit/orchestrator",
3
+ "version": "0.1.0",
4
+ "description": "Optional autonomous multi-session orchestrator CLI for agentic-workflow-kit.",
5
+ "keywords": [
6
+ "agentic-workflow-kit",
7
+ "workflow",
8
+ "tracker",
9
+ "spec-driven",
10
+ "config",
11
+ "orchestrator",
12
+ "codex",
13
+ "cli",
14
+ "mcp"
15
+ ],
16
+ "author": "Arye Kogan",
17
+ "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/aryeko/agentic-workflow-kit.git",
21
+ "directory": "packages/orchestrator"
22
+ },
23
+ "homepage": "https://github.com/aryeko/agentic-workflow-kit#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/aryeko/agentic-workflow-kit/issues"
26
+ },
27
+ "type": "module",
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "bin": {
31
+ "agentic-workflow-kit": "./dist/cli.js"
32
+ },
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.29.0",
47
+ "commander": "^15.0.0",
48
+ "gray-matter": "^4.0.3",
49
+ "mdast-util-to-string": "^4.0.0",
50
+ "p-limit": "^7.3.0",
51
+ "p-retry": "^8.0.0",
52
+ "p-timeout": "^7.0.1",
53
+ "remark": "^15.0.1",
54
+ "remark-gfm": "^4.0.1",
55
+ "tinyglobby": "^0.2.17",
56
+ "unified": "^11.0.5",
57
+ "yaml": "^2.9.0",
58
+ "zod": "^4.0.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^25.9.1",
62
+ "@vitest/coverage-v8": "^4.1.8",
63
+ "tsx": "^4.22.3",
64
+ "typescript": "^6.0.3",
65
+ "vitest": "^4.1.8"
66
+ },
67
+ "scripts": {
68
+ "build": "tsc -p tsconfig.build.json",
69
+ "agentic-workflow-kit": "tsx --tsconfig tsconfig.typecheck.json src/cli.ts",
70
+ "test": "vitest run --config vitest.config.ts",
71
+ "typecheck": "tsc -p tsconfig.typecheck.json",
72
+ "generate-schema": "tsx src/config/generate-schema.ts",
73
+ "pack:dry-run": "pnpm build && pnpm pack --dry-run"
74
+ }
75
+ }