myshell-tools 1.0.0 → 2.0.0-alpha.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 (150) hide show
  1. package/CHANGELOG.md +44 -69
  2. package/LICENSE +21 -21
  3. package/README.md +178 -318
  4. package/dist/cli.d.ts +8 -0
  5. package/dist/cli.js +106 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/cost.d.ts +36 -0
  8. package/dist/commands/cost.js +103 -0
  9. package/dist/commands/cost.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +36 -0
  11. package/dist/commands/doctor.js +115 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/core/assess.d.ts +25 -0
  14. package/dist/core/assess.js +142 -0
  15. package/dist/core/assess.js.map +1 -0
  16. package/dist/core/classify.d.ts +19 -0
  17. package/dist/core/classify.js +80 -0
  18. package/dist/core/classify.js.map +1 -0
  19. package/dist/core/escalate.d.ts +32 -0
  20. package/dist/core/escalate.js +57 -0
  21. package/dist/core/escalate.js.map +1 -0
  22. package/dist/core/index.d.ts +13 -0
  23. package/dist/core/index.js +12 -0
  24. package/dist/core/index.js.map +1 -0
  25. package/dist/core/orchestrate.d.ts +42 -0
  26. package/dist/core/orchestrate.js +439 -0
  27. package/dist/core/orchestrate.js.map +1 -0
  28. package/dist/core/policy.d.ts +9 -0
  29. package/dist/core/policy.js +27 -0
  30. package/dist/core/policy.js.map +1 -0
  31. package/dist/core/prompt.d.ts +26 -0
  32. package/dist/core/prompt.js +125 -0
  33. package/dist/core/prompt.js.map +1 -0
  34. package/dist/core/review.d.ts +46 -0
  35. package/dist/core/review.js +148 -0
  36. package/dist/core/review.js.map +1 -0
  37. package/dist/core/route.d.ts +28 -0
  38. package/dist/core/route.js +52 -0
  39. package/dist/core/route.js.map +1 -0
  40. package/dist/core/types.d.ts +141 -0
  41. package/dist/core/types.js +14 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/infra/atomic.d.ts +53 -0
  44. package/dist/infra/atomic.js +171 -0
  45. package/dist/infra/atomic.js.map +1 -0
  46. package/dist/infra/clock.d.ts +9 -0
  47. package/dist/infra/clock.js +15 -0
  48. package/dist/infra/clock.js.map +1 -0
  49. package/dist/infra/index.d.ts +9 -0
  50. package/dist/infra/index.js +7 -0
  51. package/dist/infra/index.js.map +1 -0
  52. package/dist/infra/ledger.d.ts +49 -0
  53. package/dist/infra/ledger.js +90 -0
  54. package/dist/infra/ledger.js.map +1 -0
  55. package/dist/infra/paths.d.ts +28 -0
  56. package/dist/infra/paths.js +38 -0
  57. package/dist/infra/paths.js.map +1 -0
  58. package/dist/infra/pricing.d.ts +47 -0
  59. package/dist/infra/pricing.js +151 -0
  60. package/dist/infra/pricing.js.map +1 -0
  61. package/dist/infra/session.d.ts +28 -0
  62. package/dist/infra/session.js +61 -0
  63. package/dist/infra/session.js.map +1 -0
  64. package/dist/interface/render.d.ts +27 -0
  65. package/dist/interface/render.js +134 -0
  66. package/dist/interface/render.js.map +1 -0
  67. package/dist/interface/repl.d.ts +23 -0
  68. package/dist/interface/repl.js +90 -0
  69. package/dist/interface/repl.js.map +1 -0
  70. package/dist/interface/run.d.ts +20 -0
  71. package/dist/interface/run.js +31 -0
  72. package/dist/interface/run.js.map +1 -0
  73. package/dist/providers/claude-parse.d.ts +24 -0
  74. package/dist/providers/claude-parse.js +113 -0
  75. package/dist/providers/claude-parse.js.map +1 -0
  76. package/dist/providers/claude.d.ts +45 -0
  77. package/dist/providers/claude.js +122 -0
  78. package/dist/providers/claude.js.map +1 -0
  79. package/dist/providers/codex-parse.d.ts +32 -0
  80. package/dist/providers/codex-parse.js +145 -0
  81. package/dist/providers/codex-parse.js.map +1 -0
  82. package/dist/providers/codex.d.ts +44 -0
  83. package/dist/providers/codex.js +124 -0
  84. package/dist/providers/codex.js.map +1 -0
  85. package/dist/providers/detect.d.ts +49 -0
  86. package/dist/providers/detect.js +125 -0
  87. package/dist/providers/detect.js.map +1 -0
  88. package/dist/providers/errors.d.ts +49 -0
  89. package/dist/providers/errors.js +189 -0
  90. package/dist/providers/errors.js.map +1 -0
  91. package/dist/providers/index.d.ts +9 -0
  92. package/dist/providers/index.js +7 -0
  93. package/dist/providers/index.js.map +1 -0
  94. package/dist/providers/port.d.ts +74 -0
  95. package/dist/providers/port.js +16 -0
  96. package/dist/providers/port.js.map +1 -0
  97. package/dist/providers/registry.d.ts +21 -0
  98. package/dist/providers/registry.js +34 -0
  99. package/dist/providers/registry.js.map +1 -0
  100. package/dist/ui/banner.d.ts +19 -0
  101. package/dist/ui/banner.js +32 -0
  102. package/dist/ui/banner.js.map +1 -0
  103. package/dist/ui/spinner.d.ts +27 -0
  104. package/dist/ui/spinner.js +67 -0
  105. package/dist/ui/spinner.js.map +1 -0
  106. package/dist/ui/theme.d.ts +32 -0
  107. package/dist/ui/theme.js +56 -0
  108. package/dist/ui/theme.js.map +1 -0
  109. package/package.json +55 -49
  110. package/data/orchestrator.json +0 -113
  111. package/src/auth/recovery.mjs +0 -328
  112. package/src/auth/refresh.mjs +0 -373
  113. package/src/chef.mjs +0 -348
  114. package/src/cli/doctor.mjs +0 -568
  115. package/src/cli/reset.mjs +0 -447
  116. package/src/cli/status.mjs +0 -379
  117. package/src/cli.mjs +0 -429
  118. package/src/commands/doctor.mjs +0 -375
  119. package/src/commands/help.mjs +0 -324
  120. package/src/commands/status.mjs +0 -331
  121. package/src/monitor/health.mjs +0 -486
  122. package/src/monitor/performance.mjs +0 -442
  123. package/src/monitor/report.mjs +0 -535
  124. package/src/orchestrator/classify.mjs +0 -391
  125. package/src/orchestrator/confidence.mjs +0 -151
  126. package/src/orchestrator/handoffs.mjs +0 -231
  127. package/src/orchestrator/review.mjs +0 -222
  128. package/src/providers/balance.mjs +0 -201
  129. package/src/providers/claude.mjs +0 -236
  130. package/src/providers/codex.mjs +0 -255
  131. package/src/providers/detect.mjs +0 -185
  132. package/src/providers/errors.mjs +0 -373
  133. package/src/providers/select.mjs +0 -162
  134. package/src/repl-enhanced.mjs +0 -417
  135. package/src/repl.mjs +0 -321
  136. package/src/state/archive.mjs +0 -366
  137. package/src/state/atomic.mjs +0 -116
  138. package/src/state/cleanup.mjs +0 -440
  139. package/src/state/recovery.mjs +0 -461
  140. package/src/state/session.mjs +0 -147
  141. package/src/ui/errors.mjs +0 -456
  142. package/src/ui/formatter.mjs +0 -327
  143. package/src/ui/icons.mjs +0 -318
  144. package/src/ui/progress.mjs +0 -468
  145. package/templates/prompts/confidence-format.txt +0 -14
  146. package/templates/prompts/ic-with-feedback.txt +0 -41
  147. package/templates/prompts/ic.txt +0 -13
  148. package/templates/prompts/manager-review.txt +0 -40
  149. package/templates/prompts/manager.txt +0 -14
  150. package/templates/prompts/worker.txt +0 -12
