ftown 0.25.2 → 0.26.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 (108) hide show
  1. package/dist/command-rpc.d.ts +3 -0
  2. package/dist/command-rpc.js +41 -0
  3. package/dist/command-rpc.js.map +1 -1
  4. package/dist/coordination/board.d.ts +12 -0
  5. package/dist/coordination/board.js +240 -0
  6. package/dist/coordination/board.js.map +1 -0
  7. package/dist/coordination/card-store.d.ts +9 -0
  8. package/dist/coordination/card-store.js +188 -0
  9. package/dist/coordination/card-store.js.map +1 -0
  10. package/dist/coordination/contract.d.ts +236 -0
  11. package/dist/coordination/contract.js +63 -0
  12. package/dist/coordination/contract.js.map +1 -0
  13. package/dist/coordination/format.d.ts +5 -0
  14. package/dist/coordination/format.js +60 -0
  15. package/dist/coordination/format.js.map +1 -0
  16. package/dist/coordination/tree-events.d.ts +31 -0
  17. package/dist/coordination/tree-events.js +226 -0
  18. package/dist/coordination/tree-events.js.map +1 -0
  19. package/dist/coordination/wiring.d.ts +48 -0
  20. package/dist/coordination/wiring.js +143 -0
  21. package/dist/coordination/wiring.js.map +1 -0
  22. package/dist/coordination-cli.d.ts +34 -0
  23. package/dist/coordination-cli.js +460 -0
  24. package/dist/coordination-cli.js.map +1 -0
  25. package/dist/ftown-cli.js +12 -2
  26. package/dist/ftown-cli.js.map +1 -1
  27. package/dist/index.js +33 -7
  28. package/dist/index.js.map +1 -1
  29. package/dist/local-api-server.d.ts +6 -1
  30. package/dist/local-api-server.js +282 -5
  31. package/dist/local-api-server.js.map +1 -1
  32. package/dist/mail-delivery.d.ts +16 -2
  33. package/dist/mail-delivery.js +331 -77
  34. package/dist/mail-delivery.js.map +1 -1
  35. package/dist/mail-store.d.ts +7 -0
  36. package/dist/mail-store.js +71 -1
  37. package/dist/mail-store.js.map +1 -1
  38. package/dist/pull-request-events.d.ts +5 -0
  39. package/dist/pull-request-events.js +21 -1
  40. package/dist/pull-request-events.js.map +1 -1
  41. package/dist/quota/agy.d.ts +16 -0
  42. package/dist/quota/agy.js +287 -0
  43. package/dist/quota/agy.js.map +1 -0
  44. package/dist/quota/annotate.d.ts +5 -0
  45. package/dist/quota/annotate.js +56 -0
  46. package/dist/quota/annotate.js.map +1 -0
  47. package/dist/quota/claude.d.ts +27 -0
  48. package/dist/quota/claude.js +265 -0
  49. package/dist/quota/claude.js.map +1 -0
  50. package/dist/quota/codex.d.ts +25 -0
  51. package/dist/quota/codex.js +378 -0
  52. package/dist/quota/codex.js.map +1 -0
  53. package/dist/quota/format.d.ts +6 -0
  54. package/dist/quota/format.js +113 -0
  55. package/dist/quota/format.js.map +1 -0
  56. package/dist/quota/grok.d.ts +97 -0
  57. package/dist/quota/grok.js +563 -0
  58. package/dist/quota/grok.js.map +1 -0
  59. package/dist/quota/models-agy.d.ts +10 -0
  60. package/dist/quota/models-agy.js +144 -0
  61. package/dist/quota/models-agy.js.map +1 -0
  62. package/dist/quota/models-claude.d.ts +10 -0
  63. package/dist/quota/models-claude.js +227 -0
  64. package/dist/quota/models-claude.js.map +1 -0
  65. package/dist/quota/models-codex.d.ts +18 -0
  66. package/dist/quota/models-codex.js +305 -0
  67. package/dist/quota/models-codex.js.map +1 -0
  68. package/dist/quota/models-grok.d.ts +19 -0
  69. package/dist/quota/models-grok.js +272 -0
  70. package/dist/quota/models-grok.js.map +1 -0
  71. package/dist/quota/models-muse.d.ts +13 -0
  72. package/dist/quota/models-muse.js +200 -0
  73. package/dist/quota/models-muse.js.map +1 -0
  74. package/dist/quota/models-opencode.d.ts +51 -0
  75. package/dist/quota/models-opencode.js +400 -0
  76. package/dist/quota/models-opencode.js.map +1 -0
  77. package/dist/quota/muse.d.ts +38 -0
  78. package/dist/quota/muse.js +225 -0
  79. package/dist/quota/muse.js.map +1 -0
  80. package/dist/quota/opencode.d.ts +7 -0
  81. package/dist/quota/opencode.js +47 -0
  82. package/dist/quota/opencode.js.map +1 -0
  83. package/dist/quota/routing-config.d.ts +18 -0
  84. package/dist/quota/routing-config.js +438 -0
  85. package/dist/quota/routing-config.js.map +1 -0
  86. package/dist/quota/routing-service.d.ts +24 -0
  87. package/dist/quota/routing-service.js +118 -0
  88. package/dist/quota/routing-service.js.map +1 -0
  89. package/dist/quota/routing.d.ts +10 -0
  90. package/dist/quota/routing.js +180 -0
  91. package/dist/quota/routing.js.map +1 -0
  92. package/dist/quota/types.d.ts +304 -0
  93. package/dist/quota/types.js +45 -0
  94. package/dist/quota/types.js.map +1 -0
  95. package/dist/quota-cli.d.ts +80 -0
  96. package/dist/quota-cli.js +462 -0
  97. package/dist/quota-cli.js.map +1 -0
  98. package/dist/security/bridge/permissions.js +24 -2
  99. package/dist/security/bridge/permissions.js.map +1 -1
  100. package/dist/types.d.ts +7 -3
  101. package/dist/wire-types.d.ts +17 -1
  102. package/dist/wire-types.js +1 -1
  103. package/dist/wire-types.js.map +1 -1
  104. package/package.json +3 -2
  105. package/skills/ftown/SKILL.md +31 -5
  106. package/skills/ftown/references/orchestrator.md +17 -7
  107. package/skills/ftown/references/quota.md +177 -0
  108. package/skills/ftown/references/sessions.md +45 -3
