howtofixcli 0.7.8 → 0.7.10

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 (152) hide show
  1. package/dist/chunk-27TRKD65.js +2 -0
  2. package/dist/chunk-2YYQ3OBQ.js +1 -0
  3. package/dist/chunk-3FYCFLNK.js +1 -0
  4. package/dist/chunk-3KT55SQP.js +34 -0
  5. package/dist/chunk-4BWDGEXH.js +5 -0
  6. package/dist/chunk-56SEAGAQ.js +1 -0
  7. package/dist/chunk-6FUWMLWO.js +1 -0
  8. package/dist/chunk-7CHDNTH6.js +1 -0
  9. package/dist/chunk-ACOMNDUL.js +185 -0
  10. package/dist/chunk-AGGIYXN7.js +2 -0
  11. package/dist/chunk-BHVBO4SC.js +1 -0
  12. package/dist/chunk-CGHISVXB.js +1 -0
  13. package/dist/chunk-FPXVDP32.js +8 -0
  14. package/dist/chunk-FRGMJPNO.js +2 -0
  15. package/dist/chunk-GXB7RZHH.js +1 -0
  16. package/dist/chunk-ILDDDLRC.js +1 -0
  17. package/dist/chunk-JFYVRWJI.js +2 -0
  18. package/dist/chunk-MTNY7MFG.js +6 -0
  19. package/dist/chunk-MVLCGU3G.js +1 -0
  20. package/dist/chunk-N345KWWK.js +1 -0
  21. package/dist/chunk-ORJ2QZBG.js +3 -0
  22. package/dist/chunk-PCALBZOO.js +2 -0
  23. package/dist/chunk-PIEAJJRE.js +5 -0
  24. package/dist/chunk-RDRF7DIS.js +109 -0
  25. package/dist/chunk-TEW62VDF.js +1 -0
  26. package/dist/chunk-TSEKPGK4.js +1 -0
  27. package/dist/chunk-UTYFLLSM.js +1 -0
  28. package/dist/chunk-V3R4FYTJ.js +1 -0
  29. package/dist/chunk-V656XVXV.js +8 -0
  30. package/dist/chunk-VICEM5Y2.js +2 -0
  31. package/dist/chunk-WKUJ7CFO.js +1 -0
  32. package/dist/chunk-WOT6VMZA.js +1 -0
  33. package/dist/chunk-WUPU6LTD.js +4 -0
  34. package/dist/chunk-WX3V5P7U.js +5 -0
  35. package/dist/chunk-WZKWT757.js +2 -0
  36. package/dist/main.js +94 -536
  37. package/package.json +16 -63
  38. package/dist/account-credential.js +0 -136
  39. package/dist/account-credential.test.js +0 -38
  40. package/dist/activity.js +0 -124
  41. package/dist/agent-defs.js +0 -237
  42. package/dist/agent-limiter.js +0 -68
  43. package/dist/agents.js +0 -554
  44. package/dist/anim.js +0 -361
  45. package/dist/args.js +0 -228
  46. package/dist/at-file.js +0 -28
  47. package/dist/brand-extension.js +0 -87
  48. package/dist/brand.js +0 -76
  49. package/dist/browser.js +0 -58
  50. package/dist/cache-report.js +0 -139
  51. package/dist/checkpoint.js +0 -437
  52. package/dist/claims.js +0 -167
  53. package/dist/cli-auth.js +0 -142
  54. package/dist/cli-checkin.js +0 -120
  55. package/dist/cli-credentials.js +0 -254
  56. package/dist/clipboard.js +0 -149
  57. package/dist/collapse.js +0 -129
  58. package/dist/commands.js +0 -301
  59. package/dist/compaction-guard.js +0 -81
  60. package/dist/context-extension.js +0 -17
  61. package/dist/dcp/commands.js +0 -172
  62. package/dist/dcp/compress-state.js +0 -139
  63. package/dist/dcp/compress.js +0 -329
  64. package/dist/dcp/dcp-extension.js +0 -288
  65. package/dist/dcp/dedup.js +0 -93
  66. package/dist/dcp/ids.js +0 -189
  67. package/dist/dcp/index.js +0 -25
  68. package/dist/dcp/prompts.js +0 -68
  69. package/dist/dcp/protected-content.js +0 -221
  70. package/dist/dcp/protected.js +0 -161
  71. package/dist/dcp/prune.js +0 -418
  72. package/dist/dcp/state.js +0 -176
  73. package/dist/device-id.js +0 -90
  74. package/dist/device-id.test.js +0 -23
  75. package/dist/errors.js +0 -63
  76. package/dist/extensions.js +0 -48
  77. package/dist/fatal.js +0 -35
  78. package/dist/feed.js +0 -498
  79. package/dist/fs-atomic.js +0 -54
  80. package/dist/gateway-errors.js +0 -90
  81. package/dist/git.js +0 -230
  82. package/dist/goal-extension.js +0 -88
  83. package/dist/goal.js +0 -222
  84. package/dist/hooks-extension.js +0 -176
  85. package/dist/hooks.js +0 -443
  86. package/dist/howtofix-account.js +0 -715
  87. package/dist/hud-line.js +0 -153
  88. package/dist/hwid.js +0 -130
  89. package/dist/interrupt.js +0 -60
  90. package/dist/json-events.js +0 -50
  91. package/dist/level-style.js +0 -112
  92. package/dist/loop-guard.js +0 -95
  93. package/dist/lsp-tools.js +0 -32
  94. package/dist/lsp.js +0 -347
  95. package/dist/mcp-config.js +0 -85
  96. package/dist/mcp-lifecycle.js +0 -147
  97. package/dist/model-catalog.js +0 -217
  98. package/dist/model-resolve.js +0 -65
  99. package/dist/notes.js +0 -78
  100. package/dist/oauth-login.js +0 -568
  101. package/dist/paths.js +0 -61
  102. package/dist/permissions.js +0 -298
  103. package/dist/plan-mode.js +0 -363
  104. package/dist/preset-command.js +0 -227
  105. package/dist/preset-extension.js +0 -35
  106. package/dist/preset-mcp.js +0 -292
  107. package/dist/presets.js +0 -727
  108. package/dist/prompt-files.js +0 -103
  109. package/dist/prompt-text.js +0 -41
  110. package/dist/proxy.js +0 -137
  111. package/dist/quality/ast.js +0 -196
  112. package/dist/quality/cognitive.js +0 -83
  113. package/dist/quality/cyclomatic.js +0 -30
  114. package/dist/quality/halstead.js +0 -83
  115. package/dist/quality/index.js +0 -18
  116. package/dist/quality/length.js +0 -3
  117. package/dist/quality/maintainability.js +0 -15
  118. package/dist/quality/nesting.js +0 -57
  119. package/dist/quality/report.js +0 -803
  120. package/dist/quality/smells.js +0 -67
  121. package/dist/quality-tool.js +0 -63
  122. package/dist/read-only-commands.js +0 -597
  123. package/dist/repo-map.js +0 -292
  124. package/dist/rtk.js +0 -193
  125. package/dist/sandbox.js +0 -105
  126. package/dist/schema.js +0 -214
  127. package/dist/session-lifecycle.js +0 -19
  128. package/dist/session-retention.js +0 -111
  129. package/dist/session.js +0 -446
  130. package/dist/sessions.js +0 -100
  131. package/dist/settings.js +0 -148
  132. package/dist/skills.js +0 -35
  133. package/dist/slop-tool.js +0 -96
  134. package/dist/spend-cap.js +0 -43
  135. package/dist/subagent.js +0 -171
  136. package/dist/tar.js +0 -146
  137. package/dist/theme.js +0 -79
  138. package/dist/thinking.js +0 -45
  139. package/dist/todo.js +0 -114
  140. package/dist/tool-loadout.js +0 -97
  141. package/dist/tool-render.js +0 -769
  142. package/dist/tools.js +0 -176
  143. package/dist/ui.js +0 -4757
  144. package/dist/update.js +0 -533
  145. package/dist/usage-segment.js +0 -69
  146. package/dist/web-tools.js +0 -46
  147. package/dist/web.js +0 -265
  148. package/dist/welcome.js +0 -179
  149. package/dist/workflow-engine.js +0 -246
  150. package/dist/workflow-progress.js +0 -446
  151. package/dist/workflow-view.js +0 -195
  152. 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";