howtofixcli 0.7.13 → 0.7.15

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 (161) hide show
  1. package/dist/chunk-27TRKD65.js +2 -0
  2. package/dist/chunk-3FYCFLNK.js +1 -0
  3. package/dist/chunk-56SEAGAQ.js +1 -0
  4. package/dist/chunk-6FUWMLWO.js +1 -0
  5. package/dist/chunk-7CHDNTH6.js +1 -0
  6. package/dist/chunk-7DTQKDO4.js +2 -0
  7. package/dist/chunk-AGGIYXN7.js +2 -0
  8. package/dist/chunk-AUDMRGWF.js +189 -0
  9. package/dist/chunk-CPJKKHGH.js +1 -0
  10. package/dist/chunk-DAPXGSGD.js +12 -0
  11. package/dist/chunk-DOD7MUGX.js +1 -0
  12. package/dist/chunk-DV2BBBBJ.js +2 -0
  13. package/dist/chunk-EIBOS5KO.js +5 -0
  14. package/dist/chunk-EYWOVCSS.js +6 -0
  15. package/dist/chunk-FPXVDP32.js +8 -0
  16. package/dist/chunk-GXB7RZHH.js +1 -0
  17. package/dist/chunk-HT3MFLAV.js +34 -0
  18. package/dist/chunk-ILDDDLRC.js +1 -0
  19. package/dist/chunk-JFYVRWJI.js +2 -0
  20. package/dist/chunk-JMKK26AT.js +2 -0
  21. package/dist/chunk-LAHVHRCS.js +2 -0
  22. package/dist/chunk-LOOFOBTS.js +1 -0
  23. package/dist/chunk-LSJC73DG.js +1 -0
  24. package/dist/chunk-MOKUBKE7.js +1 -0
  25. package/dist/chunk-N345KWWK.js +1 -0
  26. package/dist/chunk-ONZLNFQ2.js +3 -0
  27. package/dist/chunk-ORJ2QZBG.js +3 -0
  28. package/dist/chunk-PCALBZOO.js +2 -0
  29. package/dist/chunk-SX5VE6XA.js +110 -0
  30. package/dist/chunk-TSEKPGK4.js +1 -0
  31. package/dist/chunk-UNK5HRQR.js +1 -0
  32. package/dist/chunk-UTYFLLSM.js +1 -0
  33. package/dist/chunk-V2RPZMLK.js +1 -0
  34. package/dist/chunk-V3R4FYTJ.js +1 -0
  35. package/dist/chunk-V656XVXV.js +8 -0
  36. package/dist/chunk-VLMQSD25.js +1 -0
  37. package/dist/chunk-WKUJ7CFO.js +1 -0
  38. package/dist/chunk-WOT6VMZA.js +1 -0
  39. package/dist/chunk-WUPU6LTD.js +4 -0
  40. package/dist/chunk-WX3V5P7U.js +5 -0
  41. package/dist/chunk-Y7YM5R75.js +5 -0
  42. package/dist/chunk-YW7NORH3.js +2 -0
  43. package/dist/main.js +99 -540
  44. package/package.json +17 -64
  45. package/dist/account-credential.js +0 -136
  46. package/dist/account-credential.test.js +0 -38
  47. package/dist/activity.js +0 -124
  48. package/dist/agent-defs.js +0 -237
  49. package/dist/agent-limiter.js +0 -68
  50. package/dist/agents.js +0 -554
  51. package/dist/anim.js +0 -361
  52. package/dist/args.js +0 -228
  53. package/dist/at-file.js +0 -28
  54. package/dist/brand-extension.js +0 -87
  55. package/dist/brand.js +0 -76
  56. package/dist/browser.js +0 -58
  57. package/dist/cache-report.js +0 -139
  58. package/dist/checkpoint.js +0 -437
  59. package/dist/claims.js +0 -167
  60. package/dist/cli-auth.js +0 -142
  61. package/dist/cli-checkin.js +0 -120
  62. package/dist/cli-credentials.js +0 -254
  63. package/dist/clipboard.js +0 -149
  64. package/dist/collapse.js +0 -129
  65. package/dist/commands.js +0 -294
  66. package/dist/compaction-guard.js +0 -81
  67. package/dist/context-extension.js +0 -17
  68. package/dist/dcp/commands.js +0 -172
  69. package/dist/dcp/compress-state.js +0 -139
  70. package/dist/dcp/compress.js +0 -329
  71. package/dist/dcp/dcp-extension.js +0 -295
  72. package/dist/dcp/dedup.js +0 -93
  73. package/dist/dcp/ids.js +0 -189
  74. package/dist/dcp/index.js +0 -25
  75. package/dist/dcp/middle-prune.js +0 -76
  76. package/dist/dcp/prompts.js +0 -68
  77. package/dist/dcp/protected-content.js +0 -221
  78. package/dist/dcp/protected.js +0 -161
  79. package/dist/dcp/prune.js +0 -418
  80. package/dist/dcp/state.js +0 -176
  81. package/dist/device-id.js +0 -90
  82. package/dist/device-id.test.js +0 -23
  83. package/dist/errors.js +0 -63
  84. package/dist/extensions.js +0 -48
  85. package/dist/fatal.js +0 -35
  86. package/dist/feed.js +0 -498
  87. package/dist/fs-atomic.js +0 -54
  88. package/dist/gateway-errors.js +0 -90
  89. package/dist/git.js +0 -230
  90. package/dist/goal-extension.js +0 -88
  91. package/dist/goal.js +0 -222
  92. package/dist/hooks-extension.js +0 -176
  93. package/dist/hooks.js +0 -443
  94. package/dist/howtofix-account.js +0 -735
  95. package/dist/hud-line.js +0 -153
  96. package/dist/hwid.js +0 -130
  97. package/dist/interrupt.js +0 -60
  98. package/dist/json-events.js +0 -50
  99. package/dist/level-style.js +0 -112
  100. package/dist/loop-guard.js +0 -95
  101. package/dist/lsp-tools.js +0 -32
  102. package/dist/lsp.js +0 -429
  103. package/dist/mcp-config.js +0 -85
  104. package/dist/mcp-lifecycle.js +0 -147
  105. package/dist/model-catalog.js +0 -217
  106. package/dist/model-facts.js +0 -35
  107. package/dist/model-resolve.js +0 -65
  108. package/dist/notes.js +0 -78
  109. package/dist/oauth-login.js +0 -568
  110. package/dist/paths.js +0 -61
  111. package/dist/permissions.js +0 -298
  112. package/dist/plan-mode.js +0 -363
  113. package/dist/preset-command.js +0 -227
  114. package/dist/preset-extension.js +0 -35
  115. package/dist/preset-mcp.js +0 -292
  116. package/dist/presets.js +0 -727
  117. package/dist/prompt-files.js +0 -103
  118. package/dist/prompt-text.js +0 -41
  119. package/dist/proxy.js +0 -137
  120. package/dist/quality/ast.js +0 -196
  121. package/dist/quality/cognitive.js +0 -83
  122. package/dist/quality/cyclomatic.js +0 -30
  123. package/dist/quality/halstead.js +0 -83
  124. package/dist/quality/index.js +0 -18
  125. package/dist/quality/length.js +0 -3
  126. package/dist/quality/maintainability.js +0 -15
  127. package/dist/quality/nesting.js +0 -57
  128. package/dist/quality/report.js +0 -803
  129. package/dist/quality/smells.js +0 -67
  130. package/dist/quality-tool.js +0 -63
  131. package/dist/read-only-commands.js +0 -597
  132. package/dist/repo-map.js +0 -292
  133. package/dist/rtk.js +0 -193
  134. package/dist/sandbox.js +0 -105
  135. package/dist/schema.js +0 -214
  136. package/dist/session-lifecycle.js +0 -19
  137. package/dist/session-retention.js +0 -111
  138. package/dist/session.js +0 -447
  139. package/dist/sessions.js +0 -100
  140. package/dist/settings.js +0 -148
  141. package/dist/skills.js +0 -35
  142. package/dist/slop-tool.js +0 -96
  143. package/dist/spend-cap.js +0 -43
  144. package/dist/subagent.js +0 -171
  145. package/dist/tar.js +0 -146
  146. package/dist/theme.js +0 -79
  147. package/dist/thinking.js +0 -45
  148. package/dist/todo.js +0 -114
  149. package/dist/tool-loadout.js +0 -97
  150. package/dist/tool-render.js +0 -769
  151. package/dist/tools.js +0 -176
  152. package/dist/ui.js +0 -4778
  153. package/dist/update.js +0 -551
  154. package/dist/usage-segment.js +0 -69
  155. package/dist/web-tools.js +0 -46
  156. package/dist/web.js +0 -265
  157. package/dist/welcome.js +0 -179
  158. package/dist/workflow-engine.js +0 -246
  159. package/dist/workflow-progress.js +0 -446
  160. package/dist/workflow-view.js +0 -195
  161. package/dist/workflow.js +0 -349