@@ -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,13 +1,17 @@
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'); };
10
12
  const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
13
+ /** Every query key must be allowed and appear at most once. */
14
+ const queryAllows = (url, allowed) => [...url.searchParams.keys()].every(key => allowed.includes(key)) && allowed.every(key => url.searchParams.getAll(key).length <= 1);
11
15
  /** Deliberately semantic: GET inbox consumes mail unless explicitly non-consuming. */
12
16
  export function classifyHttp(method, path) {
13
17
  if (path.length > 16_384 || !path.startsWith('/api/') || path.includes('#') || path.includes('\\') || path.split('?')[0].includes('%'))
@@ -40,6 +44,24 @@ export function classifyHttp(method, path) {
40
44
  const preview = /^\/api\/sessions\/([A-Za-z0-9_-]{1,200})\/preview$/.exec(url.pathname);
41
45
  if (preview)
42
46
  return !url.search && (method === 'PUT' || method === 'DELETE') ? result('control', 'session_preview_register', preview[1]) : deny();
47
+ const card = /^\/api\/sessions\/([A-Za-z0-9_-]{1,200})\/card$/.exec(url.pathname);
48
+ if (card) {
49
+ if (url.search)
50
+ return deny();
51
+ if (method === 'GET')
52
+ return result('read', 'card_get', card[1]);
53
+ if (method === 'PUT')
54
+ return result('control', 'card_set', card[1]);
55
+ if (method === 'DELETE')
56
+ return result('control', 'card_clear', card[1]);
57
+ return deny();
58
+ }
59
+ const board = /^\/api\/sessions\/([A-Za-z0-9_-]{1,200})\/board$/.exec(url.pathname);
60
+ if (board)
61
+ return method === 'GET' && queryAllows(url, ['since', 'ready', 'all']) ? result('read', 'board_get', board[1]) : deny();
62
+ const events = /^\/api\/sessions\/([A-Za-z0-9_-]{1,200})\/events$/.exec(url.pathname);
63
+ if (events)
64
+ return method === 'GET' && queryAllows(url, ['since', 'limit', 'waitSeconds']) ? result('read', 'events_get', events[1]) : deny();
43
65
  if (url.pathname === '/api/loops' || /^\/api\/loops\/[A-Za-z0-9_-]+(?:\/[A-Za-z0-9_-]+)?$/.test(url.pathname)) {
44
66
  if (!['GET', 'POST', 'PATCH', 'DELETE'].includes(method))
45
67
  return deny();
@@ -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;AAClC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB;IACrJ,aAAa,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,0BAA0B,CAAC,CAAC,CAAC;AACtH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAC1F,MAAM,MAAM,GAAG,CAAC,UAA8B,EAAE,SAAiB,EAAE,YAA2B,IAAI,EAAuB,EAAE,CACzH,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3I,MAAM,IAAI,GAAG,GAAU,EAAE,GAAG,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,MAAM,MAAM,GAAG,CAAC,KAAkC,EAAkD,EAAE,CACpG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAE3F,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IACtJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,MAAM,KAAK,uBAAuB,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;WAC5G,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,EAAE,CAAC;IACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACnE,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/F,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACtG,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,qBAAqB;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,4EAA4E,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7G,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,SAAS,EAAE,gBAAgB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9G,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,oDAAoD,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxF,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClJ,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,qDAAqD,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9G,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QACxE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClI,CAAC;IACD,MAAM,KAAK,GAAG,8KAA8K,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChN,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;IACvD,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,EAAE,CAAC;IAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,kGAAkG;IAClG,IAAI,OAAO;QAAE,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpF,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3C,yEAAyE;QACzE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;eAChD,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,EAAE,CAAC,CAAC;IACrJ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,eAAe;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC5G,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzH,OAAO,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,aAAa,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAC7F,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAyB;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9G,IAAI,OAAO,KAAK,yBAAyB,IAAI,OAAO,KAAK,+BAA+B;QAAE,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpL,IAAI,OAAO,KAAK,wBAAwB,IAAI,OAAO,KAAK,uBAAuB;QAAE,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3K,IAAI,OAAO,KAAK,mBAAmB,IAAI,OAAO,KAAK,mBAAmB,IAAI,OAAO,KAAK,oBAAoB;QAAE,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpP,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACzE,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/E,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3E,IAAI,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,KAAK,cAAc;WAC3F,OAAO,KAAK,eAAe,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtI,0CAA0C;IAC1C,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,YAAY,SAAS,EAAE,CAAC,CAAC;IAC9H,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,SAAS,EAAE,YAAY,SAAS,EAAE,CAAC,CAAC;IACvG,OAAO,IAAI,EAAE,CAAC;AAChB,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
@@ -1,3 +1,4 @@
1
+ import type { SessionCardDeclared } from './coordination/contract.js';
1
2
  export type { ShellType } from './harness-registry.js';
2
3
  import type { ShellType } from './harness-registry.js';
3
4
  import type { GetBridgeUpdatePayload, UpdateBridgePayload } from './update-protocol.js';
@@ -59,6 +60,8 @@ export interface Session {
59
60
  errorReason?: string;
60
61
  loopId?: string;
61
62
  usage?: SessionUsage;
63
+ /** Agent-declared status card (coordination contract). */
64
+ card?: SessionCardDeclared;
62
65
  }
63
66
  export type SessionStatus = 'pending' | 'running' | 'completed' | 'error';
64
67
  /** Tombstone written to <dataDir>/archive.jsonl when a session is removed. */
@@ -72,10 +75,11 @@ export interface MailMessage {
72
75
  from: string;
73
76
  fromName?: string;
74
77
  to: string;
75
- type: 'message' | 'task' | 'result' | 'escalation';
78
+ type: 'message' | 'task' | 'result' | 'escalation' | 'fyi';
76
79
  threadId?: string;
77
80
  body: string;
78
81
  deliveredAt?: string;
82
+ nudgedAt?: string;
79
83
  deliveredVia?: 'poll' | 'drain' | 'nudge' | 'cli';
80
84
  }
81
85
  export interface SessionMessage {
@@ -92,7 +96,7 @@ export interface Command {
92
96
  payload: CommandPayload;
93
97
  requestId: string;
94
98
  }
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';
99
+ 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
100
  export interface GetSessionAttentionPayload {
97
101
  bridgeId: string;
98
102
  sessionId: string;
@@ -165,7 +169,7 @@ export interface GetSessionsUsagePayload {
165
169
  sessionIds: string[];
166
170
  bridgeId?: string;
167
171
  }
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>;
172
+ 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
173
  export interface CommandResponse {
170
174
  requestId: string;
171
175
  success: boolean;