@jmanuelcorral/openteam 0.2.2 → 0.9.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/.opencode/command/openteam.md +2 -1
- package/.opencode/openteam.example.json +27 -8
- package/AGENTS.md +5 -2
- package/README.es.md +155 -59
- package/README.md +418 -62
- package/dist/capabilities/types.d.ts +3 -3
- package/dist/capabilities/types.d.ts.map +1 -1
- package/dist/classifier/localClassifier.d.ts +0 -2
- package/dist/classifier/localClassifier.d.ts.map +1 -1
- package/dist/cli/consoleServe.d.ts +21 -1
- package/dist/cli/consoleServe.d.ts.map +1 -1
- package/dist/cli/graphOperator.d.ts +22 -0
- package/dist/cli/graphOperator.d.ts.map +1 -0
- package/dist/cli/graphStatusSnapshot.d.ts +16 -0
- package/dist/cli/graphStatusSnapshot.d.ts.map +1 -0
- package/dist/cli/migrateAdapter.d.ts +12 -0
- package/dist/cli/migrateAdapter.d.ts.map +1 -0
- package/dist/cli/purgeAdapter.d.ts +10 -0
- package/dist/cli/purgeAdapter.d.ts.map +1 -0
- package/dist/cli/setupAdapters.d.ts.map +1 -1
- package/dist/cli.js +13394 -6121
- package/dist/commands/agents.d.ts +102 -2
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/baseline.d.ts.map +1 -1
- package/dist/commands/clearCache.d.ts +23 -0
- package/dist/commands/clearCache.d.ts.map +1 -0
- package/dist/commands/dispatch.d.ts +196 -4
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts +40 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/frontierCatalog.d.ts +8 -14
- package/dist/commands/frontierCatalog.d.ts.map +1 -1
- package/dist/commands/graph.d.ts +0 -27
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/migrate.d.ts +11 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/purge.d.ts +132 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/report.d.ts +1 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/setup.d.ts +62 -5
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/config/errors.d.ts +10 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/legacyMigration.d.ts +82 -0
- package/dist/config/legacyMigration.d.ts.map +1 -0
- package/dist/config/legacyPaths.d.ts +105 -0
- package/dist/config/legacyPaths.d.ts.map +1 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/opencode.d.ts +63 -0
- package/dist/config/opencode.d.ts.map +1 -0
- package/dist/config/persist.d.ts +8 -0
- package/dist/config/persist.d.ts.map +1 -1
- package/dist/config/resolve.d.ts +1 -1
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/runtime.d.ts +62 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/schema.d.ts +142 -79
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/console/assets.d.ts +2 -2
- package/dist/console/assets.d.ts.map +1 -1
- package/dist/console/configView.d.ts +74 -0
- package/dist/console/configView.d.ts.map +1 -0
- package/dist/console/opencodeClient.d.ts +8 -6
- package/dist/console/opencodeClient.d.ts.map +1 -1
- package/dist/console/protocol.d.ts +30 -6
- package/dist/console/protocol.d.ts.map +1 -1
- package/dist/console/render.d.ts +30 -1
- package/dist/console/render.d.ts.map +1 -1
- package/dist/console/types.d.ts +1 -1
- package/dist/console/types.d.ts.map +1 -1
- package/dist/context/redaction.d.ts +19 -19
- package/dist/context/redaction.d.ts.map +1 -1
- package/dist/context/schema.d.ts +26 -26
- package/dist/context/schema.d.ts.map +1 -1
- package/dist/context/types.d.ts +3 -3
- package/dist/contract/opencode.d.ts +39 -23
- package/dist/contract/opencode.d.ts.map +1 -1
- package/dist/graph/certificate.d.ts +37 -16
- package/dist/graph/certificate.d.ts.map +1 -1
- package/dist/graph/langgraph/adapter.d.ts +56 -0
- package/dist/graph/langgraph/adapter.d.ts.map +1 -0
- package/dist/graph/langgraph/certification.d.ts +64 -0
- package/dist/graph/langgraph/certification.d.ts.map +1 -0
- package/dist/graph/langgraph/checkpointReplay.d.ts +49 -0
- package/dist/graph/langgraph/checkpointReplay.d.ts.map +1 -0
- package/dist/graph/langgraph/checkpointer.d.ts +49 -0
- package/dist/graph/langgraph/checkpointer.d.ts.map +1 -0
- package/dist/graph/langgraph/engine.d.ts +34 -0
- package/dist/graph/langgraph/engine.d.ts.map +1 -0
- package/dist/graph/langgraph/graphModel.d.ts +37 -0
- package/dist/graph/langgraph/graphModel.d.ts.map +1 -0
- package/dist/graph/langgraph/reducer.d.ts +18 -0
- package/dist/graph/langgraph/reducer.d.ts.map +1 -0
- package/dist/graph/langgraph/retirement.d.ts +59 -0
- package/dist/graph/langgraph/retirement.d.ts.map +1 -0
- package/dist/graph/langgraph/types.d.ts +65 -0
- package/dist/graph/langgraph/types.d.ts.map +1 -0
- package/dist/graph/privacyPolicy.d.ts +7 -0
- package/dist/graph/privacyPolicy.d.ts.map +1 -1
- package/dist/graph/soakLedger.d.ts.map +1 -1
- package/dist/graph/types.d.ts +0 -2
- package/dist/graph/types.d.ts.map +1 -1
- package/dist/index.d.ts +46 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11083 -5009
- package/dist/local/cacheAdapter.d.ts +7 -0
- package/dist/local/cacheAdapter.d.ts.map +1 -0
- package/dist/local/concurrency.d.ts +52 -0
- package/dist/local/concurrency.d.ts.map +1 -0
- package/dist/local/embeddings.d.ts +10 -10
- package/dist/local/embeddings.d.ts.map +1 -1
- package/dist/local/extractClient.d.ts +13 -10
- package/dist/local/extractClient.d.ts.map +1 -1
- package/dist/local/lemonade.d.ts +4 -0
- package/dist/local/lemonade.d.ts.map +1 -0
- package/dist/local/registry.d.ts +16 -0
- package/dist/local/registry.d.ts.map +1 -1
- package/dist/local/types.d.ts +1 -1
- package/dist/local/types.d.ts.map +1 -1
- package/dist/mcp/semanticRecall.d.ts +18 -1
- package/dist/mcp/semanticRecall.d.ts.map +1 -1
- package/dist/mcp/server.d.ts +41 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/memory/embedText.d.ts +4 -0
- package/dist/memory/embedText.d.ts.map +1 -0
- package/dist/memory/extract.d.ts +33 -18
- package/dist/memory/extract.d.ts.map +1 -1
- package/dist/memory/fold.d.ts +3 -2
- package/dist/memory/fold.d.ts.map +1 -1
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/inject.d.ts.map +1 -1
- package/dist/memory/log.d.ts +15 -4
- package/dist/memory/log.d.ts.map +1 -1
- package/dist/memory/merge.d.ts +18 -1
- package/dist/memory/merge.d.ts.map +1 -1
- package/dist/memory/traverse.d.ts +80 -0
- package/dist/memory/traverse.d.ts.map +1 -0
- package/dist/memory/types.d.ts +53 -7
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/messages/commands.d.ts +84 -0
- package/dist/messages/commands.d.ts.map +1 -0
- package/dist/messages/index.d.ts +46 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/opencodeArtifacts/index.d.ts +33 -0
- package/dist/opencodeArtifacts/index.d.ts.map +1 -0
- package/dist/opencodeArtifacts/orchestratorAgent.d.ts +29 -0
- package/dist/opencodeArtifacts/orchestratorAgent.d.ts.map +1 -0
- package/dist/opencodeArtifacts/slashCommand.d.ts +31 -0
- package/dist/opencodeArtifacts/slashCommand.d.ts.map +1 -0
- package/dist/orchestrator/coordinator.d.ts +152 -1
- package/dist/orchestrator/coordinator.d.ts.map +1 -1
- package/dist/orchestrator/graphCancellation.d.ts +40 -37
- package/dist/orchestrator/graphCancellation.d.ts.map +1 -1
- package/dist/orchestrator/graphEffects.d.ts +24 -24
- package/dist/orchestrator/graphEffects.d.ts.map +1 -1
- package/dist/orchestrator/graphFacade.d.ts +16 -16
- package/dist/orchestrator/graphFacade.d.ts.map +1 -1
- package/dist/orchestrator/graphIngress.d.ts +49 -45
- package/dist/orchestrator/graphIngress.d.ts.map +1 -1
- package/dist/orchestrator/graphReview.d.ts +24 -23
- package/dist/orchestrator/graphReview.d.ts.map +1 -1
- package/dist/orchestrator/graphRuntime.d.ts +27 -26
- package/dist/orchestrator/graphRuntime.d.ts.map +1 -1
- package/dist/orchestrator/graphShadow.d.ts +70 -69
- package/dist/orchestrator/graphShadow.d.ts.map +1 -1
- package/dist/orchestrator/opencodeSessionAdapter.d.ts +25 -25
- package/dist/orchestrator/opencodeSessionAdapter.d.ts.map +1 -1
- package/dist/orchestrator/permissions.d.ts.map +1 -1
- package/dist/orchestrator/ralphLoop.d.ts +57 -0
- package/dist/orchestrator/ralphLoop.d.ts.map +1 -0
- package/dist/orchestrator/roles.d.ts +50 -8
- package/dist/orchestrator/roles.d.ts.map +1 -1
- package/dist/orchestrator/roster.d.ts +103 -0
- package/dist/orchestrator/roster.d.ts.map +1 -0
- package/dist/orchestrator/rosterPersistence.d.ts +22 -0
- package/dist/orchestrator/rosterPersistence.d.ts.map +1 -0
- package/dist/orchestrator/runtimeSelection.d.ts +46 -0
- package/dist/orchestrator/runtimeSelection.d.ts.map +1 -0
- package/dist/orchestrator/sddCompiler.d.ts +34 -34
- package/dist/orchestrator/sddCompiler.d.ts.map +1 -1
- package/dist/orchestrator/sessionReconciler.d.ts +31 -29
- package/dist/orchestrator/sessionReconciler.d.ts.map +1 -1
- package/dist/orchestrator/shadowComparator.d.ts +23 -23
- package/dist/orchestrator/shadowComparator.d.ts.map +1 -1
- package/dist/orchestrator/subsessions.d.ts.map +1 -1
- package/dist/orchestrator/worktreeAdapter.d.ts +12 -12
- package/dist/orchestrator/worktreeAdapter.d.ts.map +1 -1
- package/dist/orchestrator/worktreeDispatch.d.ts +34 -34
- package/dist/orchestrator/worktreeDispatch.d.ts.map +1 -1
- package/dist/orchestrator/worktreeReconciler.d.ts +37 -36
- package/dist/orchestrator/worktreeReconciler.d.ts.map +1 -1
- package/dist/plugin/availability.d.ts.map +1 -1
- package/dist/plugin/capture.d.ts +12 -12
- package/dist/plugin/capture.d.ts.map +1 -1
- package/dist/plugin/commandTool.d.ts +1 -1
- package/dist/plugin/commandTool.d.ts.map +1 -1
- package/dist/plugin/graphShadowIngress.d.ts +50 -48
- package/dist/plugin/graphShadowIngress.d.ts.map +1 -1
- package/dist/plugin/graphTool.d.ts +25 -23
- package/dist/plugin/graphTool.d.ts.map +1 -1
- package/dist/plugin/hooks.d.ts +10 -10
- package/dist/plugin/hooks.d.ts.map +1 -1
- package/dist/plugin/legacyRunProducer.d.ts +22 -22
- package/dist/plugin/legacyRunProducer.d.ts.map +1 -1
- package/dist/plugin/memoryInject.d.ts +6 -6
- package/dist/plugin/memoryInject.d.ts.map +1 -1
- package/dist/plugin/memoryTool.d.ts +36 -0
- package/dist/plugin/memoryTool.d.ts.map +1 -0
- package/dist/plugin/orchestrateTool.d.ts +35 -2
- package/dist/plugin/orchestrateTool.d.ts.map +1 -1
- package/dist/plugin/reportRunSchema.d.ts +8 -8
- package/dist/plugin/reportRunSchema.d.ts.map +1 -1
- package/dist/plugin/sessionTracker.d.ts +15 -15
- package/dist/plugin/sessionTracker.d.ts.map +1 -1
- package/dist/plugin/shadowPipeline.d.ts +2 -1
- package/dist/plugin/shadowPipeline.d.ts.map +1 -1
- package/dist/plugin/soakObserver.d.ts +18 -11
- package/dist/plugin/soakObserver.d.ts.map +1 -1
- package/dist/plugin/toolcalls.d.ts +3 -3
- package/dist/router/chooseModel.d.ts.map +1 -1
- package/dist/router/frontierBaseline.d.ts +3 -3
- package/dist/router/modelSelection.d.ts +12 -4
- package/dist/router/modelSelection.d.ts.map +1 -1
- package/dist/router/types.d.ts +6 -1
- package/dist/router/types.d.ts.map +1 -1
- package/dist/storage/graph/snapshot.d.ts.map +1 -1
- package/dist/storage/graph/soakRecorder.d.ts +14 -1
- package/dist/storage/graph/soakRecorder.d.ts.map +1 -1
- package/dist/storage/graph/workspaceLease.d.ts +1 -1
- package/dist/storage/graph/workspaceLease.d.ts.map +1 -1
- package/dist/storage/graph/worktreeRegistry.d.ts +1 -1
- package/dist/storage/graph/worktreeRegistry.d.ts.map +1 -1
- package/dist/storage/httpStorageProvider.d.ts +2 -2
- package/dist/storage/index/bunSqlite.d.ts +1 -0
- package/dist/storage/index/bunSqlite.d.ts.map +1 -1
- package/dist/storage/index/memoryConsolidate.d.ts +2 -0
- package/dist/storage/index/memoryConsolidate.d.ts.map +1 -1
- package/dist/storage/index/memoryEmbeddings.d.ts +51 -0
- package/dist/storage/index/memoryEmbeddings.d.ts.map +1 -0
- package/dist/storage/index/memoryIndex.d.ts +36 -4
- package/dist/storage/index/memoryIndex.d.ts.map +1 -1
- package/dist/storage/index/memoryRecall.d.ts +1 -1
- package/dist/storage/index/memoryRecall.d.ts.map +1 -1
- package/dist/storage/index/memoryRuntime.d.ts +2 -0
- package/dist/storage/index/memoryRuntime.d.ts.map +1 -1
- package/dist/storage/index/sqliteIndex.d.ts +18 -1
- package/dist/storage/index/sqliteIndex.d.ts.map +1 -1
- package/dist/storage/path.d.ts.map +1 -1
- package/dist/telemetry/aggregate.d.ts +12 -12
- package/dist/telemetry/aggregate.d.ts.map +1 -1
- package/dist/telemetry/cost.d.ts.map +1 -1
- package/dist/telemetry/decisions.d.ts +11 -11
- package/dist/telemetry/decisions.d.ts.map +1 -1
- package/dist/telemetry/eventLog.d.ts +41 -25
- package/dist/telemetry/eventLog.d.ts.map +1 -1
- package/dist/telemetry/events.d.ts +44 -36
- package/dist/telemetry/events.d.ts.map +1 -1
- package/dist/telemetry/fanout.d.ts +18 -0
- package/dist/telemetry/fanout.d.ts.map +1 -0
- package/dist/telemetry/graphProjection.d.ts +12 -12
- package/dist/telemetry/graphProjection.d.ts.map +1 -1
- package/dist/telemetry/graphRuntimeHealth.d.ts +26 -26
- package/dist/telemetry/graphRuntimeHealth.d.ts.map +1 -1
- package/dist/telemetry/graphView.d.ts +20 -20
- package/dist/telemetry/graphView.d.ts.map +1 -1
- package/dist/telemetry/otel.d.ts +86 -0
- package/dist/telemetry/otel.d.ts.map +1 -0
- package/dist/telemetry/otelConfig.d.ts +128 -0
- package/dist/telemetry/otelConfig.d.ts.map +1 -0
- package/dist/telemetry/otelExporter.d.ts +7 -0
- package/dist/telemetry/otelExporter.d.ts.map +1 -0
- package/dist/telemetry/read.d.ts +18 -4
- package/dist/telemetry/read.d.ts.map +1 -1
- package/dist/telemetry/types.d.ts +3 -2
- package/dist/telemetry/types.d.ts.map +1 -1
- package/dist/web/configApi.d.ts +154 -0
- package/dist/web/configApi.d.ts.map +1 -0
- package/dist/web/configRoute.d.ts +57 -0
- package/dist/web/configRoute.d.ts.map +1 -0
- package/dist/web/console.d.ts +8 -0
- package/dist/web/console.d.ts.map +1 -1
- package/dist/web/paths.d.ts +4 -3
- package/dist/web/paths.d.ts.map +1 -1
- package/dist/web/server.d.ts +30 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/start.d.ts +15 -0
- package/dist/web/start.d.ts.map +1 -1
- package/dist/web/storageRoute.d.ts +2 -2
- package/package.json +13 -7
- package/dist/cli/tunnel.d.ts +0 -89
- package/dist/cli/tunnel.d.ts.map +0 -1
- package/dist/commands/orchestratorAgent.d.ts +0 -30
- package/dist/commands/orchestratorAgent.d.ts.map +0 -1
- package/dist/commands/slashCommand.d.ts +0 -39
- package/dist/commands/slashCommand.d.ts.map +0 -1
- package/dist/orchestrator/ledger.d.ts +0 -28
- package/dist/orchestrator/ledger.d.ts.map +0 -1
- package/dist/storage/graph/importLegacy.d.ts +0 -62
- package/dist/storage/graph/importLegacy.d.ts.map +0 -1
- package/dist/storage/graph/migration.d.ts +0 -91
- package/dist/storage/graph/migration.d.ts.map +0 -1
- package/dist/storage/graph/projections.d.ts +0 -31
- package/dist/storage/graph/projections.d.ts.map +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { OpenTeamConfig } from "../config/schema";
|
|
2
|
+
import type { RoutingDecision, TaskSignals } from "../router/types";
|
|
3
|
+
import { type CoordinatorDeps, type RoleTaskResult } from "./coordinator";
|
|
4
|
+
/**
|
|
5
|
+
* W3 ralph loop (#174).
|
|
6
|
+
*
|
|
7
|
+
* Makes the guaranteed `ralph` role a real behaviour rather than an unreachable
|
|
8
|
+
* profile: a bounded iterate-until-done cycle. Each pass dispatches the `ralph`
|
|
9
|
+
* role through the real coordinator ({@link runRoleTask}), so the loop inherits
|
|
10
|
+
* two guarantees for free — the mandatory-local gate (#143), which refuses to run
|
|
11
|
+
* BEFORE the first iteration when no local runtime is reachable and never falls
|
|
12
|
+
* through to a frontier provider, and local-first routing, which keeps every
|
|
13
|
+
* iteration on a local runtime.
|
|
14
|
+
*
|
|
15
|
+
* This module is only loop CONTROL: model/runtime work is the injected coordinator
|
|
16
|
+
* deps, and the done-signal is an injected predicate. Deterministic given its
|
|
17
|
+
* ports — no clock, randomness or direct I/O.
|
|
18
|
+
*/
|
|
19
|
+
/** Canonical roleID of the guaranteed ralph role. */
|
|
20
|
+
export declare const RALPH_ROLE_ID = "ralph";
|
|
21
|
+
/** Default iteration cap so the loop can never spin unbounded. */
|
|
22
|
+
export declare const DEFAULT_RALPH_MAX_ITERATIONS = 10;
|
|
23
|
+
export type RalphLoopInput = {
|
|
24
|
+
readonly task: TaskSignals;
|
|
25
|
+
readonly prompt: string;
|
|
26
|
+
readonly config: OpenTeamConfig;
|
|
27
|
+
readonly parentSessionID?: string;
|
|
28
|
+
/** Iteration cap; defaults to {@link DEFAULT_RALPH_MAX_ITERATIONS}. */
|
|
29
|
+
readonly maxIterations?: number;
|
|
30
|
+
};
|
|
31
|
+
/** Why the loop stopped: the done-signal fired, or the iteration cap was hit. */
|
|
32
|
+
export type RalphLoopTermination = "done" | "cap";
|
|
33
|
+
export type RalphLoopResult = {
|
|
34
|
+
readonly iterations: number;
|
|
35
|
+
readonly termination: RalphLoopTermination;
|
|
36
|
+
readonly decision: RoutingDecision | undefined;
|
|
37
|
+
readonly results: readonly RoleTaskResult[];
|
|
38
|
+
};
|
|
39
|
+
export type RalphLoopDeps = CoordinatorDeps & {
|
|
40
|
+
/**
|
|
41
|
+
* The done-signal predicate (#174). Reads the iteration's subsession result and
|
|
42
|
+
* decides whether the task is finished. Injected so the "fake runtime" that
|
|
43
|
+
* reports done/not-done stays outside the loop control under test.
|
|
44
|
+
*/
|
|
45
|
+
readonly isDone: (result: RoleTaskResult) => boolean;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Runs the ralph loop (#174): dispatches the `ralph` role repeatedly until the
|
|
49
|
+
* injected done-signal fires or the iteration cap is reached.
|
|
50
|
+
*
|
|
51
|
+
* On the first pass, {@link runRoleTask} enforces the mandatory-local gate: when
|
|
52
|
+
* no local runtime is reachable it throws before any dispatch, so the loop fails
|
|
53
|
+
* before the first iteration and no model is contacted — the caller sees the
|
|
54
|
+
* thrown, actionable error.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runRalphLoop(input: RalphLoopInput, deps: RalphLoopDeps): Promise<RalphLoopResult>;
|
|
57
|
+
//# sourceMappingURL=ralphLoop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralphLoop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ralphLoop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,cAAc,EAEpB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;GAcG;AAEH,qDAAqD;AACrD,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,kEAAkE;AAClE,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC;CACtD,CAAC;AAeF;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CA+B1B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { CapabilityRequirement, ComplexityTier } from "../capabilities/types";
|
|
3
|
+
import type { LocalRuntimeId } from "../local/types";
|
|
3
4
|
import type { ModelSelection, TaskSignals } from "../router/types";
|
|
4
5
|
export type AgentRoleProfile = {
|
|
5
6
|
roleID: string;
|
|
@@ -8,9 +9,34 @@ export type AgentRoleProfile = {
|
|
|
8
9
|
minReasoningTier: 1 | 2 | 3 | 4 | 5;
|
|
9
10
|
minCodeQualityTier: 1 | 2 | 3 | 4 | 5;
|
|
10
11
|
needsToolCallingByDefault: boolean;
|
|
11
|
-
preferredLocalModels: ModelSelection[];
|
|
12
12
|
preferredFrontierModels: Array<ModelSelection | "auto">;
|
|
13
13
|
localFirst: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Hard requirement that this role runs on a reachable LOCAL runtime (#143).
|
|
16
|
+
*
|
|
17
|
+
* This is a PROHIBITION, distinct from the `localFirst` PREFERENCE. `localFirst`
|
|
18
|
+
* only tilts routing toward local and still falls through to frontier when no
|
|
19
|
+
* local runtime is reachable (2026-08-26 ruling). `requiresLocalRuntime` refuses
|
|
20
|
+
* the request before dispatch when no local runtime is reachable — it never
|
|
21
|
+
* falls through to a frontier provider. Optional so existing roles keep today's
|
|
22
|
+
* behaviour; only bookkeeping/safety roles (scribe, ralph, guardian) set it `true`.
|
|
23
|
+
*/
|
|
24
|
+
requiresLocalRuntime?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Ordered preference list of LOCAL runtimes this role may draw on (#144).
|
|
27
|
+
*
|
|
28
|
+
* When set, dispatch walks the list in order and picks the FIRST runtime that
|
|
29
|
+
* is reachable; an unreachable runtime is skipped (failover). The chosen
|
|
30
|
+
* runtime is then honoured for the whole task — capacity is enforced on it and
|
|
31
|
+
* excess work queues rather than spilling to a less-preferred runtime. When
|
|
32
|
+
* `requiresLocalRuntime` is also set, the hard requirement is satisfied when
|
|
33
|
+
* ANY listed runtime is reachable; when none is, the role fails closed.
|
|
34
|
+
*
|
|
35
|
+
* Optional so existing roles keep today's behaviour: without a list, the role
|
|
36
|
+
* dispatches to whatever local model routing selected, with capacity enforced
|
|
37
|
+
* on that runtime.
|
|
38
|
+
*/
|
|
39
|
+
localRuntimes?: LocalRuntimeId[];
|
|
14
40
|
};
|
|
15
41
|
export declare const AgentRoleProfileSchema: z.ZodObject<{
|
|
16
42
|
roleID: z.ZodString;
|
|
@@ -24,17 +50,33 @@ export declare const AgentRoleProfileSchema: z.ZodObject<{
|
|
|
24
50
|
minReasoningTier: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>;
|
|
25
51
|
minCodeQualityTier: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>;
|
|
26
52
|
needsToolCallingByDefault: z.ZodBoolean;
|
|
27
|
-
preferredLocalModels: z.ZodArray<z.ZodObject<{
|
|
28
|
-
providerID: z.ZodString;
|
|
29
|
-
modelID: z.ZodString;
|
|
30
|
-
}, z.core.$strip>>;
|
|
31
53
|
preferredFrontierModels: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
32
54
|
providerID: z.ZodString;
|
|
33
55
|
modelID: z.ZodString;
|
|
34
|
-
}, z.core.$
|
|
56
|
+
}, z.core.$strict>, z.ZodLiteral<"auto">]>>;
|
|
35
57
|
localFirst: z.ZodBoolean;
|
|
36
|
-
|
|
58
|
+
requiresLocalRuntime: z.ZodOptional<z.ZodBoolean>;
|
|
59
|
+
localRuntimes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
60
|
+
"foundry-local": "foundry-local";
|
|
61
|
+
lemonade: "lemonade";
|
|
62
|
+
lmstudio: "lmstudio";
|
|
63
|
+
ollama: "ollama";
|
|
64
|
+
}>>>;
|
|
65
|
+
}, z.core.$strict>;
|
|
37
66
|
export declare const TEAM_ROLES: Record<string, AgentRoleProfile>;
|
|
38
|
-
export declare function getRoleProfile(roleID: string): AgentRoleProfile | undefined;
|
|
67
|
+
export declare function getRoleProfile(roleID: string, configuredRoles?: Readonly<Record<string, AgentRoleProfile>>): AgentRoleProfile | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Synthesises a neutral, frontier-eligible fallback profile for a roleID that
|
|
70
|
+
* is not present in TEAM_ROLES. The roleID is passed through verbatim so the
|
|
71
|
+
* orchestrator dispatches the correct agent name to opencode, producing an
|
|
72
|
+
* accurate error ("agent Galadriel not found") rather than a misleading one
|
|
73
|
+
* ("agent scribe not found") when the agent does not exist in the workspace.
|
|
74
|
+
*
|
|
75
|
+
* Profile values mirror the majority of the team (yen/basher/reviewer):
|
|
76
|
+
* moderate tier with frontier escalation enabled and local-first routing, so
|
|
77
|
+
* the core local-first promise is preserved while unknown roles are never
|
|
78
|
+
* silently starved of frontier access.
|
|
79
|
+
*/
|
|
80
|
+
export declare function synthesiseFallbackProfile(roleID: string): AgentRoleProfile;
|
|
39
81
|
export declare function roleToRequirement(role: AgentRoleProfile, task: TaskSignals, tier?: ComplexityTier): CapabilityRequirement;
|
|
40
82
|
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/orchestrator/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,cAAc,CAAC;IAC5B,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,yBAAyB,EAAE,OAAO,CAAC;IACnC,
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/orchestrator/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,cAAc,CAAC;IAC5B,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,yBAAyB,EAAE,OAAO,CAAC;IACnC,uBAAuB,EAAE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;CAClC,CAAC;AAiBF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;kBAkBxB,CAAC;AAGZ,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA8FvD,CAAC;AAEF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,GAC3D,gBAAgB,GAAG,SAAS,CAE9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAW1E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,qBAAqB,CAevB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* W3 roster model (#171, #172).
|
|
4
|
+
*
|
|
5
|
+
* The roster is a STRUCTURED artifact, never free LLM prose: a chosen `universe`
|
|
6
|
+
* plus a list of `roleID` → `agentName` entries. The split (decision P6(a)) keeps
|
|
7
|
+
* routing keyed to the stable `roleID` (which resolves to a capability profile via
|
|
8
|
+
* {@link getRoleProfile}) while the themed `agentName` is only the dispatch alias
|
|
9
|
+
* opencode sees. Validating the artifact with Zod removes the silent-no-op failure
|
|
10
|
+
* class of a prose parser.
|
|
11
|
+
*
|
|
12
|
+
* This module is pure: no I/O, clock, or randomness. Generation takes an injected
|
|
13
|
+
* {@link RosterSource} port so the model call stays outside the decision core, and
|
|
14
|
+
* persistence lives in `rosterPersistence.ts`.
|
|
15
|
+
*/
|
|
16
|
+
/** One cast member: a stable routing `roleID` bound to a themed dispatch alias. */
|
|
17
|
+
export declare const RosterEntrySchema: z.ZodObject<{
|
|
18
|
+
roleID: z.ZodString;
|
|
19
|
+
agentName: z.ZodString;
|
|
20
|
+
}, z.core.$strict>;
|
|
21
|
+
/** A structured roster: one universe shared by every entry. */
|
|
22
|
+
export declare const RosterSchema: z.ZodObject<{
|
|
23
|
+
universe: z.ZodString;
|
|
24
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
25
|
+
roleID: z.ZodString;
|
|
26
|
+
agentName: z.ZodString;
|
|
27
|
+
}, z.core.$strict>>;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
export type RosterEntry = z.infer<typeof RosterEntrySchema>;
|
|
30
|
+
export type Roster = z.infer<typeof RosterSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* The four roles every roster must contain (#171). `orchestrator` is the primary
|
|
33
|
+
* agent itself and has no TEAM_ROLES profile; `guardian`/`scribe`/`ralph` are the
|
|
34
|
+
* bookkeeping/safety roles that carry `requiresLocalRuntime`. Security review,
|
|
35
|
+
* decision capture and the ralph loop can never be silently omitted from a team.
|
|
36
|
+
*/
|
|
37
|
+
export declare const GUARANTEED_ROLE_IDS: readonly ["orchestrator", "guardian", "scribe", "ralph"];
|
|
38
|
+
export type GuaranteedRoleID = (typeof GUARANTEED_ROLE_IDS)[number];
|
|
39
|
+
/** Guaranteed roleIDs absent from a roster, in canonical order. */
|
|
40
|
+
export declare function missingGuaranteedRoles(roster: Roster): GuaranteedRoleID[];
|
|
41
|
+
/** Whether every guaranteed roleID is present in the roster. */
|
|
42
|
+
export declare function hasAllGuaranteedRoles(roster: Roster): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Enforces the guaranteed-role invariant (#171): re-adds any missing guaranteed
|
|
45
|
+
* role, binding its `agentName` to the canonical roleID so it dispatches to the
|
|
46
|
+
* standard agent. Returns the roster unchanged when nothing is missing. Pure.
|
|
47
|
+
*/
|
|
48
|
+
export declare function enforceGuaranteedRoles(roster: Roster): Roster;
|
|
49
|
+
/** Draft roster a generator source emits before Zod validation. */
|
|
50
|
+
export type RosterDraft = {
|
|
51
|
+
universe: string;
|
|
52
|
+
entries: Array<{
|
|
53
|
+
roleID: string;
|
|
54
|
+
agentName: string;
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Injected generation port (#172). Turns an initial prompt into a draft roster.
|
|
59
|
+
* In production this wraps a model call; tests pass a deterministic fake, so the
|
|
60
|
+
* generator's decision core never contacts a live LLM.
|
|
61
|
+
*/
|
|
62
|
+
export type RosterSource = (prompt: string) => RosterDraft | Promise<RosterDraft>;
|
|
63
|
+
/**
|
|
64
|
+
* Generates a roster from the initial prompt (#172): runs the injected source,
|
|
65
|
+
* validates the draft with Zod (fail-closed on a malformed roster), then enforces
|
|
66
|
+
* the guaranteed roles (#171). The result is always a valid, guaranteed roster.
|
|
67
|
+
*/
|
|
68
|
+
export declare function generateRoster(prompt: string, source: RosterSource): Promise<Roster>;
|
|
69
|
+
/**
|
|
70
|
+
* The dispatch target for a roleID: the themed `agentName` opencode dispatches to.
|
|
71
|
+
* `undefined` when the roleID is not in the roster. This is the roleID/agentName
|
|
72
|
+
* split at the dispatch boundary — routing uses the roleID, opencode uses this.
|
|
73
|
+
*/
|
|
74
|
+
export declare function rosterDispatchTarget(roster: Roster, roleID: string): string | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Resolves the universe an entry belongs to (#172). The universe is recorded ONCE
|
|
77
|
+
* for the whole roster, so every entry shares the single roster universe; this
|
|
78
|
+
* throws if the entry is not part of the roster, so the invariant is checked, not
|
|
79
|
+
* assumed. Pure.
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveEntryUniverse(roster: Roster, entry: RosterEntry): string;
|
|
82
|
+
/**
|
|
83
|
+
* Actionable, English failure for a guaranteed role whose agent file was never
|
|
84
|
+
* written (#153, Defect B). `openteam setup` currently writes only the primary
|
|
85
|
+
* agent, so `scribe`/`ralph`/`guardian` have no agent file to dispatch to. Names
|
|
86
|
+
* the missing agent and points at `openteam setup` rather than surfacing an opaque
|
|
87
|
+
* "agent not found" from opencode.
|
|
88
|
+
*/
|
|
89
|
+
export declare function missingAgentFileMessage(agentName: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* Fails closed BEFORE dispatch when a guaranteed role's agent file is absent
|
|
92
|
+
* (#153, Defect B). `agentFileExists` is an injected I/O port — the filesystem
|
|
93
|
+
* probe lives at the composition root, so this stays pure of I/O.
|
|
94
|
+
*/
|
|
95
|
+
export declare function assertAgentFileForRole(agentName: string, agentFileExists: (agentName: string) => boolean | Promise<boolean>): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Dispatches a guaranteed role only after asserting its agent file exists (#153).
|
|
98
|
+
* The agent-file guard runs BEFORE the `dispatch` callback, so a missing file
|
|
99
|
+
* surfaces the actionable error without ever contacting a model. `dispatch` is the
|
|
100
|
+
* real coordinator call the caller supplies.
|
|
101
|
+
*/
|
|
102
|
+
export declare function dispatchGuaranteedRole<T>(agentName: string, agentFileExists: (agentName: string) => boolean | Promise<boolean>, dispatch: () => Promise<T>): Promise<T>;
|
|
103
|
+
//# sourceMappingURL=roster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../src/orchestrator/roster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;GAaG;AAEH,mFAAmF;AACnF,eAAO,MAAM,iBAAiB;;;kBAKnB,CAAC;AAEZ,+DAA+D;AAC/D,eAAO,MAAM,YAAY;;;;;;kBAKd,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,YAC9B,cAAc,EACd,UAAU,EACV,QAAQ,EACR,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAGzE;AAED,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,MAAM,KACX,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAExC;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,GACjB,MAAM,CAOR;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GACjE,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAClE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC,CAGZ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { StorageProvider } from "../storage/provider";
|
|
2
|
+
import { type Roster } from "./roster";
|
|
3
|
+
/** Serialises a roster to the Markdown-with-JSON roster document. Pure. */
|
|
4
|
+
export declare function serializeRoster(roster: Roster): string;
|
|
5
|
+
/** Parses a roster document back into a validated {@link Roster}. Pure. */
|
|
6
|
+
export declare function parseRoster(text: string): Roster;
|
|
7
|
+
/** Writes the roster to the portable path; returns the path written. */
|
|
8
|
+
export declare function persistRoster(storage: StorageProvider, roster: Roster, path?: string): Promise<string>;
|
|
9
|
+
/** Loads and parses the persisted roster; `undefined` when none exists. */
|
|
10
|
+
export declare function loadRoster(storage: StorageProvider, path?: string): Promise<Roster | undefined>;
|
|
11
|
+
/** Outcome of {@link loadOrGenerateRoster}: the roster and whether it was rebuilt. */
|
|
12
|
+
export type RosterLoadResult = {
|
|
13
|
+
readonly roster: Roster;
|
|
14
|
+
readonly regenerated: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Reuses the persisted cast when present, generating and persisting one only when
|
|
18
|
+
* absent (#173). A second session with a roster on disk therefore never triggers
|
|
19
|
+
* re-generation — the cast stays stable across sessions.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadOrGenerateRoster(storage: StorageProvider, generate: () => Roster | Promise<Roster>, path?: string): Promise<RosterLoadResult>;
|
|
22
|
+
//# sourceMappingURL=rosterPersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rosterPersistence.d.ts","sourceRoot":"","sources":["../../src/orchestrator/rosterPersistence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,UAAU,CAAC;AAmBrD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAchD;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAA6B,GAClC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,2EAA2E;AAC3E,wBAAsB,UAAU,CAC9B,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,MAA6B,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM7B;AAED,sFAAsF;AACtF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EACxC,IAAI,GAAE,MAA6B,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAQ3B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { OpenTeamConfig } from "../config/schema";
|
|
2
|
+
import type { LocalRuntimeId } from "../local/types";
|
|
3
|
+
import type { ModelSelection, RoutingDecision } from "../router/types";
|
|
4
|
+
import type { AgentRoleProfile } from "./roles";
|
|
5
|
+
/**
|
|
6
|
+
* Result of resolving which local runtime a role's task dispatches to (#144).
|
|
7
|
+
*
|
|
8
|
+
* `runtimeId` is the runtime the task is PINNED to for its whole duration —
|
|
9
|
+
* capacity is enforced on it and it never changes once chosen. It is `undefined`
|
|
10
|
+
* when the dispatch is not to a configured local runtime (a frontier route, or a
|
|
11
|
+
* local model that maps to no configured runtime), in which case no per-runtime
|
|
12
|
+
* cap applies. `decision` is the routing decision to record and dispatch, with
|
|
13
|
+
* `selected` overridden to the chosen runtime's model when a preference list
|
|
14
|
+
* redirected the task.
|
|
15
|
+
*/
|
|
16
|
+
export type RuntimeDispatchSelection = {
|
|
17
|
+
readonly runtimeId: LocalRuntimeId | undefined;
|
|
18
|
+
readonly decision: RoutingDecision;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Maps a selected local model back to the configured runtime that serves it, by
|
|
22
|
+
* matching the model against each runtime's `defaultModel`. Returns `undefined`
|
|
23
|
+
* when no configured runtime serves the model (e.g. a bare `router.localDefault`
|
|
24
|
+
* with no matching runtime entry, or a frontier model). Pure.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runtimeIdOfModel(model: ModelSelection, config: OpenTeamConfig): LocalRuntimeId | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Resolves the local runtime a role's task dispatches to, honouring an ordered
|
|
29
|
+
* preference list when the role declares one (#144). Pure and deterministic: no
|
|
30
|
+
* I/O, clock, or randomness — reachability arrives as data in `reachable`.
|
|
31
|
+
*
|
|
32
|
+
* Rules:
|
|
33
|
+
* - A non-local route (frontier/blocked) is returned unchanged with no runtime
|
|
34
|
+
* pin — per-runtime caps apply only to local dispatch.
|
|
35
|
+
* - When the role lists runtimes and a reachable set is provided, the FIRST
|
|
36
|
+
* listed runtime that is both reachable AND configured wins; the decision's
|
|
37
|
+
* model is overridden to that runtime's `defaultModel` so the task actually
|
|
38
|
+
* runs on the chosen runtime (failover + pinning). An unreachable runtime is
|
|
39
|
+
* skipped; capacity is NOT a selection input, so a saturated-but-reachable
|
|
40
|
+
* runtime is still chosen and its excess work queues rather than spilling.
|
|
41
|
+
* - Without a usable list (no list, no reachable set, or none of the listed
|
|
42
|
+
* runtimes reachable/configured) the router's own local pick stands and its
|
|
43
|
+
* runtime is resolved via `runtimeIdOfModel` so capacity is still enforced.
|
|
44
|
+
*/
|
|
45
|
+
export declare function selectDispatchRuntime(role: AgentRoleProfile, decision: RoutingDecision, reachable: ReadonlySet<LocalRuntimeId> | undefined, config: OpenTeamConfig): RuntimeDispatchSelection;
|
|
46
|
+
//# sourceMappingURL=runtimeSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeSelection.d.ts","sourceRoot":"","sources":["../../src/orchestrator/runtimeSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,SAAS,CAI5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,SAAS,EAClD,MAAM,EAAE,cAAc,GACrB,wBAAwB,CA2B1B"}
|
|
@@ -1,72 +1,72 @@
|
|
|
1
1
|
import { type GraphSpecV1 } from "../graph/schema";
|
|
2
2
|
import type { TaskSignals } from "../router/types";
|
|
3
|
-
/**
|
|
3
|
+
/** Default reviewer role for SDD → graph compilation. */
|
|
4
4
|
export declare const DEFAULT_REVIEWER_ROLE_ID = "reviewer";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Input descriptor for the SDD → graph compiler.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* It is the contract consumed by `compileSddTask` and the active ingress
|
|
9
|
+
* (`graphIngress.ts`): it identifies the task, its roles, and its actionable
|
|
10
|
+
* brief, plus the routing signals. The brief is never persisted raw; the
|
|
11
|
+
* compiler anchors it by digest (`assertReferenceOnly` rejects any raw field).
|
|
12
12
|
*/
|
|
13
13
|
export type SddTask = {
|
|
14
|
-
/**
|
|
14
|
+
/** Stable id with no `:` (kebab-case) used for anchors and nodes. */
|
|
15
15
|
id: string;
|
|
16
|
-
/**
|
|
16
|
+
/** Role that implements (and fixes) the task. */
|
|
17
17
|
implementerRoleID: string;
|
|
18
|
-
/**
|
|
18
|
+
/** Short human-readable title. */
|
|
19
19
|
title: string;
|
|
20
|
-
/**
|
|
20
|
+
/** Actionable task brief (body of the implementer's prompt). */
|
|
21
21
|
brief: string;
|
|
22
|
-
/**
|
|
22
|
+
/** Routing signals for the task. */
|
|
23
23
|
task: TaskSignals;
|
|
24
|
-
/**
|
|
24
|
+
/** Specific reviewer role (overrides the default reviewer). */
|
|
25
25
|
reviewerRoleID?: string;
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* **Pure** compiler from a legacy SDD task to a static `GraphSpecV1`
|
|
29
29
|
* (GE-041).
|
|
30
30
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
31
|
+
* The implement → review → revise → re-review chain expands to a versioned
|
|
32
|
+
* acyclic DAG: an initial `implementer` node, its `reviewer`, and for each
|
|
33
|
+
* review round a new `implementer` (revise) with its `reviewer` (re-review).
|
|
34
|
+
* The resulting spec:
|
|
35
35
|
*
|
|
36
|
-
* -
|
|
37
|
-
* (taskID + digest),
|
|
38
|
-
* -
|
|
36
|
+
* - is **reference-only**: nodes carry only ids, roles, and an `anchor`
|
|
37
|
+
* (taskID + digest), never the raw brief;
|
|
38
|
+
* - is **deterministic**: the same task produces the same spec and the same
|
|
39
39
|
* digest (`graphSpecDigest`);
|
|
40
|
-
* - **
|
|
41
|
-
*
|
|
40
|
+
* - **fails before dispatch** on an invalid role, an author who also reviews,
|
|
41
|
+
* or a task id that is not a valid `NodeID`.
|
|
42
42
|
*
|
|
43
|
-
*
|
|
43
|
+
* Without I/O, clock, or random: only digest computation and structural validation.
|
|
44
44
|
*/
|
|
45
|
-
/**
|
|
45
|
+
/** Compilation failure code (fails before any dispatch). */
|
|
46
46
|
export type SddCompileErrorCode = "invalid-role" | "author-is-reviewer" | "invalid-spec";
|
|
47
|
-
/**
|
|
47
|
+
/** Typed error for a rejected compilation. */
|
|
48
48
|
export declare class SddCompileError extends Error {
|
|
49
49
|
readonly code: SddCompileErrorCode;
|
|
50
50
|
readonly detail: string;
|
|
51
51
|
constructor(code: SddCompileErrorCode, detail: string);
|
|
52
52
|
}
|
|
53
|
-
/**
|
|
53
|
+
/** Compilation options. */
|
|
54
54
|
export type SddCompileOptions = {
|
|
55
|
-
/**
|
|
55
|
+
/** Reviewer role (default: the task's or `reviewer`). */
|
|
56
56
|
reviewerRoleID?: string;
|
|
57
|
-
/**
|
|
57
|
+
/** revise/re-review review rounds to expand (default: 1). */
|
|
58
58
|
revisionRounds?: number;
|
|
59
59
|
};
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
* Canonical digest of the spec. Re-exported from `graph/ids` to avoid breaking
|
|
62
|
+
* compiler consumers; the implementation lives in the graph layer because the
|
|
63
|
+
* shadow mirror needs it without reaching this module.
|
|
64
64
|
*/
|
|
65
65
|
export { graphSpecDigest } from "../graph/ids";
|
|
66
66
|
/**
|
|
67
|
-
*
|
|
68
|
-
* `SddCompileError`
|
|
69
|
-
*
|
|
67
|
+
* Compiles a legacy SDD task to a validated `GraphSpecV1`. Throws
|
|
68
|
+
* `SddCompileError` for invalid role/author/spec, always **before** any
|
|
69
|
+
* dispatch.
|
|
70
70
|
*/
|
|
71
71
|
export declare function compileSddTask(task: SddTask, options?: SddCompileOptions): GraphSpecV1;
|
|
72
72
|
//# sourceMappingURL=sddCompiler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sddCompiler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sddCompiler.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,
|
|
1
|
+
{"version":3,"file":"sddCompiler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sddCompiler.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AAEH,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,oBAAoB,GACpB,cAAc,CAAC;AAEnB,8CAA8C;AAC9C,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAKpD;CACF;AAED,2BAA2B;AAC3B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAwBF;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,iBAAsB,GAC9B,WAAW,CA0Db"}
|
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
import type { NodeStatus } from "../graph/types";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Reconciler for create/prompt crash windows (GE-032).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* After a failure halfway through creating the child sub-session or dispatching
|
|
6
|
+
* the prompt, the runtime does not know whether the effect started. This module
|
|
7
|
+
* classifies the window using the **correlated child session** from opencode and
|
|
8
|
+
* decides without retrying blindly:
|
|
9
9
|
*
|
|
10
|
-
* - `not-started`: no
|
|
11
|
-
* - `active`:
|
|
12
|
-
*
|
|
13
|
-
* - `
|
|
14
|
-
* **
|
|
10
|
+
* - `not-started`: there is no correlated child; the effect can be dispatched.
|
|
11
|
+
* - `active`: exactly one correlated child exists and is still in progress; it
|
|
12
|
+
* is **adopted**.
|
|
13
|
+
* - `completed`: exactly one correlated child exists and has finished; it is
|
|
14
|
+
* **adopted**.
|
|
15
|
+
* - `unknown`: the evidence is ambiguous (multiple correlated children); the
|
|
16
|
+
* blind retry is **blocked** and safe reconciliation is required.
|
|
15
17
|
*
|
|
16
|
-
*
|
|
17
|
-
* **no-op
|
|
18
|
-
* runtime
|
|
18
|
+
* A node with a receipt already written (terminal) makes reconciliation an
|
|
19
|
+
* **idempotent no-op**. Pure and deterministic: no I/O, clock, or random; the
|
|
20
|
+
* runtime passes it the already observed evidence through injected ports.
|
|
19
21
|
*/
|
|
20
|
-
/**
|
|
22
|
+
/** Classification of an effect's crash window. */
|
|
21
23
|
export type CrashWindowClass = "not-started" | "active" | "completed" | "unknown";
|
|
22
|
-
/**
|
|
24
|
+
/** Reconciliation decision derived from the window. */
|
|
23
25
|
export type ReconcileDecision = "dispatch" | "adopt" | "block" | "noop";
|
|
24
|
-
/**
|
|
26
|
+
/** Observed state of an opencode child session. */
|
|
25
27
|
export type ObservedChildState = "active" | "completed";
|
|
26
|
-
/**
|
|
28
|
+
/** Observed child session with its correlation title and state. */
|
|
27
29
|
export type ObservedChild = {
|
|
28
30
|
readonly sessionID: string;
|
|
29
31
|
readonly title: string;
|
|
30
32
|
readonly state: ObservedChildState;
|
|
31
33
|
};
|
|
32
|
-
/**
|
|
34
|
+
/** Correlated evidence about the child of a concrete attempt. */
|
|
33
35
|
export type ChildObservation = {
|
|
34
36
|
readonly kind: "none";
|
|
35
37
|
} | {
|
|
@@ -42,33 +44,33 @@ export type ChildObservation = {
|
|
|
42
44
|
readonly kind: "ambiguous";
|
|
43
45
|
readonly detail: string;
|
|
44
46
|
};
|
|
45
|
-
/**
|
|
47
|
+
/** Input for reconciling a node. */
|
|
46
48
|
export type ReconcileInput = {
|
|
47
49
|
readonly nodeStatus: NodeStatus;
|
|
48
50
|
readonly observation: ChildObservation;
|
|
49
51
|
};
|
|
50
|
-
/**
|
|
52
|
+
/** Reconciliation result: window, decision, and adopted child if applicable. */
|
|
51
53
|
export type ReconcileResult = {
|
|
52
54
|
readonly window: CrashWindowClass;
|
|
53
55
|
readonly decision: ReconcileDecision;
|
|
54
56
|
readonly sessionID?: string;
|
|
55
57
|
};
|
|
56
58
|
/**
|
|
57
|
-
*
|
|
58
|
-
* attempt)`.
|
|
59
|
-
*
|
|
59
|
+
* Deterministic correlation title of the child for attempt `(runID, op,
|
|
60
|
+
* attempt)`. The runtime sets it as the sub-session title when creating it, so
|
|
61
|
+
* that a restart can find exactly the same child again.
|
|
60
62
|
*/
|
|
61
63
|
export declare function correlationTitle(runID: string, operationID: string, attemptID: string): string;
|
|
62
64
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
65
|
+
* Reduces the observed children to the correlated evidence for the attempt.
|
|
66
|
+
* Zero matches is `none`; exactly one determines `active`/`completed`; more
|
|
67
|
+
* than one is `ambiguous` (a single one cannot be adopted safely).
|
|
66
68
|
*/
|
|
67
69
|
export declare function observeChild(expectedTitle: string, children: readonly ObservedChild[]): ChildObservation;
|
|
68
70
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
71
|
+
* Classifies a node's crash window and decides the safe action. A terminal node
|
|
72
|
+
* (receipt already written) is an idempotent no-op; a `pending` node has not
|
|
73
|
+
* started; a `running` node is classified by the correlated evidence.
|
|
72
74
|
*/
|
|
73
75
|
export declare function reconcileSession(input: ReconcileInput): ReconcileResult;
|
|
74
76
|
//# sourceMappingURL=sessionReconciler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionReconciler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sessionReconciler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD
|
|
1
|
+
{"version":3,"file":"sessionReconciler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sessionReconciler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEd,uDAAuD;AACvD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAExE,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAExD,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;CACpC,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,oCAAoC;AACpC,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;CACxC,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC,gBAAgB,CAelB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAiCvE"}
|