ftown 0.25.1 → 0.25.3
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/dist/command-rpc.d.ts +3 -0
- package/dist/command-rpc.js +41 -0
- package/dist/command-rpc.js.map +1 -1
- package/dist/ftown-cli.js +5 -2
- package/dist/ftown-cli.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/quota/agy.d.ts +16 -0
- package/dist/quota/agy.js +287 -0
- package/dist/quota/agy.js.map +1 -0
- package/dist/quota/annotate.d.ts +5 -0
- package/dist/quota/annotate.js +56 -0
- package/dist/quota/annotate.js.map +1 -0
- package/dist/quota/claude.d.ts +27 -0
- package/dist/quota/claude.js +265 -0
- package/dist/quota/claude.js.map +1 -0
- package/dist/quota/codex.d.ts +25 -0
- package/dist/quota/codex.js +378 -0
- package/dist/quota/codex.js.map +1 -0
- package/dist/quota/format.d.ts +6 -0
- package/dist/quota/format.js +113 -0
- package/dist/quota/format.js.map +1 -0
- package/dist/quota/grok.d.ts +97 -0
- package/dist/quota/grok.js +563 -0
- package/dist/quota/grok.js.map +1 -0
- package/dist/quota/models-agy.d.ts +10 -0
- package/dist/quota/models-agy.js +144 -0
- package/dist/quota/models-agy.js.map +1 -0
- package/dist/quota/models-claude.d.ts +10 -0
- package/dist/quota/models-claude.js +227 -0
- package/dist/quota/models-claude.js.map +1 -0
- package/dist/quota/models-codex.d.ts +18 -0
- package/dist/quota/models-codex.js +305 -0
- package/dist/quota/models-codex.js.map +1 -0
- package/dist/quota/models-grok.d.ts +19 -0
- package/dist/quota/models-grok.js +272 -0
- package/dist/quota/models-grok.js.map +1 -0
- package/dist/quota/models-muse.d.ts +13 -0
- package/dist/quota/models-muse.js +200 -0
- package/dist/quota/models-muse.js.map +1 -0
- package/dist/quota/models-opencode.d.ts +51 -0
- package/dist/quota/models-opencode.js +400 -0
- package/dist/quota/models-opencode.js.map +1 -0
- package/dist/quota/muse.d.ts +38 -0
- package/dist/quota/muse.js +225 -0
- package/dist/quota/muse.js.map +1 -0
- package/dist/quota/opencode.d.ts +7 -0
- package/dist/quota/opencode.js +47 -0
- package/dist/quota/opencode.js.map +1 -0
- package/dist/quota/routing-config.d.ts +18 -0
- package/dist/quota/routing-config.js +438 -0
- package/dist/quota/routing-config.js.map +1 -0
- package/dist/quota/routing-service.d.ts +24 -0
- package/dist/quota/routing-service.js +118 -0
- package/dist/quota/routing-service.js.map +1 -0
- package/dist/quota/routing.d.ts +10 -0
- package/dist/quota/routing.js +180 -0
- package/dist/quota/routing.js.map +1 -0
- package/dist/quota/types.d.ts +304 -0
- package/dist/quota/types.js +45 -0
- package/dist/quota/types.js.map +1 -0
- package/dist/quota-cli.d.ts +80 -0
- package/dist/quota-cli.js +462 -0
- package/dist/quota-cli.js.map +1 -0
- package/dist/security/bridge/permissions.js +4 -2
- package/dist/security/bridge/permissions.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/package.json +3 -2
- package/skills/ftown/SKILL.md +6 -4
- package/skills/ftown/references/orchestrator.md +5 -0
- package/skills/ftown/references/quota.md +177 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// `ftown-quota`: subscription allowance left per harness, routing advice, the models each offers,
|
|
3
|
+
// and the user's model-routing tiers for a router agent.
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import { isCliEntry } from './cli-entry.js';
|
|
6
|
+
import { QUOTA_PROVIDER_IDS, } from './quota/types.js';
|
|
7
|
+
export const QUOTA_DEFAULT_TIMEOUT_SECONDS = 15;
|
|
8
|
+
/** Allowed --timeout range in seconds; keeps timeoutMs + grace well inside the timer limit. */
|
|
9
|
+
export const QUOTA_MIN_TIMEOUT_SECONDS = 1;
|
|
10
|
+
export const QUOTA_MAX_TIMEOUT_SECONDS = 600;
|
|
11
|
+
/** Extra time past the provider timeout before the CLI gives up on a fetcher that never settles. */
|
|
12
|
+
export const QUOTA_GRACE_MS = 2000;
|
|
13
|
+
export const QUOTA_HELP_TEXT = [
|
|
14
|
+
`Usage: ftown-quota [${QUOTA_PROVIDER_IDS.join('|')} ...] [--json] [--timeout <seconds>]`,
|
|
15
|
+
'',
|
|
16
|
+
'Shows how much of each subscription\'s 5-hour and weekly allowance is left, which harness to route work to first,',
|
|
17
|
+
'and the models each harness offers. The report also includes your model-routing tiers and steering for a router agent.',
|
|
18
|
+
'',
|
|
19
|
+
'Options:',
|
|
20
|
+
' --json machine-readable report (quota, routing advice, models, routing tiers, steering) for agents',
|
|
21
|
+
' --models table mode: also list the models each harness offers',
|
|
22
|
+
' --no-models skip the model lists (JSON omits them)',
|
|
23
|
+
` --timeout <seconds> time limit per provider, ${QUOTA_MIN_TIMEOUT_SECONDS}-${QUOTA_MAX_TIMEOUT_SECONDS} seconds (default ${QUOTA_DEFAULT_TIMEOUT_SECONDS})`,
|
|
24
|
+
' -h, --help show this help',
|
|
25
|
+
].join('\n');
|
|
26
|
+
/** Table mode shows at most this many models per provider; JSON is never truncated. */
|
|
27
|
+
export const MODEL_LIST_TABLE_LIMIT = 20;
|
|
28
|
+
function isQuotaProviderId(name) {
|
|
29
|
+
return QUOTA_PROVIDER_IDS.includes(name);
|
|
30
|
+
}
|
|
31
|
+
export function parseQuotaArgs(argv) {
|
|
32
|
+
const selected = new Set();
|
|
33
|
+
let json = false;
|
|
34
|
+
let help = false;
|
|
35
|
+
let showModels = false;
|
|
36
|
+
let skipModels = false;
|
|
37
|
+
let timeoutSeconds = QUOTA_DEFAULT_TIMEOUT_SECONDS;
|
|
38
|
+
const parseTimeout = (raw) => {
|
|
39
|
+
const seconds = raw === undefined ? NaN : Number(raw);
|
|
40
|
+
if (!Number.isFinite(seconds) || seconds < QUOTA_MIN_TIMEOUT_SECONDS || seconds > QUOTA_MAX_TIMEOUT_SECONDS)
|
|
41
|
+
return false;
|
|
42
|
+
timeoutSeconds = seconds;
|
|
43
|
+
return true;
|
|
44
|
+
};
|
|
45
|
+
for (let i = 0; i < argv.length; i++) {
|
|
46
|
+
const arg = argv[i];
|
|
47
|
+
if (!arg.startsWith('-')) {
|
|
48
|
+
const name = arg.toLowerCase();
|
|
49
|
+
if (!isQuotaProviderId(name)) {
|
|
50
|
+
return { ok: false, error: `unknown provider: ${arg} (expected ${QUOTA_PROVIDER_IDS.join(', ')})` };
|
|
51
|
+
}
|
|
52
|
+
selected.add(name);
|
|
53
|
+
}
|
|
54
|
+
else if (arg === '--json') {
|
|
55
|
+
json = true;
|
|
56
|
+
}
|
|
57
|
+
else if (arg === '-h' || arg === '--help') {
|
|
58
|
+
help = true;
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--models') {
|
|
61
|
+
showModels = true;
|
|
62
|
+
}
|
|
63
|
+
else if (arg === '--no-models') {
|
|
64
|
+
skipModels = true;
|
|
65
|
+
}
|
|
66
|
+
else if (arg === '--timeout') {
|
|
67
|
+
if (!parseTimeout(argv[i + 1]))
|
|
68
|
+
return { ok: false, error: 'invalid --timeout value' };
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
else if (arg.startsWith('--timeout=')) {
|
|
72
|
+
if (!parseTimeout(arg.slice('--timeout='.length)))
|
|
73
|
+
return { ok: false, error: 'invalid --timeout value' };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return { ok: false, error: `unknown option: ${arg}` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (showModels && skipModels) {
|
|
80
|
+
return { ok: false, error: 'cannot combine --models and --no-models' };
|
|
81
|
+
}
|
|
82
|
+
const providers = selected.size === 0
|
|
83
|
+
? [...QUOTA_PROVIDER_IDS]
|
|
84
|
+
: QUOTA_PROVIDER_IDS.filter(id => selected.has(id));
|
|
85
|
+
const models = skipModels ? 'skip' : showModels ? 'show' : 'default';
|
|
86
|
+
return { ok: true, providers, json, timeoutMs: Math.round(timeoutSeconds * 1000), help, models };
|
|
87
|
+
}
|
|
88
|
+
function errorRow(provider, now, message) {
|
|
89
|
+
return {
|
|
90
|
+
provider,
|
|
91
|
+
status: 'error',
|
|
92
|
+
plan: null,
|
|
93
|
+
windows: [],
|
|
94
|
+
source: 'live',
|
|
95
|
+
observedAt: now.toISOString(),
|
|
96
|
+
message,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function modelErrorRow(provider, now, message) {
|
|
100
|
+
return {
|
|
101
|
+
provider,
|
|
102
|
+
status: 'error',
|
|
103
|
+
models: [],
|
|
104
|
+
source: 'live',
|
|
105
|
+
observedAt: now.toISOString(),
|
|
106
|
+
message,
|
|
107
|
+
modelFlag: '',
|
|
108
|
+
effortFlag: null,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function shortReason(error) {
|
|
112
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
113
|
+
const firstLine = text.split('\n')[0].trim() || 'unknown error';
|
|
114
|
+
return firstLine.length > 160 ? `${firstLine.slice(0, 157)}...` : firstLine;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Runs one fetch; a rejection, a synchronous throw or a hang past
|
|
118
|
+
* timeoutMs + grace is turned into a fallback value by `onFailure`.
|
|
119
|
+
*/
|
|
120
|
+
function settleWithin(start, onFailure, timeoutMs, deps) {
|
|
121
|
+
let timer;
|
|
122
|
+
const hardLimit = new Promise(resolve => {
|
|
123
|
+
timer = setTimeout(() => resolve({ value: onFailure({ kind: 'timeout' }), hung: true }), timeoutMs + (deps.graceMs ?? QUOTA_GRACE_MS));
|
|
124
|
+
});
|
|
125
|
+
let attempt;
|
|
126
|
+
try {
|
|
127
|
+
attempt = Promise.resolve(start());
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
attempt = Promise.reject(error);
|
|
131
|
+
}
|
|
132
|
+
const settled = attempt.then(value => ({ value, hung: false }), (error) => ({ value: onFailure({ kind: 'failed', reason: shortReason(error) }), hung: false }));
|
|
133
|
+
return Promise.race([settled, hardLimit]).finally(() => clearTimeout(timer));
|
|
134
|
+
}
|
|
135
|
+
function quotaWithin(provider, fetcher, timeoutMs, deps) {
|
|
136
|
+
return settleWithin(() => fetcher({ timeoutMs, now: deps.now, homeDir: deps.homeDir }), failure => errorRow(provider, deps.now(), failure.kind === 'timeout' ? `${provider} check timed out` : `${provider} check failed: ${failure.reason}`), timeoutMs, deps);
|
|
137
|
+
}
|
|
138
|
+
function modelsWithin(provider, fetcher, timeoutMs, deps) {
|
|
139
|
+
return settleWithin(() => fetcher({ timeoutMs, now: deps.now, homeDir: deps.homeDir }), failure => modelErrorRow(provider, deps.now(), failure.kind === 'timeout' ? `${provider} model list timed out` : `${provider} model list failed: ${failure.reason}`), timeoutMs, deps);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Routing advice; if the advisor throws, every provider is reported as unknown
|
|
143
|
+
* so the rest of the output still prints, and the failure goes to stderr.
|
|
144
|
+
*/
|
|
145
|
+
function adviseOrFallback(rows, now, deps) {
|
|
146
|
+
try {
|
|
147
|
+
return { routing: deps.advise(rows, now), failure: null };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
const routing = rows.map((row) => ({
|
|
151
|
+
provider: row.provider,
|
|
152
|
+
availability: 'unknown',
|
|
153
|
+
leftPercent: null,
|
|
154
|
+
bindingWindow: null,
|
|
155
|
+
resetsAt: null,
|
|
156
|
+
resetsInMinutes: null,
|
|
157
|
+
runway: null,
|
|
158
|
+
reason: 'routing unavailable',
|
|
159
|
+
}));
|
|
160
|
+
return { routing, failure: `ftown-quota: routing advice failed: ${shortReason(error)}` };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** The state reported when the routing file could not be read or annotated at all. */
|
|
164
|
+
function unreadableRouting() {
|
|
165
|
+
return { status: 'invalid', path: '', errors: ['could not load the routing file'] };
|
|
166
|
+
}
|
|
167
|
+
/** Reads the routing file; a throw becomes an unreadable state plus a warning, never an exception. */
|
|
168
|
+
async function loadRoutingSafely(deps, warnings) {
|
|
169
|
+
try {
|
|
170
|
+
return await deps.loadRouting(deps.homeDir);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
warnings.push(`ftown-quota: model routing could not be loaded: ${shortReason(error)}`);
|
|
174
|
+
return { state: unreadableRouting(), config: null };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function annotateRouting(state, config, rows, routing, models, deps, warnings) {
|
|
178
|
+
if (state.status !== 'ok' || config === null)
|
|
179
|
+
return { routingConfig: state, tiers: [], steering: '' };
|
|
180
|
+
try {
|
|
181
|
+
return { routingConfig: state, tiers: deps.annotate(config, rows, routing, models), steering: typeof config.steering === 'string' ? config.steering : '' };
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
warnings.push(`ftown-quota: model routing could not be annotated: ${shortReason(error)}`);
|
|
185
|
+
return { routingConfig: unreadableRouting(), tiers: [], steering: '' };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Gathers everything the report needs: guarded quota and model fetches, routing
|
|
190
|
+
* advice, and the annotated routing tiers. Never prints and never exits.
|
|
191
|
+
*/
|
|
192
|
+
export async function collectQuotaReport(input, deps) {
|
|
193
|
+
const warnings = [];
|
|
194
|
+
const quotaRuns = Promise.all(input.providers.map(provider => quotaWithin(provider, deps.fetchers[provider], input.timeoutMs, deps)));
|
|
195
|
+
const loaded = await loadRoutingSafely(deps, warnings);
|
|
196
|
+
const config = loaded.state.status === 'ok' ? loaded.config : null;
|
|
197
|
+
const hasPicks = config !== null && Array.isArray(config.tiers)
|
|
198
|
+
&& config.tiers.some(tier => Array.isArray(tier.picks) && tier.picks.length > 0);
|
|
199
|
+
const fetchModels = input.includeModels || (input.fetchModelsForRouting === true && hasPicks);
|
|
200
|
+
const modelRuns = fetchModels
|
|
201
|
+
? Promise.all(input.providers.map(provider => modelsWithin(provider, deps.modelFetchers[provider], input.timeoutMs, deps)))
|
|
202
|
+
: Promise.resolve([]);
|
|
203
|
+
const [quotaSettled, modelSettled] = await Promise.all([quotaRuns, modelRuns]);
|
|
204
|
+
const rows = quotaSettled.map(run => run.value);
|
|
205
|
+
const models = modelSettled.map(run => run.value);
|
|
206
|
+
const hung = [...quotaSettled, ...modelSettled].some(run => run.hung);
|
|
207
|
+
const now = deps.now();
|
|
208
|
+
const advice = adviseOrFallback(rows, now, deps);
|
|
209
|
+
if (advice.failure !== null)
|
|
210
|
+
warnings.push(advice.failure);
|
|
211
|
+
const routingSection = annotateRouting(loaded.state, config, rows, advice.routing, models, deps, warnings);
|
|
212
|
+
const report = {
|
|
213
|
+
generatedAt: now.toISOString(),
|
|
214
|
+
providers: rows,
|
|
215
|
+
routing: advice.routing,
|
|
216
|
+
models,
|
|
217
|
+
...routingSection,
|
|
218
|
+
};
|
|
219
|
+
return { report, hung, warnings };
|
|
220
|
+
}
|
|
221
|
+
/** `claude (low)`, `grok (exhausted)`, or just the provider name when available. */
|
|
222
|
+
function routeLabel(entry) {
|
|
223
|
+
return entry.availability === 'available' ? entry.provider : `${entry.provider} (${entry.availability})`;
|
|
224
|
+
}
|
|
225
|
+
function pickLine(index, pick) {
|
|
226
|
+
let line = ` ${index}. ${pick.provider} ${pick.model}`;
|
|
227
|
+
if (pick.effort)
|
|
228
|
+
line += ` @${pick.effort}`;
|
|
229
|
+
line += ` ${pick.availability}`;
|
|
230
|
+
if (typeof pick.leftPercent === 'number' && Number.isFinite(pick.leftPercent))
|
|
231
|
+
line += ` ${pick.leftPercent}% left`;
|
|
232
|
+
if (pick.problem)
|
|
233
|
+
line += ` ! ${pick.problem}`;
|
|
234
|
+
else if (pick.checked === false)
|
|
235
|
+
line += ' (not checked: model list unavailable)';
|
|
236
|
+
return line;
|
|
237
|
+
}
|
|
238
|
+
const GUIDANCE_LABEL = 'guidance: ';
|
|
239
|
+
/**
|
|
240
|
+
* A tier's guidance as indented lines: the first labelled, further lines aligned under its text.
|
|
241
|
+
* Empty when the guidance is missing, not a string, or blank.
|
|
242
|
+
*/
|
|
243
|
+
function guidanceLines(guidance) {
|
|
244
|
+
if (typeof guidance !== 'string')
|
|
245
|
+
return [];
|
|
246
|
+
const lines = guidance.split(/\r?\n/).map(line => line.trimEnd());
|
|
247
|
+
while (lines.length > 0 && lines[0] === '')
|
|
248
|
+
lines.shift();
|
|
249
|
+
while (lines.length > 0 && lines[lines.length - 1] === '')
|
|
250
|
+
lines.pop();
|
|
251
|
+
if (lines.length === 0)
|
|
252
|
+
return [];
|
|
253
|
+
const indent = ' '.repeat(2 + GUIDANCE_LABEL.length);
|
|
254
|
+
return lines.map((line, index) => {
|
|
255
|
+
if (index === 0)
|
|
256
|
+
return ` ${GUIDANCE_LABEL}${line}`;
|
|
257
|
+
return line === '' ? '' : `${indent}${line}`;
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function tierBlock(tiers) {
|
|
261
|
+
const lines = ['Your tiers:'];
|
|
262
|
+
for (const tier of tiers) {
|
|
263
|
+
const picks = Array.isArray(tier.picks) ? tier.picks : [];
|
|
264
|
+
lines.push(tier.description ? `${tier.name} - ${tier.description}` : tier.name);
|
|
265
|
+
if (picks.length === 0)
|
|
266
|
+
lines.push(' (no picks yet)');
|
|
267
|
+
picks.forEach((pick, index) => lines.push(pickLine(index + 1, pick)));
|
|
268
|
+
lines.push(...guidanceLines(tier.guidance));
|
|
269
|
+
}
|
|
270
|
+
return lines;
|
|
271
|
+
}
|
|
272
|
+
/** Each block is printed after a blank line: the tiers, the steering, or a setup message. */
|
|
273
|
+
function routingBlocks(report) {
|
|
274
|
+
const state = report.routingConfig;
|
|
275
|
+
if (state.status === 'missing') {
|
|
276
|
+
return [['No model routing set up yet: open Model routing for this bridge in the dashboard.']];
|
|
277
|
+
}
|
|
278
|
+
if (state.status === 'invalid') {
|
|
279
|
+
return [[`Model routing file has errors: ${state.errors[0] ?? 'unknown error'}`]];
|
|
280
|
+
}
|
|
281
|
+
const blocks = [];
|
|
282
|
+
if (report.tiers.length > 0)
|
|
283
|
+
blocks.push(tierBlock(report.tiers));
|
|
284
|
+
const steering = typeof report.steering === 'string' ? report.steering.replace(/\s*\r?\n\s*/g, ' ').trim() : '';
|
|
285
|
+
if (steering)
|
|
286
|
+
blocks.push([`Steering: ${steering}`]);
|
|
287
|
+
return blocks;
|
|
288
|
+
}
|
|
289
|
+
function modelLine(model) {
|
|
290
|
+
const marker = model.pricing === 'free' ? ' [free]' : model.pricing === 'included' ? ' [included in plan]' : '';
|
|
291
|
+
const parts = [` ${model.id}${marker}`];
|
|
292
|
+
if (model.isDefault)
|
|
293
|
+
parts.push('[default]');
|
|
294
|
+
const efforts = Array.isArray(model.efforts) ? model.efforts : [];
|
|
295
|
+
if (efforts.length > 0) {
|
|
296
|
+
parts.push(`efforts: ${efforts.map(effort => (effort === model.defaultEffort ? `${effort}*` : effort)).join(', ')}`);
|
|
297
|
+
}
|
|
298
|
+
if (typeof model.contextTokens === 'number')
|
|
299
|
+
parts.push(`ctx ${Math.round(model.contextTokens / 1000)}k`);
|
|
300
|
+
return parts.join(' ');
|
|
301
|
+
}
|
|
302
|
+
function modelSectionLines(list) {
|
|
303
|
+
const header = list.modelFlag ? `${list.provider} models (${list.modelFlag}):` : `${list.provider} models:`;
|
|
304
|
+
if (list.status !== 'ok')
|
|
305
|
+
return [header, ` ${list.message ?? list.status}`];
|
|
306
|
+
const models = Array.isArray(list.models) ? list.models : [];
|
|
307
|
+
if (models.length === 0)
|
|
308
|
+
return [header, ' (none listed)'];
|
|
309
|
+
const shown = models.slice(0, MODEL_LIST_TABLE_LIMIT).map(modelLine);
|
|
310
|
+
const hidden = models.length - shown.length;
|
|
311
|
+
if (hidden > 0)
|
|
312
|
+
shown.push(` ... and ${hidden} more (use --json for the full list)`);
|
|
313
|
+
return [header, ...shown];
|
|
314
|
+
}
|
|
315
|
+
export async function runQuota(argv, deps) {
|
|
316
|
+
return runQuotaLazy(argv, async () => deps);
|
|
317
|
+
}
|
|
318
|
+
/** Like runQuota, but builds its deps only when providers must run, so help and usage errors load no module. */
|
|
319
|
+
async function runQuotaLazy(argv, getDeps) {
|
|
320
|
+
const args = parseQuotaArgs(argv);
|
|
321
|
+
if (!args.ok) {
|
|
322
|
+
return { exitCode: 2, stdout: '', stderr: `${args.error}\n${QUOTA_HELP_TEXT}`, hung: false };
|
|
323
|
+
}
|
|
324
|
+
if (args.help) {
|
|
325
|
+
return { exitCode: 0, stdout: QUOTA_HELP_TEXT, stderr: '', hung: false };
|
|
326
|
+
}
|
|
327
|
+
const deps = await getDeps();
|
|
328
|
+
const { report, hung, warnings } = await collectQuotaReport({
|
|
329
|
+
providers: args.providers,
|
|
330
|
+
timeoutMs: args.timeoutMs,
|
|
331
|
+
includeModels: args.models === 'show' || (args.models === 'default' && args.json),
|
|
332
|
+
fetchModelsForRouting: args.models === 'default',
|
|
333
|
+
}, deps);
|
|
334
|
+
const stderr = warnings.join('\n');
|
|
335
|
+
if (args.json) {
|
|
336
|
+
return { exitCode: 0, stdout: JSON.stringify(report, null, 2), stderr, hung };
|
|
337
|
+
}
|
|
338
|
+
const lines = [
|
|
339
|
+
deps.format(report.providers, new Date(report.generatedAt)),
|
|
340
|
+
'',
|
|
341
|
+
`Route first: ${report.routing.map(routeLabel).join(' > ')}`,
|
|
342
|
+
];
|
|
343
|
+
for (const block of routingBlocks(report))
|
|
344
|
+
lines.push('', ...block);
|
|
345
|
+
if (args.models === 'show') {
|
|
346
|
+
lines.push('');
|
|
347
|
+
for (const list of report.models)
|
|
348
|
+
lines.push(...modelSectionLines(list));
|
|
349
|
+
}
|
|
350
|
+
return { exitCode: 0, stdout: lines.join('\n'), stderr, hung };
|
|
351
|
+
}
|
|
352
|
+
/** The real fetchers, models, routing, formatter and clock: what the bridge passes to collectQuotaReport. */
|
|
353
|
+
export async function loadRealQuotaDeps() {
|
|
354
|
+
const [claude, codex, grok, muse, agy, opencode, claudeModels, codexModels, grokModels, museModels, agyModels, opencodeModels, routing, format, routingConfigModule, annotateModule,] = await Promise.all([
|
|
355
|
+
import('./quota/claude.js'),
|
|
356
|
+
import('./quota/codex.js'),
|
|
357
|
+
import('./quota/grok.js'),
|
|
358
|
+
import('./quota/muse.js'),
|
|
359
|
+
import('./quota/agy.js'),
|
|
360
|
+
import('./quota/opencode.js'),
|
|
361
|
+
import('./quota/models-claude.js'),
|
|
362
|
+
import('./quota/models-codex.js'),
|
|
363
|
+
import('./quota/models-grok.js'),
|
|
364
|
+
import('./quota/models-muse.js'),
|
|
365
|
+
import('./quota/models-agy.js'),
|
|
366
|
+
import('./quota/models-opencode.js'),
|
|
367
|
+
import('./quota/routing.js'),
|
|
368
|
+
import('./quota/format.js'),
|
|
369
|
+
import('./quota/routing-config.js'),
|
|
370
|
+
import('./quota/annotate.js'),
|
|
371
|
+
]);
|
|
372
|
+
return {
|
|
373
|
+
fetchers: {
|
|
374
|
+
claude: claude.fetchClaudeQuota,
|
|
375
|
+
codex: codex.fetchCodexQuota,
|
|
376
|
+
grok: grok.fetchGrokQuota,
|
|
377
|
+
muse: muse.fetchMuseQuota,
|
|
378
|
+
agy: agy.fetchAgyQuota,
|
|
379
|
+
opencode: opencode.fetchOpencodeQuota,
|
|
380
|
+
},
|
|
381
|
+
modelFetchers: {
|
|
382
|
+
claude: claudeModels.fetchClaudeModels,
|
|
383
|
+
codex: codexModels.fetchCodexModels,
|
|
384
|
+
grok: grokModels.fetchGrokModels,
|
|
385
|
+
muse: museModels.fetchMuseModels,
|
|
386
|
+
agy: agyModels.fetchAgyModels,
|
|
387
|
+
opencode: opencodeModels.fetchOpencodeModels,
|
|
388
|
+
},
|
|
389
|
+
advise: routing.adviseQuotaRouting,
|
|
390
|
+
format: format.formatQuotaTable,
|
|
391
|
+
loadRouting: routingConfigModule.loadRoutingConfig,
|
|
392
|
+
annotate: annotateModule.annotateTiers,
|
|
393
|
+
now: () => new Date(),
|
|
394
|
+
homeDir: os.homedir(),
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
/** Writes one line (text plus newline) without waiting on any write callback. */
|
|
398
|
+
function writeLine(stream, text) {
|
|
399
|
+
if (text)
|
|
400
|
+
stream.write(`${text}\n`);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Forced exit after a hung fetcher: exit once stdout has flushed, or after
|
|
404
|
+
* 250 ms if the stream never calls back, so a stuck stream cannot block exit.
|
|
405
|
+
*/
|
|
406
|
+
function exitAfterWriting(code, stdoutText) {
|
|
407
|
+
const exit = () => { process.exit(code); };
|
|
408
|
+
setTimeout(exit, 250);
|
|
409
|
+
process.stdout.write(stdoutText ? `${stdoutText}\n` : '', exit);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Entry for `ftown-quota` and the umbrella `ftown` CLI: runs with the real
|
|
413
|
+
* modules and writes stdout/stderr. Returns the exit code, except when a
|
|
414
|
+
* fetcher hung: then the process exits with that code after output is flushed,
|
|
415
|
+
* because a hung fetcher's handle would otherwise keep the event loop alive.
|
|
416
|
+
*/
|
|
417
|
+
export async function runQuotaCli(argv) {
|
|
418
|
+
const stdoutFailure = { message: null };
|
|
419
|
+
const onStdoutError = (error) => {
|
|
420
|
+
// A closed pipe (for example `| head`) is the reader being done, not a failure.
|
|
421
|
+
if (error.code !== 'EPIPE')
|
|
422
|
+
stdoutFailure.message = error.message;
|
|
423
|
+
};
|
|
424
|
+
process.stdout.on('error', onStdoutError);
|
|
425
|
+
let exitCode = 1;
|
|
426
|
+
let hung = false;
|
|
427
|
+
let stdoutText = '';
|
|
428
|
+
let stderrText = '';
|
|
429
|
+
try {
|
|
430
|
+
const result = await runQuotaLazy(argv, loadRealQuotaDeps);
|
|
431
|
+
hung = result.hung;
|
|
432
|
+
stdoutText = result.stdout;
|
|
433
|
+
stderrText = result.stderr;
|
|
434
|
+
exitCode = result.exitCode;
|
|
435
|
+
if (stdoutFailure.message !== null) {
|
|
436
|
+
stderrText = `${stderrText}${stderrText ? '\n' : ''}ftown-quota: stdout failed: ${stdoutFailure.message}`;
|
|
437
|
+
exitCode = 1;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
stderrText = `ftown-quota: ${error instanceof Error ? error.message : String(error)}`;
|
|
442
|
+
exitCode = 1;
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
process.stdout.off('error', onStdoutError);
|
|
446
|
+
}
|
|
447
|
+
if (hung) {
|
|
448
|
+
writeLine(process.stderr, stderrText);
|
|
449
|
+
exitAfterWriting(exitCode, stdoutText);
|
|
450
|
+
return exitCode;
|
|
451
|
+
}
|
|
452
|
+
writeLine(process.stdout, stdoutText);
|
|
453
|
+
writeLine(process.stderr, stderrText);
|
|
454
|
+
return exitCode;
|
|
455
|
+
}
|
|
456
|
+
async function main(argv) {
|
|
457
|
+
process.exitCode = await runQuotaCli(argv);
|
|
458
|
+
}
|
|
459
|
+
if (isCliEntry(import.meta.url, process.argv[1])) {
|
|
460
|
+
void main(process.argv.slice(2));
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=quota-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-cli.js","sourceRoot":"","sources":["../src/quota-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { BridgeSecurityError } from './errors.js';
|
|
2
2
|
const session = /^[A-Za-z0-9_-]+$/;
|
|
3
3
|
const readCommands = new Set(['get_pull_request_statuses', 'session_preview_status', 'session_preview_chunk', 'get_bridge_update', 'list_sessions', 'get_history', 'get_session_usage', 'get_sessions_usage', 'get_session_attention',
|
|
4
|
-
'ledger_head', 'ledger_chain'
|
|
4
|
+
'ledger_head', 'ledger_chain',
|
|
5
|
+
'get_model_routing']);
|
|
5
6
|
const controlCommands = new Set(['update_bridge', 'create_session', 'stop_session', 'retry_session', 'send_message', 'rename_session', 'remove_session',
|
|
6
|
-
'bridge_exec', 'clear_terminal', 'update_session_parent', 'resolve_session_attention', 'answer_session_attention'
|
|
7
|
+
'bridge_exec', 'clear_terminal', 'update_session_parent', 'resolve_session_attention', 'answer_session_attention',
|
|
8
|
+
'set_model_routing']);
|
|
7
9
|
const adminCommands = new Set(['security_devices', 'security_invite', 'security_revoke']);
|
|
8
10
|
const result = (permission, operation, sessionId = null) => ({ permission, mutating: permission === 'control' || ['security_invite', 'security_revoke'].includes(operation), operation, sessionId });
|
|
9
11
|
const deny = () => { throw new BridgeSecurityError('permission_denied'); };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/security/bridge/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,2BAA2B,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,uBAAuB;IACnO,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/security/bridge/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -92,7 +92,7 @@ export interface Command {
|
|
|
92
92
|
payload: CommandPayload;
|
|
93
93
|
requestId: string;
|
|
94
94
|
}
|
|
95
|
-
export type CommandType = 'get_pull_request_review' | 'get_pull_request_review_chunk' | 'preview_chat_list' | 'preview_chat_send' | 'preview_chat_reply' | 'get_pull_request_statuses' | 'session_preview_status' | 'session_preview_chunk' | 'get_bridge_update' | 'update_bridge' | 'security_devices' | 'security_invite' | 'security_revoke' | 'ledger_head' | 'ledger_chain' | 'create_session' | 'stop_session' | 'list_sessions' | 'get_history' | 'retry_session' | 'send_message' | 'rename_session' | 'remove_session' | 'bridge_exec' | 'clear_terminal' | 'update_session_parent' | 'get_session_usage' | 'get_sessions_usage' | 'get_session_attention' | 'resolve_session_attention' | 'answer_session_attention';
|
|
95
|
+
export type CommandType = 'get_pull_request_review' | 'get_pull_request_review_chunk' | 'preview_chat_list' | 'preview_chat_send' | 'preview_chat_reply' | 'get_pull_request_statuses' | 'session_preview_status' | 'session_preview_chunk' | 'get_bridge_update' | 'update_bridge' | 'security_devices' | 'security_invite' | 'security_revoke' | 'ledger_head' | 'ledger_chain' | 'create_session' | 'stop_session' | 'list_sessions' | 'get_history' | 'retry_session' | 'send_message' | 'rename_session' | 'remove_session' | 'bridge_exec' | 'clear_terminal' | 'update_session_parent' | 'get_session_usage' | 'get_sessions_usage' | 'get_session_attention' | 'resolve_session_attention' | 'answer_session_attention' | 'get_model_routing' | 'set_model_routing';
|
|
96
96
|
export interface GetSessionAttentionPayload {
|
|
97
97
|
bridgeId: string;
|
|
98
98
|
sessionId: string;
|
|
@@ -165,7 +165,7 @@ export interface GetSessionsUsagePayload {
|
|
|
165
165
|
sessionIds: string[];
|
|
166
166
|
bridgeId?: string;
|
|
167
167
|
}
|
|
168
|
-
export type CommandPayload = SendSessionMessagePayload | GetPullRequestStatusesPayload | SessionPreviewStatusRequest | SessionPreviewChunkRequest | GetBridgeUpdatePayload | UpdateBridgePayload | GetSessionAttentionPayload | ResolveSessionAttentionPayload | AnswerSessionAttentionPayload | CreateSessionPayload | StopSessionPayload | GetHistoryPayload | RenameSessionPayload | RemoveSessionPayload | BridgeExecPayload | ClearTerminalPayload | UpdateSessionParentPayload | GetSessionUsagePayload | GetSessionsUsagePayload | Record<string, unknown
|
|
168
|
+
export type CommandPayload = SendSessionMessagePayload | GetPullRequestStatusesPayload | SessionPreviewStatusRequest | SessionPreviewChunkRequest | GetBridgeUpdatePayload | UpdateBridgePayload | GetSessionAttentionPayload | ResolveSessionAttentionPayload | AnswerSessionAttentionPayload | CreateSessionPayload | StopSessionPayload | GetHistoryPayload | RenameSessionPayload | RemoveSessionPayload | BridgeExecPayload | ClearTerminalPayload | UpdateSessionParentPayload | GetSessionUsagePayload | GetSessionsUsagePayload | Record<string, unknown> | import('./quota/types.js').GetModelRoutingPayload | import('./quota/types.js').SetModelRoutingPayload;
|
|
169
169
|
export interface CommandResponse {
|
|
170
170
|
requestId: string;
|
|
171
171
|
success: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ftown",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.3",
|
|
4
4
|
"description": "CLI bridge for ftown — generic PTY-over-Centrifugo relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"ftown": "dist/ftown-cli.js",
|
|
10
10
|
"ftown-harness": "dist/harness-cli.js",
|
|
11
11
|
"ftown-env": "dist/ftown-env-cli.js",
|
|
12
|
+
"ftown-quota": "dist/quota-cli.js",
|
|
12
13
|
"ftown-sessions": "bin/ftown-sessions"
|
|
13
14
|
},
|
|
14
15
|
"files": [
|
|
@@ -72,5 +73,5 @@
|
|
|
72
73
|
"overrides": {
|
|
73
74
|
"qs": "6.16.1"
|
|
74
75
|
},
|
|
75
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "9792eca1d4fb17bf061d771defc5aa16932fdc17"
|
|
76
77
|
}
|
package/skills/ftown/SKILL.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
name: ftown
|
|
3
3
|
description: >-
|
|
4
4
|
Control ftown sessions: create/list/read/drive sibling sessions, send ftown
|
|
5
|
-
mail, request human attention,
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
mail, request human attention, register and update self-contained HTML
|
|
6
|
+
previews for the dashboard, link session PRs, and coordinate worker agents.
|
|
7
|
+
Use for ftown sessions, child/sibling agents, bridge mail/inbox, html preview,
|
|
8
|
+
or explicitly requested orchestration.
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# ftown
|
|
@@ -59,7 +60,8 @@ ftown start --help
|
|
|
59
60
|
|
|
60
61
|
Read `references/sessions.md` for the session, mail and terminal command
|
|
61
62
|
reference. Read `references/orchestrator.md` for practical worker coordination
|
|
62
|
-
examples.
|
|
63
|
+
examples. Read `references/quota.md` before choosing a CLI, model and effort for delegated
|
|
64
|
+
work (`ftown quota --json`). Each command group also has `--help`.
|
|
63
65
|
|
|
64
66
|
`ftown sessions preview <path...>` registers up to 12 files in the current
|
|
65
67
|
session's working directory for the dashboard, in this order. Kind is by
|
|
@@ -11,6 +11,11 @@ bounded task, clear writable files and acceptance checks; save the returned
|
|
|
11
11
|
set it when the task calls for a different harness. Provider flavors require a
|
|
12
12
|
bridge-host token configured with `ftown env set <flavor>`.
|
|
13
13
|
|
|
14
|
+
Before picking a CLI, model and effort for delegated work, run `ftown quota --json`
|
|
15
|
+
and follow the decision procedure in `quota.md` (owner tiers first). Pass the
|
|
16
|
+
choice as `--shell <provider>`; add `--model <id>` only with an id from that
|
|
17
|
+
harness's model list. Never route to `exhausted`.
|
|
18
|
+
|
|
14
19
|
```bash
|
|
15
20
|
ftown sessions list
|
|
16
21
|
ftown sessions create --parent --workdir /path/to/repo --name review-auth \
|