@@ -0,0 +1,13 @@
1
+ /**
2
+ * src/core/index.ts — public surface of the pure orchestration core.
3
+ */
4
+ export { orchestrate } from './orchestrate.js';
5
+ export { classify } from './classify.js';
6
+ export { route } from './route.js';
7
+ export { assess } from './assess.js';
8
+ export { buildPrompt } from './prompt.js';
9
+ export { DEFAULT_POLICY } from './policy.js';
10
+ export { nextTierUp, pickReviewer } from './escalate.js';
11
+ export { buildReviewPrompt, parseReviewVerdict } from './review.js';
12
+ export type { ReviewVerdict } from './review.js';
13
+ export type { Tier, Risk, Classification, RouteDecision, Assessment, Clock, SessionEntry, SessionWriter, LedgerEntry, LedgerWriter, Policy, OrchestrateDeps, CoreEvent, } from './types.js';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * src/core/index.ts — public surface of the pure orchestration core.
3
+ */
4
+ export { orchestrate } from './orchestrate.js';
5
+ export { classify } from './classify.js';
6
+ export { route } from './route.js';
7
+ export { assess } from './assess.js';
8
+ export { buildPrompt } from './prompt.js';
9
+ export { DEFAULT_POLICY } from './policy.js';
10
+ export { nextTierUp, pickReviewer } from './escalate.js';
11
+ export { buildReviewPrompt, parseReviewVerdict } from './review.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * src/core/orchestrate.ts — the bounded escalation + review loop.
3
+ *
4
+ * Implements the Phase-2 multi-tier loop:
5
+ * classify → route → run IC → (optionally) cross-vendor review → assess →
6
+ * escalate/retry/accept → final
7
+ *
8
+ * Control-flow overview:
9
+ * 1. Classify the task.
10
+ * 2. If no providers → notice(error) + final(false); return.
11
+ * 3. Append user session entry once.
12
+ * 4. Loop (≤ maxAttempts):
13
+ * a. Route to provider+model for currentTier.
14
+ * b. Yield tier-start → stream provider events → yield tier-done.
15
+ * c. Provider failure → escalate to manager (or break if already there).
16
+ * d. If IC tier + shouldReview(classification, assessment):
17
+ * run cross-vendor reviewer at manager tier.
18
+ * approve → accept; revise → retry IC with notes; escalate → escalate tier.
19
+ * e. Low-confidence / escalate signal → nextTierUp → continue.
20
+ * f. All good → yield final(success:true); return.
21
+ * 5. Loop exhausted or broke on failure → yield final(success:false).
22
+ *
23
+ * Purity rules (enforced by test/arch/guards.test.ts):
24
+ * - No imports of fs / path / child_process
25
+ * - No console.* calls
26
+ * - No Date.now() / Math.random() / new Date() — use deps.clock
27
+ * - No process.exit() — only src/cli.ts may terminate the process
28
+ */
29
+ import type { CoreEvent, OrchestrateDeps } from './types.js';
30
+ /**
31
+ * Orchestrate a task through the bounded escalation + review loop.
32
+ *
33
+ * Yields a sequence of {@link CoreEvent} objects.
34
+ * The interface/render layer drives the generator and surfaces events to
35
+ * the user.
36
+ *
37
+ * @param task - The raw user task description.
38
+ * @param deps - Injected dependencies (providers, clock, session, ledger, policy, …).
39
+ * @param signal - AbortSignal; when aborted the generator stops and yields a
40
+ * notice(warn, 'cancelled') followed by final(success:false).
41
+ */
42
+ export declare function orchestrate(task: string, deps: OrchestrateDeps, signal: AbortSignal): AsyncGenerator<CoreEvent>;
@@ -0,0 +1,439 @@
1
+ /**
2
+ * src/core/orchestrate.ts — the bounded escalation + review loop.
3
+ *
4
+ * Implements the Phase-2 multi-tier loop:
5
+ * classify → route → run IC → (optionally) cross-vendor review → assess →
6
+ * escalate/retry/accept → final
7
+ *
8
+ * Control-flow overview:
9
+ * 1. Classify the task.
10
+ * 2. If no providers → notice(error) + final(false); return.
11
+ * 3. Append user session entry once.
12
+ * 4. Loop (≤ maxAttempts):
13
+ * a. Route to provider+model for currentTier.
14
+ * b. Yield tier-start → stream provider events → yield tier-done.
15
+ * c. Provider failure → escalate to manager (or break if already there).
16
+ * d. If IC tier + shouldReview(classification, assessment):
17
+ * run cross-vendor reviewer at manager tier.
18
+ * approve → accept; revise → retry IC with notes; escalate → escalate tier.
19
+ * e. Low-confidence / escalate signal → nextTierUp → continue.
20
+ * f. All good → yield final(success:true); return.
21
+ * 5. Loop exhausted or broke on failure → yield final(success:false).
22
+ *
23
+ * Purity rules (enforced by test/arch/guards.test.ts):
24
+ * - No imports of fs / path / child_process
25
+ * - No console.* calls
26
+ * - No Date.now() / Math.random() / new Date() — use deps.clock
27
+ * - No process.exit() — only src/cli.ts may terminate the process
28
+ */
29
+ import { classify } from './classify.js';
30
+ import { route } from './route.js';
31
+ import { buildPrompt } from './prompt.js';
32
+ import { assess } from './assess.js';
33
+ import { getModelPricing, calculateCost } from '../infra/pricing.js';
34
+ import { nextTierUp, pickReviewer } from './escalate.js';
35
+ import { buildReviewPrompt, parseReviewVerdict } from './review.js';
36
+ // ---------------------------------------------------------------------------
37
+ // Pure helper: should this IC output be cross-vendor reviewed?
38
+ // ---------------------------------------------------------------------------
39
+ function shouldReview(classification, assessment) {
40
+ return (classification.risk === 'high' ||
41
+ classification.risk === 'critical' ||
42
+ assessment.needsReview === true);
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Public API
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * Orchestrate a task through the bounded escalation + review loop.
49
+ *
50
+ * Yields a sequence of {@link CoreEvent} objects.
51
+ * The interface/render layer drives the generator and surfaces events to
52
+ * the user.
53
+ *
54
+ * @param task - The raw user task description.
55
+ * @param deps - Injected dependencies (providers, clock, session, ledger, policy, …).
56
+ * @param signal - AbortSignal; when aborted the generator stops and yields a
57
+ * notice(warn, 'cancelled') followed by final(success:false).
58
+ */
59
+ export async function* orchestrate(task, deps, signal) {
60
+ // -------------------------------------------------------------------------
61
+ // (a) Classify the task
62
+ // -------------------------------------------------------------------------
63
+ const classification = classify(task);
64
+ yield { type: 'classified', classification };
65
+ // -------------------------------------------------------------------------
66
+ // (b) Resolve available providers
67
+ // -------------------------------------------------------------------------
68
+ const available = Object.keys(deps.providers).filter((id) => deps.providers[id] !== undefined);
69
+ // -------------------------------------------------------------------------
70
+ // (c) No providers path
71
+ // -------------------------------------------------------------------------
72
+ if (available.length === 0) {
73
+ yield {
74
+ type: 'notice',
75
+ level: 'error',
76
+ message: 'No providers are available. Install and authenticate at least one provider ' +
77
+ '(claude or codex) and try again.',
78
+ };
79
+ yield {
80
+ type: 'final',
81
+ success: false,
82
+ output: 'No providers available.',
83
+ tier: classification.tier,
84
+ totalCostUsd: 0,
85
+ sessionId: deps.session.id,
86
+ attempts: 0,
87
+ };
88
+ return;
89
+ }
90
+ // -------------------------------------------------------------------------
91
+ // (d) Append user message to session once (before any tier run)
92
+ // -------------------------------------------------------------------------
93
+ await deps.session.append({
94
+ timestamp: deps.clock.isoNow(),
95
+ role: 'user',
96
+ content: task,
97
+ });
98
+ // -------------------------------------------------------------------------
99
+ // (e) Loop state
100
+ // -------------------------------------------------------------------------
101
+ let currentTier = classification.tier;
102
+ let managerNotes;
103
+ let attempts = 0;
104
+ let totalCostUsd = 0;
105
+ let lastOutput = '';
106
+ // -------------------------------------------------------------------------
107
+ // (f) Main orchestration loop
108
+ // -------------------------------------------------------------------------
109
+ mainLoop: while (attempts < deps.policy.maxAttempts) {
110
+ attempts++;
111
+ // --- Route for current tier ---
112
+ const decision = route(currentTier, available, deps.policy);
113
+ const provider = deps.providers[decision.provider];
114
+ if (provider === undefined) {
115
+ yield {
116
+ type: 'notice',
117
+ level: 'error',
118
+ message: `Provider "${decision.provider}" was selected by route() but is not present in deps.providers.`,
119
+ };
120
+ break mainLoop;
121
+ }
122
+ // --- Build prompt (with optional reviewer feedback on IC retry) ---
123
+ const prompt = currentTier === 'ic' && managerNotes !== undefined
124
+ ? buildPrompt(currentTier, task, managerNotes)
125
+ : buildPrompt(currentTier, task);
126
+ // --- Yield tier-start ---
127
+ yield {
128
+ type: 'tier-start',
129
+ tier: decision.tier,
130
+ provider: decision.provider,
131
+ model: decision.model,
132
+ attempt: attempts,
133
+ };
134
+ // --- Build request and record start time ---
135
+ const req = {
136
+ model: decision.model,
137
+ prompt,
138
+ cwd: deps.cwd,
139
+ sandbox: deps.sandbox,
140
+ timeoutMs: deps.timeoutMs,
141
+ };
142
+ const start = deps.clock.now();
143
+ let finalText;
144
+ let errored;
145
+ let usage;
146
+ let providerCostUsd;
147
+ // Check abort before entering the stream
148
+ if (signal.aborted) {
149
+ yield { type: 'notice', level: 'warn', message: 'cancelled' };
150
+ yield {
151
+ type: 'final',
152
+ success: false,
153
+ output: 'Task was cancelled before it started.',
154
+ tier: decision.tier,
155
+ totalCostUsd,
156
+ sessionId: deps.session.id,
157
+ attempts,
158
+ };
159
+ return;
160
+ }
161
+ // --- Stream provider events ---
162
+ for await (const ev of provider.run(req, signal)) {
163
+ yield { type: 'provider-event', tier: decision.tier, event: ev };
164
+ if (ev.type === 'done') {
165
+ finalText = ev.text;
166
+ if (ev.usage !== undefined && usage === undefined) {
167
+ usage = ev.usage;
168
+ }
169
+ if (ev.costUsd !== undefined) {
170
+ providerCostUsd = ev.costUsd;
171
+ }
172
+ }
173
+ else if (ev.type === 'error') {
174
+ errored = ev.error;
175
+ }
176
+ else if (ev.type === 'usage' && usage === undefined) {
177
+ usage = ev.usage;
178
+ }
179
+ if (signal.aborted) {
180
+ yield { type: 'notice', level: 'warn', message: 'cancelled' };
181
+ yield {
182
+ type: 'final',
183
+ success: false,
184
+ output: 'Task was cancelled.',
185
+ tier: decision.tier,
186
+ totalCostUsd,
187
+ sessionId: deps.session.id,
188
+ attempts,
189
+ };
190
+ return;
191
+ }
192
+ }
193
+ // --- Compute duration + cost ---
194
+ const durationMs = deps.clock.now() - start;
195
+ const success = errored == null;
196
+ const pricing = getModelPricing(decision.provider, decision.model);
197
+ const usd = providerCostUsd ??
198
+ (usage !== undefined && pricing !== undefined
199
+ ? calculateCost(usage.inputTokens, usage.outputTokens, pricing)
200
+ : 0);
201
+ totalCostUsd += usd;
202
+ // --- Assess output ---
203
+ const assessment = assess(finalText ?? '');
204
+ // --- Record in ledger ---
205
+ await deps.ledger.record({
206
+ timestamp: deps.clock.isoNow(),
207
+ sessionId: deps.session.id,
208
+ taskId: deps.clock.uuid(),
209
+ provider: decision.provider,
210
+ model: decision.model,
211
+ tier: decision.tier,
212
+ inputTokens: usage?.inputTokens ?? 0,
213
+ outputTokens: usage?.outputTokens ?? 0,
214
+ cachedInputTokens: usage?.cachedInputTokens ?? 0,
215
+ usd,
216
+ durationMs,
217
+ success,
218
+ });
219
+ // --- Append assistant session entry ---
220
+ await deps.session.append({
221
+ timestamp: deps.clock.isoNow(),
222
+ role: 'assistant',
223
+ content: finalText ?? (errored?.message ?? ''),
224
+ tier: decision.tier,
225
+ provider: decision.provider,
226
+ model: decision.model,
227
+ confidence: assessment.confidence,
228
+ costUsd: usd,
229
+ durationMs,
230
+ });
231
+ // --- Yield tier-done ---
232
+ yield {
233
+ type: 'tier-done',
234
+ tier: decision.tier,
235
+ success,
236
+ confidence: assessment.confidence,
237
+ costUsd: usd,
238
+ durationMs,
239
+ };
240
+ lastOutput = finalText ?? (errored?.message ?? '');
241
+ // -----------------------------------------------------------------------
242
+ // Decision tree
243
+ // -----------------------------------------------------------------------
244
+ // 1) Provider failure → escalate to manager (or fail if already there)
245
+ if (!success) {
246
+ if (currentTier !== 'manager') {
247
+ yield { type: 'escalate', from: currentTier, to: 'manager', reason: 'execution failure' };
248
+ currentTier = 'manager';
249
+ continue mainLoop;
250
+ }
251
+ else {
252
+ break mainLoop; // already at manager; emit failing final below
253
+ }
254
+ }
255
+ // 2) Cross-vendor review for IC work on high/critical risk or needsReview
256
+ if (currentTier === 'ic' && shouldReview(classification, assessment)) {
257
+ const reviewerId = pickReviewer(available, decision.provider);
258
+ const reviewerProvider = reviewerId === null ? undefined : deps.providers[reviewerId];
259
+ if (reviewerId !== null && reviewerProvider !== undefined) {
260
+ const sameVendor = reviewerId === decision.provider;
261
+ yield {
262
+ type: 'notice',
263
+ level: 'info',
264
+ message: `Review by ${reviewerId} (${sameVendor ? 'same vendor' : 'cross-vendor'})`,
265
+ };
266
+ // Route reviewer at manager tier
267
+ const reviewDecision = route('manager', [reviewerId], deps.policy);
268
+ const reviewPrompt = buildReviewPrompt(task, lastOutput);
269
+ // Yield tier-start for review run
270
+ yield {
271
+ type: 'tier-start',
272
+ tier: 'manager',
273
+ provider: reviewerId,
274
+ model: reviewDecision.model,
275
+ attempt: attempts,
276
+ };
277
+ const reviewReq = {
278
+ model: reviewDecision.model,
279
+ prompt: reviewPrompt,
280
+ cwd: deps.cwd,
281
+ sandbox: deps.sandbox,
282
+ timeoutMs: deps.timeoutMs,
283
+ };
284
+ const reviewStart = deps.clock.now();
285
+ let reviewText;
286
+ let reviewErrored;
287
+ let reviewUsage;
288
+ let reviewProviderCostUsd;
289
+ // Check abort before reviewer streaming
290
+ if (signal.aborted) {
291
+ yield { type: 'notice', level: 'warn', message: 'cancelled' };
292
+ yield {
293
+ type: 'final',
294
+ success: false,
295
+ output: 'Task was cancelled.',
296
+ tier: currentTier,
297
+ totalCostUsd,
298
+ sessionId: deps.session.id,
299
+ attempts,
300
+ };
301
+ return;
302
+ }
303
+ for await (const rev of reviewerProvider.run(reviewReq, signal)) {
304
+ yield { type: 'provider-event', tier: 'manager', event: rev };
305
+ if (rev.type === 'done') {
306
+ reviewText = rev.text;
307
+ if (rev.usage !== undefined && reviewUsage === undefined) {
308
+ reviewUsage = rev.usage;
309
+ }
310
+ if (rev.costUsd !== undefined) {
311
+ reviewProviderCostUsd = rev.costUsd;
312
+ }
313
+ }
314
+ else if (rev.type === 'error') {
315
+ reviewErrored = rev.error;
316
+ }
317
+ else if (rev.type === 'usage' && reviewUsage === undefined) {
318
+ reviewUsage = rev.usage;
319
+ }
320
+ if (signal.aborted) {
321
+ yield { type: 'notice', level: 'warn', message: 'cancelled' };
322
+ yield {
323
+ type: 'final',
324
+ success: false,
325
+ output: 'Task was cancelled.',
326
+ tier: currentTier,
327
+ totalCostUsd,
328
+ sessionId: deps.session.id,
329
+ attempts,
330
+ };
331
+ return;
332
+ }
333
+ }
334
+ const reviewDurationMs = deps.clock.now() - reviewStart;
335
+ const reviewSuccess = reviewErrored == null;
336
+ const reviewPricing = getModelPricing(reviewerId, reviewDecision.model);
337
+ const reviewUsd = reviewProviderCostUsd ??
338
+ (reviewUsage !== undefined && reviewPricing !== undefined
339
+ ? calculateCost(reviewUsage.inputTokens, reviewUsage.outputTokens, reviewPricing)
340
+ : 0);
341
+ totalCostUsd += reviewUsd;
342
+ // Record reviewer run in ledger
343
+ await deps.ledger.record({
344
+ timestamp: deps.clock.isoNow(),
345
+ sessionId: deps.session.id,
346
+ taskId: deps.clock.uuid(),
347
+ provider: reviewerId,
348
+ model: reviewDecision.model,
349
+ tier: 'manager',
350
+ inputTokens: reviewUsage?.inputTokens ?? 0,
351
+ outputTokens: reviewUsage?.outputTokens ?? 0,
352
+ cachedInputTokens: reviewUsage?.cachedInputTokens ?? 0,
353
+ usd: reviewUsd,
354
+ durationMs: reviewDurationMs,
355
+ success: reviewSuccess,
356
+ });
357
+ // Yield tier-done for reviewer
358
+ yield {
359
+ type: 'tier-done',
360
+ tier: 'manager',
361
+ success: reviewSuccess,
362
+ confidence: null,
363
+ costUsd: reviewUsd,
364
+ durationMs: reviewDurationMs,
365
+ };
366
+ // Parse verdict and act on it
367
+ const verdict = parseReviewVerdict(reviewText ?? '');
368
+ yield {
369
+ type: 'notice',
370
+ level: 'info',
371
+ message: `Review verdict: ${verdict.verdict}`,
372
+ };
373
+ if (verdict.verdict === 'approve') {
374
+ yield {
375
+ type: 'final',
376
+ success: true,
377
+ output: lastOutput,
378
+ tier: currentTier,
379
+ totalCostUsd,
380
+ sessionId: deps.session.id,
381
+ attempts,
382
+ };
383
+ return;
384
+ }
385
+ if (verdict.verdict === 'revise') {
386
+ // Retry IC with reviewer's notes; managerNotes is cleared after use
387
+ managerNotes = verdict.notes;
388
+ // Stay at 'ic' tier; loop continues
389
+ continue mainLoop;
390
+ }
391
+ // verdict === 'escalate'
392
+ yield { type: 'escalate', from: 'ic', to: 'manager', reason: 'reviewer escalation' };
393
+ currentTier = 'manager';
394
+ continue mainLoop;
395
+ }
396
+ }
397
+ // 3) Confidence-based escalation
398
+ const threshold = deps.policy.escalateBelowConfidence[classification.risk];
399
+ const needEsc = assessment.escalate ||
400
+ (assessment.confidence !== null && assessment.confidence < threshold);
401
+ const nextTier = nextTierUp(currentTier);
402
+ if (needEsc && nextTier !== null) {
403
+ const escalateReason = assessment.reason !== 'model provided no reason' &&
404
+ assessment.reason !== 'no confidence envelope'
405
+ ? assessment.reason
406
+ : 'low confidence';
407
+ yield {
408
+ type: 'escalate',
409
+ from: currentTier,
410
+ to: nextTier,
411
+ reason: escalateReason,
412
+ };
413
+ currentTier = nextTier;
414
+ continue mainLoop;
415
+ }
416
+ // 4) Accept — everything checks out
417
+ yield {
418
+ type: 'final',
419
+ success: true,
420
+ output: lastOutput,
421
+ tier: currentTier,
422
+ totalCostUsd,
423
+ sessionId: deps.session.id,
424
+ attempts,
425
+ };
426
+ return;
427
+ }
428
+ // Loop exhausted or broke out on failure
429
+ yield {
430
+ type: 'final',
431
+ success: false,
432
+ output: lastOutput,
433
+ tier: currentTier,
434
+ totalCostUsd,
435
+ sessionId: deps.session.id,
436
+ attempts,
437
+ };
438
+ }
439
+ //# sourceMappingURL=orchestrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/core/orchestrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * src/core/policy.ts — the single source of orchestration thresholds & routing
3
+ * preferences. All tunable numbers live here (typed by `Policy` in types.ts),
4
+ * never scattered as magic constants across the core.
5
+ *
6
+ * Pure data module: no I/O, no time, no randomness.
7
+ */
8
+ import type { Policy } from './types.js';
9
+ export declare const DEFAULT_POLICY: Policy;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * src/core/policy.ts — the single source of orchestration thresholds & routing
3
+ * preferences. All tunable numbers live here (typed by `Policy` in types.ts),
4
+ * never scattered as magic constants across the core.
5
+ *
6
+ * Pure data module: no I/O, no time, no randomness.
7
+ */
8
+ export const DEFAULT_POLICY = {
9
+ maxAttempts: 3,
10
+ // Higher-risk work demands higher confidence before we accept it; below the
11
+ // threshold we escalate to a higher tier (or, later, a cross-vendor review).
12
+ escalateBelowConfidence: {
13
+ low: 0.4,
14
+ medium: 0.5,
15
+ high: 0.7,
16
+ critical: 0.8,
17
+ },
18
+ // Provider preference per tier. route() picks the first available provider in
19
+ // this order that has a model for the tier; otherwise it falls back to the
20
+ // cheapest available model for that tier (via pricing.getCheapestForTier).
21
+ providerOrderByTier: {
22
+ worker: ['claude', 'codex'],
23
+ ic: ['claude', 'codex'],
24
+ manager: ['claude', 'codex'],
25
+ },
26
+ };
27
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,WAAW,EAAE,CAAC;IAEd,4EAA4E;IAC5E,6EAA6E;IAC7E,uBAAuB,EAAE;QACvB,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,GAAG;KACd;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,mBAAmB,EAAE;QACnB,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC7B;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * src/core/prompt.ts — typed, tier-specific prompt builders.
3
+ *
4
+ * Each tier gets a professional role prompt that instructs the model to perform
5
+ * real work and end its response with a structured JSON confidence envelope on
6
+ * its own line. The envelope is the only source of confidence data — no keyword
7
+ * heuristics, no fabricated numbers.
8
+ *
9
+ * Pure module: no I/O, no time, no randomness.
10
+ */
11
+ import type { Tier } from './types.js';
12
+ /**
13
+ * Build the full prompt string to deliver to a model for the given tier.
14
+ *
15
+ * The system instructions are prepended to the raw task so the model receives
16
+ * role context before the user request.
17
+ *
18
+ * When `managerNotes` is provided (IC retry after a reviewer's `revise` verdict),
19
+ * the prompt is extended with a REVIEWER FEEDBACK section so the IC can address
20
+ * the specific feedback on its next attempt.
21
+ *
22
+ * @param tier - The orchestration tier that will handle the task.
23
+ * @param task - The raw user task description.
24
+ * @param managerNotes - Optional feedback from a cross-vendor reviewer to be addressed.
25
+ */
26
+ export declare function buildPrompt(tier: Tier, task: string, managerNotes?: string): string;