@@ -1,246 +0,0 @@
1
- import { acquireAgentSlot } from "./agent-limiter.js";
2
- export const LIFETIME_CAP = 1000;
3
- export const FANOUT_CAP = 4096;
4
- /** How often a paused run re-checks for resume. */
5
- export const PAUSE_POLL_MS = 100;
6
- /** Ceiling on a pause, so a forgotten pause cannot hang the run forever. */
7
- export const PAUSE_MAX_MS = 5 * 60 * 1000;
8
- /**
9
- * Hold until the run is resumed, or give up after {@link PAUSE_MAX_MS}.
10
- *
11
- * Resolves `true` to continue and `false` when the wait ran out — the caller
12
- * then resolves that one call as `null`, which is the engine's normal way of
13
- * saying "this agent produced nothing". A pause is therefore visible in the
14
- * results instead of silently vanishing.
15
- */
16
- export async function waitForResume(options, pollMs = PAUSE_POLL_MS, maxMs = PAUSE_MAX_MS) {
17
- const deadline = Date.now() + maxMs;
18
- while (options.isPaused?.()) {
19
- if (options.signal?.aborted)
20
- return false;
21
- if (Date.now() >= deadline)
22
- return false;
23
- await new Promise((resolve) => setTimeout(resolve, pollMs));
24
- }
25
- return true;
26
- }
27
- /** Thrown for the three conditions that must not be swallowed by a script. */
28
- export class WorkflowError extends Error {
29
- constructor(message) {
30
- super(message);
31
- this.name = "WorkflowError";
32
- }
33
- }
34
- /** A FIFO semaphore, so `parallel()` fans out up to `limit` and queues the rest. */
35
- function createSemaphore(limit) {
36
- let active = 0;
37
- const waiting = [];
38
- return async function acquire() {
39
- if (active >= limit)
40
- await new Promise((resolve) => waiting.push(resolve));
41
- active++;
42
- let released = false;
43
- return () => {
44
- if (released)
45
- return;
46
- released = true;
47
- active--;
48
- waiting.shift()?.();
49
- };
50
- };
51
- }
52
- /**
53
- * Build the bindings for one run.
54
- *
55
- * Every agent call goes through {@link createBindings}'s `runAgent`, which owns
56
- * the counters, the semaphore and the budget check — so no binding can bypass
57
- * the caps.
58
- */
59
- export function createBindings(options) {
60
- const lifetimeCap = options.lifetimeCap ?? LIFETIME_CAP;
61
- const fanoutCap = options.fanoutCap ?? FANOUT_CAP;
62
- // The width is the shared limiter's, so a `task` call running at the same time
63
- // is counted against the same budget. `concurrency` remains for a script that
64
- // wants fewer in flight than the machine allows.
65
- const local = options.concurrency ? createSemaphore(options.concurrency) : null;
66
- const acquire = async () => {
67
- const releaseShared = await acquireAgentSlot();
68
- if (!local)
69
- return releaseShared;
70
- const releaseLocal = await local();
71
- return () => {
72
- releaseLocal();
73
- releaseShared();
74
- };
75
- };
76
- let calls = 0;
77
- let spent = 0;
78
- let currentPhase = "";
79
- const emit = (event) => options.onEvent?.(event);
80
- // Live snapshots, keyed by call so a repair turn updates the same entry rather
81
- // than adding a second one for what the user sees as one agent.
82
- const snapshots = new Map();
83
- const publish = () => options.onProgress?.([...snapshots.values()]);
84
- const runAgent = async (prompt, opts) => {
85
- const spec = opts ?? {};
86
- const label = typeof spec.label === "string" ? spec.label : `agent-${calls + 1}`;
87
- const phase = typeof spec.phase === "string" ? spec.phase : currentPhase;
88
- const agentType = typeof spec.agentType === "string" ? spec.agentType : "task";
89
- const effort = typeof spec.effort === "string" ? spec.effort : undefined;
90
- const model = typeof spec.model === "string" ? spec.model : undefined;
91
- const isolation = typeof spec.isolation === "string" ? spec.isolation : undefined;
92
- const schema = spec.schema;
93
- // Budget and lifetime are checked before dispatch and throw, unlike an agent
94
- // failure. This is the one difference a script is required to handle.
95
- if (options.budgetTotal != null && spent >= options.budgetTotal) {
96
- throw new WorkflowError(`budget exhausted: spent ${spent} of ${options.budgetTotal} output tokens`);
97
- }
98
- if (calls >= lifetimeCap) {
99
- throw new WorkflowError(`lifetime cap reached: ${lifetimeCap} agent calls in one run`);
100
- }
101
- calls++;
102
- const callIndex = calls;
103
- // A pause holds the queue, it does not discard it: every call still runs,
104
- // just later. The wait is bounded so a forgotten pause cannot hang a run.
105
- if (options.isPaused?.()) {
106
- const release = await waitForResume(options, PAUSE_POLL_MS, PAUSE_MAX_MS);
107
- if (!release)
108
- return null;
109
- }
110
- const release = await acquire();
111
- try {
112
- if (options.signal?.aborted)
113
- return null;
114
- emit({ kind: "agent_start", label, phase, ordinal: calls });
115
- snapshots.set(callIndex, {
116
- label,
117
- phase,
118
- agentType,
119
- status: "running",
120
- outputTokens: 0,
121
- ...(model ? { model } : {}),
122
- startedAt: Date.now(),
123
- });
124
- publish();
125
- const settle = (status, outcome, detail) => {
126
- const entry = snapshots.get(callIndex);
127
- if (entry) {
128
- entry.status = status;
129
- entry.outputTokens = outcome.outputTokens;
130
- entry.endedAt = Date.now();
131
- if (outcome.toolCalls !== undefined)
132
- entry.toolCalls = outcome.toolCalls;
133
- if (outcome.model !== undefined)
134
- entry.model = outcome.model;
135
- if (detail)
136
- entry.detail = detail;
137
- }
138
- emit({ kind: "agent_end", label, ok: status === "ok", outputTokens: outcome.outputTokens });
139
- publish();
140
- };
141
- // A schema call gets one repair turn: the model is shown the validation
142
- // errors and asked again. Exhausting the retries resolves null, per spec.
143
- const attempts = schema === undefined ? 1 : 2;
144
- for (let attempt = 0; attempt < attempts; attempt++) {
145
- const ask = attempt === 0 ? String(prompt) : undefined;
146
- const outcome = await invokeSafely(ask ?? buildRepairPrompt(String(prompt), lastRejection), { label, phase, agentType, effort, model, isolation });
147
- if (outcome === null) {
148
- settle("failed", { text: "", outputTokens: 0 });
149
- return null;
150
- }
151
- spent += outcome.outputTokens;
152
- if (schema === undefined) {
153
- settle("ok", outcome, firstLine(outcome.text));
154
- return outcome.text;
155
- }
156
- const parsed = extractJsonLoose(outcome.text);
157
- const issues = parsed === undefined ? [{ path: "", message: "reply was not JSON" }] : validateSchema(parsed, schema);
158
- if (issues.length === 0) {
159
- settle("ok", outcome, firstLine(outcome.text));
160
- return parsed;
161
- }
162
- lastRejection = formatIssues(issues);
163
- if (attempt === attempts - 1) {
164
- settle("failed", outcome, `schema: ${firstLine(lastRejection)}`);
165
- return null;
166
- }
167
- }
168
- return null;
169
- }
170
- finally {
171
- release();
172
- }
173
- };
174
- let lastRejection = "";
175
- const invokeSafely = async (prompt, spec) => {
176
- try {
177
- return await options.invoke({ prompt, ...spec });
178
- }
179
- catch {
180
- // Engine-internal failures degrade to null, never a throw.
181
- return null;
182
- }
183
- };
184
- const parallel = async (thunks) => {
185
- if (thunks.length > fanoutCap) {
186
- throw new WorkflowError(`fan-out cap exceeded: ${thunks.length} items (max ${fanoutCap})`);
187
- }
188
- const results = await Promise.all(thunks.map(async (thunk) => {
189
- try {
190
- return await thunk();
191
- }
192
- catch {
193
- return null;
194
- }
195
- }));
196
- return results;
197
- };
198
- const pipeline = async (items, ...stages) => {
199
- if (items.length > fanoutCap) {
200
- throw new WorkflowError(`fan-out cap exceeded: ${items.length} items (max ${fanoutCap})`);
201
- }
202
- const results = await Promise.all(items.map(async (item, index) => {
203
- let prev = item;
204
- for (const stage of stages) {
205
- try {
206
- prev = await stage(prev, item, index);
207
- }
208
- catch {
209
- return null; // only a throw drops the item
210
- }
211
- }
212
- return prev;
213
- }));
214
- return results;
215
- };
216
- return {
217
- agent: (prompt, opts) => runAgent(prompt, opts),
218
- parallel,
219
- pipeline,
220
- phase: (title) => {
221
- currentPhase = String(title);
222
- emit({ kind: "phase", title: currentPhase });
223
- },
224
- log: (message) => emit({ kind: "log", message: String(message) }),
225
- args: options.args,
226
- budget: {
227
- total: options.budgetTotal ?? null,
228
- spent: () => spent,
229
- remaining: () => (options.budgetTotal == null ? Infinity : Math.max(0, options.budgetTotal - spent)),
230
- },
231
- };
232
- }
233
- /** Told to the model when its reply did not validate. */
234
- function buildRepairPrompt(original, rejection) {
235
- return `${original}\n\nYour previous reply did not satisfy the required schema:\n${rejection}\n\nReply with ONLY a corrected JSON value.`;
236
- }
237
- /** The first non-empty line, clipped — the one-line detail for a progress row. */
238
- function firstLine(text, max = 80) {
239
- const line = text
240
- .split("\n")
241
- .map((entry) => entry.trim())
242
- .find((entry) => entry.length > 0) ?? "";
243
- return line.length > max ? `${line.slice(0, max)}…` : line;
244
- }
245
- /** Late-bound to keep `validateSchema`/`extractJson` out of the engine's import cycle. */
246
- import { extractJson as extractJsonLoose, formatIssues, validateSchema } from "./schema.js";