@jmanuelcorral/openteam 0.13.0 → 0.14.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.
- package/README.es.md +4 -2
- package/README.md +4 -2
- package/dist/cli.js +275 -30
- package/dist/commands/dispatch.d.ts +15 -0
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts +30 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/purge.d.ts.map +1 -1
- package/dist/commands/setup.d.ts +19 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/config/errors.d.ts.map +1 -1
- package/dist/config/schema.d.ts +23 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +392 -162
- package/dist/local/concurrency.d.ts +24 -4
- package/dist/local/concurrency.d.ts.map +1 -1
- package/dist/local/registry.d.ts +3 -3
- package/dist/local/registry.d.ts.map +1 -1
- package/dist/local/types.d.ts +16 -2
- package/dist/local/types.d.ts.map +1 -1
- package/dist/orchestrator/coordinator.d.ts +24 -1
- package/dist/orchestrator/coordinator.d.ts.map +1 -1
- package/dist/orchestrator/roles.d.ts +2 -12
- package/dist/orchestrator/roles.d.ts.map +1 -1
- package/dist/storage/graph/soakRecorder.d.ts +19 -0
- package/dist/storage/graph/soakRecorder.d.ts.map +1 -1
- package/dist/telemetry/eventLog.d.ts +7 -1
- package/dist/telemetry/eventLog.d.ts.map +1 -1
- package/dist/telemetry/events.d.ts +37 -0
- package/dist/telemetry/events.d.ts.map +1 -1
- package/dist/telemetry/queueWait.d.ts +51 -0
- package/dist/telemetry/queueWait.d.ts.map +1 -0
- package/package.json +1 -1
package/README.es.md
CHANGED
|
@@ -366,11 +366,13 @@ ejecutas desde un subdirectorio verás "provider not configured" y debes hacer
|
|
|
366
366
|
| `router.trivialPromptMaxChars` | `number` entero positivo | `280` | Prompts sin código hasta este tamaño prefieren local. |
|
|
367
367
|
| `router.frontierPromptMinChars` | `number` entero positivo | `2000` | Prompts desde este tamaño se tratan como candidatos a frontier si no aplican guards. |
|
|
368
368
|
| `local.runtimes` | `LocalRuntime[]` | `[]` | Runtimes locales a sondear. Vacío por defecto — ningún runtime está configurado hasta que ejecutes `openteam setup` o añadas una entrada manualmente. |
|
|
369
|
-
| `local.runtimes[].id` | `
|
|
369
|
+
| `local.runtimes[].id` | `string` | requerido | Identidad de instancia, única dentro del array. Libre (`lmstudio-a`, `lemonade-lan`) para que dos máquinas del mismo tipo sean distintas; si se omite `kind`, debe ser en sí mismo un tipo de runtime (retrocompatibilidad). |
|
|
370
|
+
| `local.runtimes[].kind` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` opcional | migra desde `id` | Tipo de runtime que selecciona el adaptador. Opcional: si falta, se usa `id` como tipo, así toda config previa sigue funcionando sin cambios. |
|
|
370
371
|
| `local.runtimes[].enabled` | `boolean` | `true` | Habilita o deshabilita ese runtime. |
|
|
371
372
|
| `local.runtimes[].baseURL` | URL opcional | según runtime/config | Endpoint OpenAI-compatible (`/v1` para Ollama/LM Studio, `/api/v1` para Lemonade); Foundry Local puede omitirlo si usa discovery. |
|
|
372
373
|
| `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` opcional | sin default por item | Discovery de Foundry Local; el registry usa CLI si está configurado y no es `manual`. |
|
|
373
374
|
| `local.runtimes[].defaultModel` | `ModelRef` | requerido | Modelo por defecto de ese runtime. |
|
|
375
|
+
| `local.runtimes[].maxConcurrency` | entero positivo opcional | `4` | Límite de generaciones concurrentes de esta instancia (su número real de slots). Se aplica por instancia. |
|
|
374
376
|
| `budgets.sessionUSD` | `number` positivo opcional | sin límite | Presupuesto frontier por sesión. |
|
|
375
377
|
| `budgets.monthlyUSD` | `number` positivo opcional | sin límite | Presupuesto frontier mensual. |
|
|
376
378
|
| `budgets.frontierTokensPerSession` | `number` entero positivo opcional | sin límite | Límite de tokens frontier por sesión. |
|
|
@@ -822,7 +824,7 @@ Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `
|
|
|
822
824
|
|
|
823
825
|
| Superficie | Versión / contrato |
|
|
824
826
|
| --- | --- |
|
|
825
|
-
| openteam | `0.
|
|
827
|
+
| openteam | `0.14.0`; versión actual del paquete |
|
|
826
828
|
| `@opencode-ai/plugin` | `1.18.19` |
|
|
827
829
|
| `@opencode-ai/sdk` | `1.18.19` |
|
|
828
830
|
| Hook de routing | `chat.message`; no `chat.params` para cambiar modelo |
|
package/README.md
CHANGED
|
@@ -318,11 +318,13 @@ configured" and should `cd` to the project root first.
|
|
|
318
318
|
| `router.trivialPromptMaxChars` | positive integer | `280` | Code-free prompts up to this size prefer local. |
|
|
319
319
|
| `router.frontierPromptMinChars` | positive integer | `2000` | Prompts from this size are frontier candidates if no guards apply. |
|
|
320
320
|
| `local.runtimes` | `LocalRuntime[]` | `[]` | Local runtimes to probe. Empty by default — no runtime is configured until you run `openteam setup` or add an entry by hand. |
|
|
321
|
-
| `local.runtimes[].id` |
|
|
321
|
+
| `local.runtimes[].id` | string | required | Instance identity, unique within the array. Free-form (`lmstudio-a`, `lemonade-lan`) so two machines of the same kind are distinct; when `kind` is omitted it must itself be a runtime kind (back-compat). |
|
|
322
|
+
| `local.runtimes[].kind` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` optional | migrates from `id` | Runtime kind selecting the adapter. Optional: when absent, `id` is treated as the kind, so pre-existing configs keep working unchanged. |
|
|
322
323
|
| `local.runtimes[].enabled` | `boolean` | `true` | Enable or disable that runtime. |
|
|
323
324
|
| `local.runtimes[].baseURL` | optional URL | per runtime/config | OpenAI-compatible endpoint (`/v1` for Ollama/LM Studio, `/api/v1` for Lemonade); Foundry Local may omit it when using discovery. |
|
|
324
325
|
| `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` optional | none per item | Foundry Local discovery; the registry uses CLI when configured and not `manual`. |
|
|
325
326
|
| `local.runtimes[].defaultModel` | `ModelRef` | required | Default model for that runtime. |
|
|
327
|
+
| `local.runtimes[].maxConcurrency` | positive integer, optional | `4` | Concurrent-generation cap for this instance (its real slot count). Applied per instance. |
|
|
326
328
|
| `budgets.sessionUSD` | positive number, optional | unlimited | Frontier budget per session. |
|
|
327
329
|
| `budgets.monthlyUSD` | positive number, optional | unlimited | Monthly frontier budget. |
|
|
328
330
|
| `budgets.frontierTokensPerSession` | positive integer, optional | unlimited | Frontier token limit per session. |
|
|
@@ -711,7 +713,7 @@ See [docs/compatibility.md](docs/compatibility.md). Verified summary as of `2026
|
|
|
711
713
|
|
|
712
714
|
| Surface | Version / contract |
|
|
713
715
|
| --- | --- |
|
|
714
|
-
| openteam | `0.
|
|
716
|
+
| openteam | `0.14.0`; current package version |
|
|
715
717
|
| `@opencode-ai/plugin` | `1.18.19` |
|
|
716
718
|
| `@opencode-ai/sdk` | `1.18.19` |
|
|
717
719
|
| Routing hook | `chat.message`; not `chat.params` for model changes |
|
package/dist/cli.js
CHANGED
|
@@ -101,8 +101,8 @@ var AgentRoleProfileSchema = z.object({
|
|
|
101
101
|
preferredFrontierModels: z.array(z.union([modelSelectionSchema, z.literal("auto")])),
|
|
102
102
|
localFirst: z.boolean(),
|
|
103
103
|
requiresLocalRuntime: z.boolean().optional(),
|
|
104
|
-
localRuntimes: z.array(z.
|
|
105
|
-
localModels: z.
|
|
104
|
+
localRuntimes: z.array(z.string().min(1)).optional(),
|
|
105
|
+
localModels: z.record(z.string().min(1), z.string().min(1)).optional()
|
|
106
106
|
}).strict();
|
|
107
107
|
var TEAM_ROLES = {
|
|
108
108
|
architect: {
|
|
@@ -409,14 +409,33 @@ var defaultFrontierModel = {
|
|
|
409
409
|
modelID: "claude-sonnet-4-5"
|
|
410
410
|
};
|
|
411
411
|
var DEFAULT_LOCAL_MAX_CONCURRENCY = 4;
|
|
412
|
+
var LocalRuntimeKindSchema = z2.enum([
|
|
413
|
+
"ollama",
|
|
414
|
+
"lmstudio",
|
|
415
|
+
"foundry-local",
|
|
416
|
+
"lemonade"
|
|
417
|
+
]);
|
|
412
418
|
var LocalRuntimeSchema = z2.object({
|
|
413
|
-
id: z2.
|
|
419
|
+
id: z2.string().min(1),
|
|
420
|
+
kind: LocalRuntimeKindSchema.optional(),
|
|
414
421
|
enabled: z2.boolean().default(true),
|
|
415
422
|
baseURL: z2.string().url().optional(),
|
|
416
423
|
discovery: z2.enum(["cli", "sdk", "manual"]).optional(),
|
|
417
424
|
defaultModel: ModelRefSchema,
|
|
418
425
|
maxConcurrency: z2.number().int().positive().optional()
|
|
419
|
-
}).strict()
|
|
426
|
+
}).strict().superRefine((runtime, ctx) => {
|
|
427
|
+
const resolvedKind = runtime.kind ?? runtime.id;
|
|
428
|
+
if (!LocalRuntimeKindSchema.safeParse(resolvedKind).success) {
|
|
429
|
+
ctx.addIssue({
|
|
430
|
+
code: z2.ZodIssueCode.custom,
|
|
431
|
+
path: ["kind"],
|
|
432
|
+
message: `local runtime "${runtime.id}" has no resolvable kind: add "kind" ` + "(one of ollama, lmstudio, foundry-local, lemonade), since the id is " + "not itself a runtime kind."
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
function localRuntimeKind(runtime) {
|
|
437
|
+
return runtime.kind ?? runtime.id;
|
|
438
|
+
}
|
|
420
439
|
var MemoryScopeSchema = z2.enum(["project", "user"]);
|
|
421
440
|
var MemoryExtractionModeSchema = z2.enum([
|
|
422
441
|
"local",
|
|
@@ -498,7 +517,23 @@ var OpenTeamConfigObjectSchema = z2.object({
|
|
|
498
517
|
localOnly: false
|
|
499
518
|
}),
|
|
500
519
|
local: z2.object({
|
|
501
|
-
runtimes: z2.array(LocalRuntimeSchema).default([])
|
|
520
|
+
runtimes: z2.array(LocalRuntimeSchema).default([]).superRefine((runtimes, ctx) => {
|
|
521
|
+
const seen = new Set;
|
|
522
|
+
for (let index = 0;index < runtimes.length; index += 1) {
|
|
523
|
+
const runtime = runtimes[index];
|
|
524
|
+
if (runtime === undefined) {
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
if (seen.has(runtime.id)) {
|
|
528
|
+
ctx.addIssue({
|
|
529
|
+
code: z2.ZodIssueCode.custom,
|
|
530
|
+
path: [index, "id"],
|
|
531
|
+
message: `duplicate local runtime id "${runtime.id}": each local.runtimes[].id must be unique within the array.`
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
seen.add(runtime.id);
|
|
535
|
+
}
|
|
536
|
+
})
|
|
502
537
|
}).strict().default({
|
|
503
538
|
runtimes: []
|
|
504
539
|
}),
|
|
@@ -1130,6 +1165,16 @@ var MeetingEventSchema = EventBaseSchema.extend({
|
|
|
1130
1165
|
roles: z4.array(z4.string().min(1)),
|
|
1131
1166
|
decisionIDs: z4.array(z4.string().min(1)).optional()
|
|
1132
1167
|
});
|
|
1168
|
+
var QueueEventSchema = EventBaseSchema.extend({
|
|
1169
|
+
type: z4.literal("queue"),
|
|
1170
|
+
runtimeId: z4.string().min(1),
|
|
1171
|
+
waitedMs: z4.number().finite().min(0),
|
|
1172
|
+
activeCount: z4.number().int().min(0),
|
|
1173
|
+
queuedCount: z4.number().int().min(0),
|
|
1174
|
+
decisionID: z4.string().min(1).optional(),
|
|
1175
|
+
agent: z4.string().min(1).optional(),
|
|
1176
|
+
batchID: z4.string().min(1).optional()
|
|
1177
|
+
});
|
|
1133
1178
|
var DecisionEventSchema = EventBaseSchema.extend({
|
|
1134
1179
|
type: z4.literal("decision"),
|
|
1135
1180
|
agent: z4.string().min(1).optional(),
|
|
@@ -1175,6 +1220,7 @@ var OpenTeamEventSchema = z4.discriminatedUnion("type", [
|
|
|
1175
1220
|
MessageEventSchema,
|
|
1176
1221
|
ToolcallEventSchema,
|
|
1177
1222
|
MeetingEventSchema,
|
|
1223
|
+
QueueEventSchema,
|
|
1178
1224
|
DecisionEventSchema,
|
|
1179
1225
|
ActivityEventSchema,
|
|
1180
1226
|
SessionEndpointEventSchema,
|
|
@@ -1442,6 +1488,9 @@ async function readRouteCostRecords(dir, deps) {
|
|
|
1442
1488
|
async function readDiagnosticEvents(dir, deps) {
|
|
1443
1489
|
return (await readSessionEvents(dir, deps)).filter((event) => event.type === "diagnostic");
|
|
1444
1490
|
}
|
|
1491
|
+
async function readQueueEvents(dir, deps) {
|
|
1492
|
+
return (await readSessionEvents(dir, deps)).filter((event) => event.type === "queue");
|
|
1493
|
+
}
|
|
1445
1494
|
async function readSessionEvents(dir, deps) {
|
|
1446
1495
|
const files = (await deps.storage.list(dir)).filter((file) => file.endsWith(".jsonl"));
|
|
1447
1496
|
const perFile = await Promise.all(files.map(async (file) => {
|
|
@@ -2118,6 +2167,28 @@ async function safeEmit(sink, event) {
|
|
|
2118
2167
|
await sink.emit(event);
|
|
2119
2168
|
} catch {}
|
|
2120
2169
|
}
|
|
2170
|
+
function buildQueueEvent(observation, sessionID, ts, correlation) {
|
|
2171
|
+
const event = {
|
|
2172
|
+
v: EVENT_SCHEMA_VERSION,
|
|
2173
|
+
type: "queue",
|
|
2174
|
+
ts,
|
|
2175
|
+
sessionID,
|
|
2176
|
+
runtimeId: observation.runtimeId,
|
|
2177
|
+
waitedMs: observation.waitedMs,
|
|
2178
|
+
activeCount: observation.activeCount,
|
|
2179
|
+
queuedCount: observation.queuedCount
|
|
2180
|
+
};
|
|
2181
|
+
if (correlation.decisionID !== undefined) {
|
|
2182
|
+
event.decisionID = correlation.decisionID;
|
|
2183
|
+
}
|
|
2184
|
+
if (correlation.agent !== undefined) {
|
|
2185
|
+
event.agent = correlation.agent;
|
|
2186
|
+
}
|
|
2187
|
+
if (correlation.batchID !== undefined) {
|
|
2188
|
+
event.batchID = correlation.batchID;
|
|
2189
|
+
}
|
|
2190
|
+
return event;
|
|
2191
|
+
}
|
|
2121
2192
|
async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
|
|
2122
2193
|
if (getRoleProfile(input.roleID, input.config.orchestrator?.roles) === undefined) {
|
|
2123
2194
|
warnUnknownRole(input.roleID, deps.warn, deps.warnedRoles);
|
|
@@ -2155,16 +2226,40 @@ async function runRoleTaskWithCorrelation(input, deps, correlation, batch) {
|
|
|
2155
2226
|
const subsessionDeps = deps.timeoutMs === undefined ? {} : { timeoutMs: deps.timeoutMs };
|
|
2156
2227
|
const runtimeId = selection.runtimeId;
|
|
2157
2228
|
let release;
|
|
2229
|
+
let queueObservation;
|
|
2158
2230
|
if (runtimeId !== undefined && deps.runtimeLimiter !== undefined) {
|
|
2159
|
-
|
|
2231
|
+
const limiter = deps.runtimeLimiter;
|
|
2232
|
+
release = limiter.tryAcquire(runtimeId);
|
|
2233
|
+
let waitedMs = 0;
|
|
2160
2234
|
if (release === undefined) {
|
|
2161
|
-
|
|
2162
|
-
|
|
2235
|
+
const acquisition = await limiter.acquire(runtimeId);
|
|
2236
|
+
release = acquisition.release;
|
|
2237
|
+
waitedMs = acquisition.waitedMs;
|
|
2238
|
+
}
|
|
2239
|
+
queueObservation = {
|
|
2240
|
+
runtimeId,
|
|
2241
|
+
waitedMs,
|
|
2242
|
+
activeCount: limiter.activeCount(runtimeId),
|
|
2243
|
+
queuedCount: limiter.queuedCount(runtimeId)
|
|
2244
|
+
};
|
|
2163
2245
|
}
|
|
2164
2246
|
try {
|
|
2165
2247
|
const subsession = await runSubsession(deps.client, request, subsessionDeps);
|
|
2166
2248
|
const record = buildRecord(input, decision2, subsession, deps, correlation.decisionID, correlation.batchID);
|
|
2167
2249
|
await safeEmit(deps.sink, correlatedCostRecordToRouteEvent(record));
|
|
2250
|
+
if (queueObservation !== undefined) {
|
|
2251
|
+
const sessionID = recordSessionID(input, subsession);
|
|
2252
|
+
if (sessionID !== undefined) {
|
|
2253
|
+
const queueCorrelation = {
|
|
2254
|
+
decisionID: correlation.decisionID,
|
|
2255
|
+
agent: input.roleID
|
|
2256
|
+
};
|
|
2257
|
+
if (correlation.batchID !== undefined) {
|
|
2258
|
+
queueCorrelation.batchID = correlation.batchID;
|
|
2259
|
+
}
|
|
2260
|
+
await safeEmit(deps.sink, buildQueueEvent(queueObservation, sessionID, deps.now(), queueCorrelation));
|
|
2261
|
+
}
|
|
2262
|
+
}
|
|
2168
2263
|
return { decision: decision2, subsession, record };
|
|
2169
2264
|
} finally {
|
|
2170
2265
|
release?.();
|
|
@@ -2940,6 +3035,7 @@ var KNOWN_CONFIG_KEYS_BY_PATH = new Map([
|
|
|
2940
3035
|
"local.runtimes[]",
|
|
2941
3036
|
[
|
|
2942
3037
|
"id",
|
|
3038
|
+
"kind",
|
|
2943
3039
|
"enabled",
|
|
2944
3040
|
"baseURL",
|
|
2945
3041
|
"discovery",
|
|
@@ -9880,10 +9976,11 @@ class RuntimeRegistry {
|
|
|
9880
9976
|
continue;
|
|
9881
9977
|
}
|
|
9882
9978
|
const probedAt = this.clock();
|
|
9883
|
-
const adapter = this.adapters[runtime
|
|
9979
|
+
const adapter = this.adapters[localRuntimeKind(runtime)];
|
|
9884
9980
|
const options = this.createProbeOptions(runtime, probedAt);
|
|
9885
9981
|
try {
|
|
9886
|
-
|
|
9982
|
+
const snapshot = await adapter.probe(options);
|
|
9983
|
+
snapshots.push({ ...snapshot, id: runtime.id });
|
|
9887
9984
|
} catch (error) {
|
|
9888
9985
|
snapshots.push(unavailableSnapshot({
|
|
9889
9986
|
id: runtime.id,
|
|
@@ -9903,7 +10000,7 @@ class RuntimeRegistry {
|
|
|
9903
10000
|
if (runtime.baseURL !== undefined) {
|
|
9904
10001
|
options.baseURL = runtime.baseURL;
|
|
9905
10002
|
}
|
|
9906
|
-
if (runtime
|
|
10003
|
+
if (localRuntimeKind(runtime) === "foundry-local" && runtime.discovery !== "manual" && this.foundryDiscovery !== undefined) {
|
|
9907
10004
|
options.discovery = this.foundryDiscovery;
|
|
9908
10005
|
}
|
|
9909
10006
|
return options;
|
|
@@ -10551,6 +10648,60 @@ function describeOtelBackendForDoctor(config, env) {
|
|
|
10551
10648
|
};
|
|
10552
10649
|
}
|
|
10553
10650
|
|
|
10651
|
+
// src/telemetry/queueWait.ts
|
|
10652
|
+
function percentile(sortedAsc, p) {
|
|
10653
|
+
const rank = Math.ceil(p / 100 * sortedAsc.length);
|
|
10654
|
+
const index = Math.min(Math.max(rank, 1), sortedAsc.length) - 1;
|
|
10655
|
+
return sortedAsc[index] ?? 0;
|
|
10656
|
+
}
|
|
10657
|
+
function summarizeGroup(runtimeId, waits, maxQueued, maxActive) {
|
|
10658
|
+
const sorted = [...waits].sort((a, b) => a - b);
|
|
10659
|
+
return {
|
|
10660
|
+
runtimeId,
|
|
10661
|
+
samples: sorted.length,
|
|
10662
|
+
contended: sorted.filter((wait) => wait > 0).length,
|
|
10663
|
+
p50Ms: percentile(sorted, 50),
|
|
10664
|
+
p95Ms: percentile(sorted, 95),
|
|
10665
|
+
maxMs: sorted[sorted.length - 1] ?? 0,
|
|
10666
|
+
maxQueued,
|
|
10667
|
+
maxActive
|
|
10668
|
+
};
|
|
10669
|
+
}
|
|
10670
|
+
function summarizeQueueWaits(events) {
|
|
10671
|
+
if (events.length === 0) {
|
|
10672
|
+
return;
|
|
10673
|
+
}
|
|
10674
|
+
const allWaits = [];
|
|
10675
|
+
let overallMaxQueued = 0;
|
|
10676
|
+
let overallMaxActive = 0;
|
|
10677
|
+
const byRuntime = new Map;
|
|
10678
|
+
for (const event of events) {
|
|
10679
|
+
allWaits.push(event.waitedMs);
|
|
10680
|
+
overallMaxQueued = Math.max(overallMaxQueued, event.queuedCount);
|
|
10681
|
+
overallMaxActive = Math.max(overallMaxActive, event.activeCount);
|
|
10682
|
+
let group = byRuntime.get(event.runtimeId);
|
|
10683
|
+
if (group === undefined) {
|
|
10684
|
+
group = { waits: [], maxQueued: 0, maxActive: 0 };
|
|
10685
|
+
byRuntime.set(event.runtimeId, group);
|
|
10686
|
+
}
|
|
10687
|
+
group.waits.push(event.waitedMs);
|
|
10688
|
+
group.maxQueued = Math.max(group.maxQueued, event.queuedCount);
|
|
10689
|
+
group.maxActive = Math.max(group.maxActive, event.activeCount);
|
|
10690
|
+
}
|
|
10691
|
+
const overall = summarizeGroup("*", allWaits, overallMaxQueued, overallMaxActive);
|
|
10692
|
+
const perRuntime = [...byRuntime.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([runtimeId, group]) => summarizeGroup(runtimeId, group.waits, group.maxQueued, group.maxActive));
|
|
10693
|
+
return {
|
|
10694
|
+
samples: overall.samples,
|
|
10695
|
+
contended: overall.contended,
|
|
10696
|
+
p50Ms: overall.p50Ms,
|
|
10697
|
+
p95Ms: overall.p95Ms,
|
|
10698
|
+
maxMs: overall.maxMs,
|
|
10699
|
+
maxQueued: overall.maxQueued,
|
|
10700
|
+
maxActive: overall.maxActive,
|
|
10701
|
+
perRuntime
|
|
10702
|
+
};
|
|
10703
|
+
}
|
|
10704
|
+
|
|
10554
10705
|
// src/commands/baseline.ts
|
|
10555
10706
|
function formatRef(ref) {
|
|
10556
10707
|
return ref === null ? "—" : `${ref.providerID}/${ref.modelID}`;
|
|
@@ -10711,6 +10862,24 @@ function isNetworkRuntime(baseURL) {
|
|
|
10711
10862
|
return false;
|
|
10712
10863
|
}
|
|
10713
10864
|
}
|
|
10865
|
+
function queueWaitSection(view) {
|
|
10866
|
+
const lines = [" local queue wait (#144, per openteam process):"];
|
|
10867
|
+
const summary = view.summary;
|
|
10868
|
+
if (summary === undefined || summary.samples === 0) {
|
|
10869
|
+
lines.push(" (no queue samples recorded yet — run an orchestrated load, then re-run doctor)");
|
|
10870
|
+
return lines;
|
|
10871
|
+
}
|
|
10872
|
+
const mark = summary.contended > 0 ? "⚠" : "✓";
|
|
10873
|
+
lines.push(` ${mark} ${summary.samples} dispatch(es), ${summary.contended} queued — ` + `p50 ${summary.p50Ms}ms · p95 ${summary.p95Ms}ms · max ${summary.maxMs}ms`);
|
|
10874
|
+
lines.push(` peak depth: ${summary.maxActive} active · ${summary.maxQueued} queued`);
|
|
10875
|
+
for (const runtime of summary.perRuntime) {
|
|
10876
|
+
lines.push(` ${runtime.runtimeId.padEnd(14)} ${runtime.samples} sample(s), ` + `${runtime.contended} queued — p50 ${runtime.p50Ms}ms · p95 ${runtime.p95Ms}ms · ` + `max ${runtime.maxMs}ms · peak ${runtime.maxActive} active/${runtime.maxQueued} queued`);
|
|
10877
|
+
}
|
|
10878
|
+
if (summary.contended > 0) {
|
|
10879
|
+
lines.push(" Lower a runtime's maxConcurrency in .opencode/openteam.json to leave slots for interactive traffic.");
|
|
10880
|
+
}
|
|
10881
|
+
return lines;
|
|
10882
|
+
}
|
|
10714
10883
|
function failureReasonText(reason, searchedPaths) {
|
|
10715
10884
|
switch (reason) {
|
|
10716
10885
|
case "provider-not-configured": {
|
|
@@ -10870,6 +11039,20 @@ function rosterHealthSection(audit, loadError, rosterRoleCount) {
|
|
|
10870
11039
|
}
|
|
10871
11040
|
return lines;
|
|
10872
11041
|
}
|
|
11042
|
+
function gitignoreSection(gitignore) {
|
|
11043
|
+
if (gitignore.missingRules.length === 0) {
|
|
11044
|
+
return [
|
|
11045
|
+
" gitignore:",
|
|
11046
|
+
` ✓ ${gitignore.path} ignores openteam's generated runtime state.`
|
|
11047
|
+
];
|
|
11048
|
+
}
|
|
11049
|
+
const quoted = gitignore.missingRules.map((rule) => `\`${rule}\``).join(", ");
|
|
11050
|
+
const lines = [" gitignore:"];
|
|
11051
|
+
lines.push(gitignore.exists ? ` ✗ ${gitignore.path} is missing openteam ignore rule(s): ${gitignore.missingRules.join(", ")}` : ` ✗ ${gitignore.path} does not exist, so no openteam ignore rule(s) are in place: ${gitignore.missingRules.join(", ")}`);
|
|
11052
|
+
lines.push(" problem: openteam writes machine-local runtime output (telemetry, graph state, soak recordings) that must not be committed.");
|
|
11053
|
+
lines.push(` remedy: add ${quoted} to ${gitignore.path} (or re-run \`openteam setup\`), then re-run \`openteam doctor\`.`);
|
|
11054
|
+
return lines;
|
|
11055
|
+
}
|
|
10873
11056
|
function agentModelsSection(diagnostics, searchedPaths) {
|
|
10874
11057
|
const lines = [" agent models:"];
|
|
10875
11058
|
if (diagnostics.length === 0) {
|
|
@@ -10913,10 +11096,16 @@ function renderDoctor(input) {
|
|
|
10913
11096
|
lines.push(` ⚠ ${snapshot.id} is reached over the network: its ${cap}-slot cap is enforced per openteam process, so`, " two processes at once (an opencode session plus 'openteam console') can together exceed it.");
|
|
10914
11097
|
}
|
|
10915
11098
|
lines.push(` telemetry: ${input.telemetryPath} — ${input.telemetryRecords} record(s)`);
|
|
11099
|
+
if (input.queueWait !== undefined) {
|
|
11100
|
+
lines.push(...queueWaitSection(input.queueWait));
|
|
11101
|
+
}
|
|
10916
11102
|
if (input.diagnostics !== undefined) {
|
|
10917
11103
|
lines.push(...diagnosticsSection(input.diagnostics));
|
|
10918
11104
|
}
|
|
10919
11105
|
lines.push(...rosterHealthSection(input.rosterAudit, input.rosterLoadError, input.rosterRoleCount));
|
|
11106
|
+
if (input.gitignore !== undefined) {
|
|
11107
|
+
lines.push(...gitignoreSection(input.gitignore));
|
|
11108
|
+
}
|
|
10920
11109
|
if (input.otelBackend !== undefined) {
|
|
10921
11110
|
const otel = input.otelBackend;
|
|
10922
11111
|
lines.push(" opentelemetry:");
|
|
@@ -11240,6 +11429,12 @@ function mergeOpencodeConfigs(base, override) {
|
|
|
11240
11429
|
return result;
|
|
11241
11430
|
}
|
|
11242
11431
|
|
|
11432
|
+
// src/storage/graph/soakRecorder.ts
|
|
11433
|
+
var SOAK_EVIDENCE_DIR = ".opencode/soak";
|
|
11434
|
+
var SOAK_RECORDER_BASE_DIR = ".opencode";
|
|
11435
|
+
var SOAK_RECORDER_ID_FILENAME = "soak-recorder-id";
|
|
11436
|
+
var SOAK_RECORDER_ID_PATH = `${SOAK_RECORDER_BASE_DIR}/${SOAK_RECORDER_ID_FILENAME}`;
|
|
11437
|
+
|
|
11243
11438
|
// src/commands/frontierCatalog.ts
|
|
11244
11439
|
function weightedCost(inputUSD, outputUSD) {
|
|
11245
11440
|
return 0.75 * inputUSD + 0.25 * outputUSD;
|
|
@@ -11277,6 +11472,11 @@ var GENERATED_OPENTEAM_STATE_PATHS = [
|
|
|
11277
11472
|
DEFAULT_STORAGE_SQLITE_INDEX_PATH,
|
|
11278
11473
|
DEFAULT_MEMORY_INDEX_PATH
|
|
11279
11474
|
];
|
|
11475
|
+
var GENERATED_OPENTEAM_STATE_GROUPS = [
|
|
11476
|
+
{ kind: "dir", paths: GENERATED_OPENTEAM_STATE_PATHS },
|
|
11477
|
+
{ kind: "dir", paths: [SOAK_EVIDENCE_DIR] },
|
|
11478
|
+
{ kind: "file", paths: [SOAK_RECORDER_ID_PATH] }
|
|
11479
|
+
];
|
|
11280
11480
|
var OPENCODE_DIR = ".opencode";
|
|
11281
11481
|
var AGENT_DIR = `${OPENCODE_DIR}/agent`;
|
|
11282
11482
|
var ROLE_AGENT_DESCRIPTIONS = {
|
|
@@ -11347,17 +11547,16 @@ function commonGeneratedStateRoot(paths) {
|
|
|
11347
11547
|
}
|
|
11348
11548
|
return common.join("/");
|
|
11349
11549
|
}
|
|
11350
|
-
function generatedStateIgnoreRule() {
|
|
11351
|
-
const root = commonGeneratedStateRoot(
|
|
11550
|
+
function generatedStateIgnoreRule(group) {
|
|
11551
|
+
const root = commonGeneratedStateRoot(group.paths);
|
|
11352
11552
|
const opencodePrefix = `${OPENCODE_DIR}/`;
|
|
11353
11553
|
if (!root.startsWith(opencodePrefix)) {
|
|
11354
11554
|
throw new Error(`generated openteam state path is outside ${OPENCODE_DIR}`);
|
|
11355
11555
|
}
|
|
11356
|
-
|
|
11556
|
+
const rule = root.slice(opencodePrefix.length);
|
|
11557
|
+
return group.kind === "dir" ? `${rule}/` : rule;
|
|
11357
11558
|
}
|
|
11358
|
-
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES =
|
|
11359
|
-
generatedStateIgnoreRule()
|
|
11360
|
-
];
|
|
11559
|
+
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES = GENERATED_OPENTEAM_STATE_GROUPS.map(generatedStateIgnoreRule);
|
|
11361
11560
|
var LEGACY_OPENCODE_GITIGNORE_STATE_RULES = ["openteam/"];
|
|
11362
11561
|
var LEGACY_LOCAL_OPENCODE_GITIGNORE_RULES = [
|
|
11363
11562
|
"openteam/sessions/",
|
|
@@ -11393,6 +11592,13 @@ function buildOpencodeGitignore(existing = "") {
|
|
|
11393
11592
|
`)}
|
|
11394
11593
|
`;
|
|
11395
11594
|
}
|
|
11595
|
+
function activeGitignoreRules(gitignore) {
|
|
11596
|
+
return gitignore.split(/\r?\n/).map(normalizeGitignoreRule).filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
11597
|
+
}
|
|
11598
|
+
function missingGeneratedStateRules(gitignore) {
|
|
11599
|
+
const present = new Set(activeGitignoreRules(gitignore));
|
|
11600
|
+
return OPENCODE_GITIGNORE_GENERATED_STATE_RULES.filter((rule) => !present.has(rule));
|
|
11601
|
+
}
|
|
11396
11602
|
var KNOWN_RUNTIMES = [
|
|
11397
11603
|
{
|
|
11398
11604
|
id: "ollama",
|
|
@@ -11956,7 +12162,7 @@ function resolveStaticPurgeItems(config, paths) {
|
|
|
11956
12162
|
...paths.opencodeConfigPaths.map((p) => ({ kind: "opencode-config", path: p })),
|
|
11957
12163
|
{ kind: "gitignore", path: paths.gitignorePath }
|
|
11958
12164
|
],
|
|
11959
|
-
roster: [],
|
|
12165
|
+
roster: [{ kind: "file", path: OPENTEAM_ROSTER_PATH }],
|
|
11960
12166
|
decisions: [
|
|
11961
12167
|
{ kind: "file", path: paths.decisionsPath },
|
|
11962
12168
|
{ kind: "file", path: paths.telemetryPath }
|
|
@@ -12248,8 +12454,12 @@ function categoryPrompt(id, items) {
|
|
|
12248
12454
|
return "Remove openteam configuration and wiring?";
|
|
12249
12455
|
case "roster": {
|
|
12250
12456
|
const names = items.filter((item) => item.kind === "agent").map((item) => item.name);
|
|
12251
|
-
const
|
|
12252
|
-
|
|
12457
|
+
const hasRegistry = items.some((item) => item.kind === "file" && item.path === OPENTEAM_ROSTER_PATH);
|
|
12458
|
+
const plural = names.length === 1 ? "" : "s";
|
|
12459
|
+
const agentNames = names.length > 0 ? `: ${names.join(", ")}` : "";
|
|
12460
|
+
const agentClause = `${names.length} user agent${plural}${agentNames}`;
|
|
12461
|
+
const parts = hasRegistry ? [`roster registry (${OPENTEAM_ROSTER_PATH})`, agentClause] : [agentClause];
|
|
12462
|
+
return `Remove the agent roster? (${parts.join("; ")})`;
|
|
12253
12463
|
}
|
|
12254
12464
|
case "decisions":
|
|
12255
12465
|
return "Remove decisions and telemetry?";
|
|
@@ -12311,7 +12521,9 @@ async function collectCategories(input) {
|
|
|
12311
12521
|
const { runtime, config, paths } = input;
|
|
12312
12522
|
const staticItems = resolveStaticPurgeItems(config, paths);
|
|
12313
12523
|
const agents = await runtime.port.listAgents();
|
|
12314
|
-
const
|
|
12524
|
+
const discoveredAgents = agents.filter((agent) => path2.resolve(agent.path) !== path2.resolve(paths.orchestratorAgentPath)).map((agent) => ({ kind: "agent", path: agent.path, name: agent.name }));
|
|
12525
|
+
const rosterRegistry = await presentItemsFor(runtime.port, staticItems.roster);
|
|
12526
|
+
const rosterItems = [...rosterRegistry, ...discoveredAgents];
|
|
12315
12527
|
const worktrees = await runtime.port.listWorktrees();
|
|
12316
12528
|
const worktreeItems = worktrees.map((worktree) => ({
|
|
12317
12529
|
kind: "worktree",
|
|
@@ -13389,6 +13601,15 @@ async function runCli(argv, deps) {
|
|
|
13389
13601
|
...defaultModel !== undefined ? { defaultModel } : {}
|
|
13390
13602
|
});
|
|
13391
13603
|
const legacyLayout = deps.detectLegacyLayout !== undefined ? await deps.detectLegacyLayout() : undefined;
|
|
13604
|
+
let gitignoreCoverage;
|
|
13605
|
+
if (deps.readGitignore !== undefined) {
|
|
13606
|
+
const raw = await deps.readGitignore();
|
|
13607
|
+
gitignoreCoverage = {
|
|
13608
|
+
path: OPENCODE_GITIGNORE_PATH,
|
|
13609
|
+
exists: raw !== undefined,
|
|
13610
|
+
missingRules: missingGeneratedStateRules(raw ?? "")
|
|
13611
|
+
};
|
|
13612
|
+
}
|
|
13392
13613
|
const otelBackend = describeOtelBackendForDoctor({
|
|
13393
13614
|
backend: "opentelemetry",
|
|
13394
13615
|
connectionEnv: "APPLICATIONINSIGHTS_CONNECTION_STRING"
|
|
@@ -13405,6 +13626,12 @@ async function runCli(argv, deps) {
|
|
|
13405
13626
|
rosterLoadError = err instanceof Error ? err.message : String(err);
|
|
13406
13627
|
}
|
|
13407
13628
|
}
|
|
13629
|
+
let queueWait;
|
|
13630
|
+
if (deps.readQueueEvents !== undefined) {
|
|
13631
|
+
const queueEvents = await deps.readQueueEvents();
|
|
13632
|
+
const summary = summarizeQueueWaits(queueEvents);
|
|
13633
|
+
queueWait = summary !== undefined ? { summary } : {};
|
|
13634
|
+
}
|
|
13408
13635
|
return {
|
|
13409
13636
|
exitCode: 0,
|
|
13410
13637
|
stdout: renderDoctor({
|
|
@@ -13414,6 +13641,7 @@ async function runCli(argv, deps) {
|
|
|
13414
13641
|
telemetryRecords: records.length,
|
|
13415
13642
|
agentModels,
|
|
13416
13643
|
opencodeConfigPaths,
|
|
13644
|
+
...queueWait !== undefined ? { queueWait } : {},
|
|
13417
13645
|
...rosterAudit !== undefined ? { rosterAudit } : {},
|
|
13418
13646
|
...rosterRoleCount !== undefined ? { rosterRoleCount } : {},
|
|
13419
13647
|
...rosterLoadError !== undefined ? { rosterLoadError } : {},
|
|
@@ -13421,7 +13649,8 @@ async function runCli(argv, deps) {
|
|
|
13421
13649
|
...opencodeConfigError !== undefined ? { opencodeConfigError } : {},
|
|
13422
13650
|
...cacheEntries !== undefined ? { cacheEntries, cliVersion: deps.version } : {},
|
|
13423
13651
|
...legacyLayout !== undefined && legacyLayout.length > 0 ? { legacyLayout } : {},
|
|
13424
|
-
...otelBackend !== undefined ? { otelBackend } : {}
|
|
13652
|
+
...otelBackend !== undefined ? { otelBackend } : {},
|
|
13653
|
+
...gitignoreCoverage !== undefined ? { gitignore: gitignoreCoverage } : {}
|
|
13425
13654
|
})
|
|
13426
13655
|
};
|
|
13427
13656
|
}
|
|
@@ -15456,7 +15685,7 @@ async function buildMemoryRuntimeFromConfig(config, deps, options = {}) {
|
|
|
15456
15685
|
// package.json
|
|
15457
15686
|
var package_default = {
|
|
15458
15687
|
name: "@jmanuelcorral/openteam",
|
|
15459
|
-
version: "0.
|
|
15688
|
+
version: "0.14.0",
|
|
15460
15689
|
packageManager: "bun@1.3.14",
|
|
15461
15690
|
description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
|
|
15462
15691
|
license: "MIT",
|
|
@@ -15748,6 +15977,9 @@ var deps = {
|
|
|
15748
15977
|
storage,
|
|
15749
15978
|
legacyTelemetryPath: path4
|
|
15750
15979
|
}),
|
|
15980
|
+
readQueueEvents: () => readQueueEvents(DEFAULT_SESSIONS_DIR, {
|
|
15981
|
+
storage
|
|
15982
|
+
}),
|
|
15751
15983
|
readDiagnostics: () => readDiagnosticEvents(DEFAULT_SESSIONS_DIR, {
|
|
15752
15984
|
storage
|
|
15753
15985
|
}),
|
|
@@ -15773,6 +16005,7 @@ var deps = {
|
|
|
15773
16005
|
loopRuntime: createCliLoopRuntime(),
|
|
15774
16006
|
loadRosterForDoctor: readStoredRosterForDoctor,
|
|
15775
16007
|
auditRoster: auditStoredRosterForDoctor,
|
|
16008
|
+
readGitignore: () => storage.read(OPENCODE_GITIGNORE_PATH),
|
|
15776
16009
|
version: PACKAGE_VERSION
|
|
15777
16010
|
};
|
|
15778
16011
|
function createCliPurgeRuntime() {
|
|
@@ -15873,18 +16106,30 @@ function createSetupDeps() {
|
|
|
15873
16106
|
}
|
|
15874
16107
|
};
|
|
15875
16108
|
}
|
|
15876
|
-
function createRolesInitDeps() {
|
|
15877
|
-
const detect = createDetect(nodeExec2);
|
|
16109
|
+
function createRolesInitDeps(configSelection) {
|
|
15878
16110
|
return {
|
|
15879
16111
|
prompt: clackPrompter,
|
|
15880
16112
|
readFile: (path4) => storage.read(path4),
|
|
15881
16113
|
writeFile: async (path4, contents) => {
|
|
15882
16114
|
await storage.write(path4, contents);
|
|
15883
16115
|
},
|
|
15884
|
-
detectRuntimes: async () =>
|
|
15885
|
-
|
|
15886
|
-
|
|
15887
|
-
|
|
16116
|
+
detectRuntimes: async () => {
|
|
16117
|
+
const config = await loadConfig(configSelection.path, configSelection.resolution);
|
|
16118
|
+
const enabled = config.local.runtimes.filter((runtime) => runtime.enabled);
|
|
16119
|
+
if (enabled.length === 0) {
|
|
16120
|
+
return [];
|
|
16121
|
+
}
|
|
16122
|
+
const registry = new RuntimeRegistry({
|
|
16123
|
+
fetch: globalThis.fetch,
|
|
16124
|
+
clock: () => new Date().toISOString(),
|
|
16125
|
+
foundryDiscovery: foundryDiscoveryFromExec(nodeExec2)
|
|
16126
|
+
});
|
|
16127
|
+
const snapshots = await registry.probe(enabled);
|
|
16128
|
+
return snapshots.map((snapshot) => ({
|
|
16129
|
+
id: snapshot.id,
|
|
16130
|
+
available: snapshot.reachable
|
|
16131
|
+
}));
|
|
16132
|
+
}
|
|
15888
16133
|
};
|
|
15889
16134
|
}
|
|
15890
16135
|
async function main() {
|
|
@@ -15900,7 +16145,7 @@ async function main() {
|
|
|
15900
16145
|
return;
|
|
15901
16146
|
}
|
|
15902
16147
|
if (argv[0] === "roles" && argv[1] === "init") {
|
|
15903
|
-
const result2 = await runRolesInit(createRolesInitDeps());
|
|
16148
|
+
const result2 = await runRolesInit(createRolesInitDeps(configSelection));
|
|
15904
16149
|
if (result2.stdout.length > 0) {
|
|
15905
16150
|
process.stdout.write(`${result2.stdout}
|
|
15906
16151
|
`);
|
|
@@ -8,6 +8,7 @@ import { type AgentRoleProfile } from "../orchestrator/roles";
|
|
|
8
8
|
import { type Roster } from "../orchestrator/roster";
|
|
9
9
|
import type { RosterFileLoadResult } from "../orchestrator/rosterPersistence";
|
|
10
10
|
import { type WorktreeObservation, type WorktreeReconcileAction } from "../orchestrator/worktreeReconciler";
|
|
11
|
+
import type { QueueEvent } from "../telemetry/events";
|
|
11
12
|
import type { CostRecord } from "../telemetry/types";
|
|
12
13
|
import { type AgentFile } from "./agents";
|
|
13
14
|
import type { CachePort } from "./clearCache";
|
|
@@ -19,6 +20,13 @@ export type CliDeps = {
|
|
|
19
20
|
saveConfig: (config: OpenTeamConfig, path: string, options?: ConfigPathResolution) => Promise<void>;
|
|
20
21
|
probe: (config: OpenTeamConfig) => Promise<LocalRuntimeSnapshot[]>;
|
|
21
22
|
readTelemetry: (path: string) => Promise<CostRecord[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Reads the per-dispatch local-runtime queue metric events (#144) for the
|
|
25
|
+
* `openteam doctor` queue-wait summary. Optional so older composition roots
|
|
26
|
+
* still run; when absent, doctor omits the `local queue wait` section rather
|
|
27
|
+
* than inventing zeros.
|
|
28
|
+
*/
|
|
29
|
+
readQueueEvents?: () => Promise<QueueEvent[]>;
|
|
22
30
|
/**
|
|
23
31
|
* Reads plugin-safe diagnostics persisted by the opencode plugin. Optional so
|
|
24
32
|
* older composition roots still run; when absent, doctor omits the section.
|
|
@@ -61,6 +69,13 @@ export type CliDeps = {
|
|
|
61
69
|
* migration section. Absent in composition roots that do not probe the disk.
|
|
62
70
|
*/
|
|
63
71
|
detectLegacyLayout?: () => Promise<readonly LegacyLayoutFinding[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Reads `.opencode/.gitignore` for the `openteam doctor` coverage check
|
|
74
|
+
* (returns `undefined` when the file is absent). Optional so composition roots
|
|
75
|
+
* that do not touch the disk can omit it; when absent, doctor omits the
|
|
76
|
+
* `gitignore:` section rather than guessing.
|
|
77
|
+
*/
|
|
78
|
+
readGitignore?: () => Promise<string | undefined>;
|
|
64
79
|
/**
|
|
65
80
|
* Executes the P15b legacy-layout migration (`openteam migrate`): physically
|
|
66
81
|
* relocates pre-split artifacts to their current homes and returns a report.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOjE,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,KAAK,EACV,uBAAuB,EACvB,YAAY,EAEZ,aAAa,EACd,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|