agentic-engineering-harness 0.4.16 → 0.6.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 (104) hide show
  1. package/README.md +159 -189
  2. package/dist/agents/config.js +2 -0
  3. package/dist/agents/config.js.map +1 -1
  4. package/dist/agents/outputContracts.d.ts +1 -0
  5. package/dist/agents/outputContracts.js +12 -0
  6. package/dist/agents/outputContracts.js.map +1 -1
  7. package/dist/agents/parallelism.d.ts +1 -0
  8. package/dist/agents/parallelism.js +101 -14
  9. package/dist/agents/parallelism.js.map +1 -1
  10. package/dist/agents/structuredOutput.js +16 -4
  11. package/dist/agents/structuredOutput.js.map +1 -1
  12. package/dist/agents/waveExecutor.d.ts +41 -0
  13. package/dist/agents/waveExecutor.js +208 -0
  14. package/dist/agents/waveExecutor.js.map +1 -0
  15. package/dist/audit/intent.d.ts +20 -0
  16. package/dist/audit/intent.js +42 -0
  17. package/dist/audit/intent.js.map +1 -0
  18. package/dist/audit/run.d.ts +46 -0
  19. package/dist/audit/run.js +147 -0
  20. package/dist/audit/run.js.map +1 -0
  21. package/dist/cli.js +1 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/core/config.js +28 -7
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/controlPlane.d.ts +30 -0
  26. package/dist/core/controlPlane.js +131 -0
  27. package/dist/core/controlPlane.js.map +1 -0
  28. package/dist/core/init.js +13 -5
  29. package/dist/core/init.js.map +1 -1
  30. package/dist/core/run.d.ts +21 -0
  31. package/dist/core/run.js +104 -41
  32. package/dist/core/run.js.map +1 -1
  33. package/dist/core/types.d.ts +103 -1
  34. package/dist/distributed/queue.d.ts +11 -0
  35. package/dist/distributed/queue.js +140 -0
  36. package/dist/distributed/queue.js.map +1 -0
  37. package/dist/distributed/types.d.ts +34 -0
  38. package/dist/distributed/types.js +2 -0
  39. package/dist/distributed/types.js.map +1 -0
  40. package/dist/distributed/worker.d.ts +21 -0
  41. package/dist/distributed/worker.js +111 -0
  42. package/dist/distributed/worker.js.map +1 -0
  43. package/dist/entry.js +219 -46
  44. package/dist/entry.js.map +1 -1
  45. package/dist/evals/runner.js +2 -2
  46. package/dist/evals/runner.js.map +1 -1
  47. package/dist/evals/statistics.d.ts +38 -0
  48. package/dist/evals/statistics.js +88 -0
  49. package/dist/evals/statistics.js.map +1 -0
  50. package/dist/evidence/graph.d.ts +48 -0
  51. package/dist/evidence/graph.js +94 -0
  52. package/dist/evidence/graph.js.map +1 -0
  53. package/dist/issues/intake.d.ts +1 -1
  54. package/dist/mcp/benchmark.d.ts +24 -0
  55. package/dist/mcp/benchmark.js +82 -0
  56. package/dist/mcp/benchmark.js.map +1 -0
  57. package/dist/paseo/capabilities.d.ts +24 -0
  58. package/dist/paseo/capabilities.js +104 -0
  59. package/dist/paseo/capabilities.js.map +1 -0
  60. package/dist/paseo/context.d.ts +45 -0
  61. package/dist/paseo/context.js +153 -0
  62. package/dist/paseo/context.js.map +1 -0
  63. package/dist/paseo/start.d.ts +55 -0
  64. package/dist/paseo/start.js +138 -0
  65. package/dist/paseo/start.js.map +1 -0
  66. package/dist/policy/bundles.d.ts +27 -0
  67. package/dist/policy/bundles.js +129 -0
  68. package/dist/policy/bundles.js.map +1 -0
  69. package/dist/security/sandbox.d.ts +12 -0
  70. package/dist/security/sandbox.js +64 -0
  71. package/dist/security/sandbox.js.map +1 -0
  72. package/dist/spec/openspec.d.ts +28 -0
  73. package/dist/spec/openspec.js +179 -0
  74. package/dist/spec/openspec.js.map +1 -0
  75. package/dist/toolchain/resolve.js +54 -90
  76. package/dist/toolchain/resolve.js.map +1 -1
  77. package/dist/utils/process.d.ts +1 -0
  78. package/dist/utils/process.js +6 -1
  79. package/dist/utils/process.js.map +1 -1
  80. package/dist/validators/graphify.js +28 -6
  81. package/dist/validators/graphify.js.map +1 -1
  82. package/dist/workers/agentPrompt.d.ts +6 -1
  83. package/dist/workers/agentPrompt.js +118 -34
  84. package/dist/workers/agentPrompt.js.map +1 -1
  85. package/dist/workers/paseo.js +53 -19
  86. package/dist/workers/paseo.js.map +1 -1
  87. package/dist/workers/podman.js +30 -8
  88. package/dist/workers/podman.js.map +1 -1
  89. package/docs/PASEO.md +56 -4
  90. package/docs/V0.5.1.md +129 -0
  91. package/docs/V0.5.2.md +180 -0
  92. package/docs/V0.5.md +116 -0
  93. package/docs/V0.6.md +148 -0
  94. package/package.json +3 -3
  95. package/presets/agents/orchestration.jsonc +37 -0
  96. package/schemas/project.schema.json +38 -8
  97. package/skills/engineering-workflow/SKILL.md +113 -81
  98. package/skills/openspec-authoring/SKILL.md +26 -0
  99. package/skills/paseo-orchestration/SKILL.md +38 -0
  100. package/templates/AGENTS.md +40 -15
  101. package/templates/agents.source.jsonc +1 -1
  102. package/templates/openspec-config.yaml +24 -0
  103. package/templates/project.yaml +79 -1
  104. package/templates/toolchain.yaml +19 -2
@@ -0,0 +1,94 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { minimatch } from "minimatch";
5
+ export async function buildRequirementEvidenceGraph(input) {
6
+ const stateRoot = path.resolve(input.stateRoot ?? input.root);
7
+ const runId = `run:${input.contract.task.id}`;
8
+ const nodes = new Map();
9
+ const edges = [];
10
+ addNode(nodes, { id: runId, type: "run", label: input.contract.task.title, data: { mode: input.contract.mode ?? "spec", status: input.report.status } });
11
+ const requirements = normalizedRequirements(input.contract);
12
+ const planTasks = input.plan?.tasks?.length ? input.plan.tasks : [{ id: input.contract.task.id, summary: input.contract.task.title, agent: input.contract.routing?.agent ?? "implementation-worker", scope: input.contract.scope?.allowed ?? ["**"], dependencies: [], acceptance: requirements.map((item) => item.id), risk: input.contract.routing?.risk ?? "low" }];
13
+ for (const requirement of requirements) {
14
+ const id = `req:${requirement.id}`;
15
+ addNode(nodes, { id, type: "requirement", label: requirement.description || requirement.id });
16
+ addEdge(edges, runId, id, "contains");
17
+ }
18
+ for (const task of planTasks) {
19
+ const id = `task:${task.id}`;
20
+ addNode(nodes, { id, type: "task", label: task.summary, data: { agent: task.agent, scope: task.scope, dependencies: task.dependencies } });
21
+ addEdge(edges, runId, id, "contains");
22
+ for (const req of task.acceptance)
23
+ if (requirements.some((item) => item.id === req))
24
+ addEdge(edges, `req:${req}`, id, "implemented-by");
25
+ }
26
+ for (const file of input.report.changedFiles) {
27
+ const id = `file:${file}`;
28
+ addNode(nodes, { id, type: "file", label: file });
29
+ addEdge(edges, runId, id, "contains");
30
+ for (const task of planTasks)
31
+ if (task.scope.some((scope) => matches(file, scope)))
32
+ addEdge(edges, `task:${task.id}`, id, "changed");
33
+ }
34
+ for (const check of input.report.checks) {
35
+ const id = `check:${check.id}`;
36
+ addNode(nodes, { id, type: "check", label: check.id, data: { category: check.category, status: check.status, message: check.message } });
37
+ addEdge(edges, runId, id, "contains");
38
+ for (const requirement of requirements)
39
+ if (requirement.validators.includes(check.id))
40
+ addEdge(edges, `req:${requirement.id}`, id, "validated-by");
41
+ }
42
+ for (const [index, finding] of (input.findings ?? []).entries()) {
43
+ const id = `finding:${finding.id || index}`;
44
+ addNode(nodes, { id, type: "finding", label: finding.id, data: { severity: finding.severity, category: finding.category, evidence: finding.evidence } });
45
+ addEdge(edges, runId, id, "contains");
46
+ const fileId = `file:${finding.location.file}`;
47
+ if (!nodes.has(fileId))
48
+ addNode(nodes, { id: fileId, type: "file", label: finding.location.file });
49
+ addEdge(edges, id, fileId, "located-in");
50
+ }
51
+ for (const [index, session] of (input.sessions ?? []).entries()) {
52
+ const id = `session:${session.id ?? `${session.logicalAgent ?? session.provider}-${index}`}`;
53
+ addNode(nodes, { id, type: "agent-session", label: session.logicalAgent ?? session.provider, data: { runtime: session.runtime, model: session.model, exitCode: session.exitCode } });
54
+ addEdge(edges, runId, id, "produced");
55
+ }
56
+ if (input.delivery?.commitSha) {
57
+ const id = `commit:${input.delivery.commitSha}`;
58
+ addNode(nodes, { id, type: "commit", label: input.delivery.commitSha });
59
+ addEdge(edges, runId, id, "finalized-as");
60
+ }
61
+ if (input.delivery?.pullRequest?.number) {
62
+ const id = `pr:${input.delivery.pullRequest.number}`;
63
+ addNode(nodes, { id, type: "pull-request", label: `PR #${input.delivery.pullRequest.number}`, data: { url: input.delivery.pullRequest.url } });
64
+ addEdge(edges, runId, id, "delivered-by");
65
+ if (input.delivery.commitSha)
66
+ addEdge(edges, `commit:${input.delivery.commitSha}`, id, "delivered-by");
67
+ }
68
+ const coverage = requirements.map((requirement) => coverageFor(requirement, nodes, edges));
69
+ const reasons = [];
70
+ for (const item of coverage) {
71
+ if (!item.implementation)
72
+ reasons.push(`${item.requirementId} has no changed implementation evidence.`);
73
+ if (!item.validation)
74
+ reasons.push(`${item.requirementId} lacks PASS evidence for: ${item.missingValidators.join(", ") || "a declared validator"}.`);
75
+ }
76
+ const payload = { version: 1, taskId: input.contract.task.id, createdAt: new Date().toISOString(), nodes: [...nodes.values()].sort((a, b) => a.id.localeCompare(b.id)), edges: uniqueEdges(edges), requirements: coverage, complete: coverage.every((item) => item.complete), reasons };
77
+ const graph = { ...payload, sha256: digest(payload) };
78
+ const output = path.resolve(stateRoot, input.config.evidence?.outputDir ?? ".harness/evidence", `${input.contract.task.id}.json`);
79
+ await fs.mkdir(path.dirname(output), { recursive: true });
80
+ await fs.writeFile(output, `${JSON.stringify(graph, null, 2)}\n`);
81
+ return graph;
82
+ }
83
+ export function evidenceValidationCheck(graph, config) { const strict = config.evidence?.requireComplete === true; return { id: "evidence.requirement-coverage", category: "evidence", status: graph.complete ? "PASS" : strict ? "FAIL" : "WARN", message: graph.complete ? `Requirement evidence graph complete for ${graph.requirements.length} requirement(s).` : `Requirement evidence graph is incomplete: ${graph.reasons.join("; ")}`, details: { sha256: graph.sha256, requirements: graph.requirements, strict } }; }
84
+ function normalizedRequirements(contract) { if (contract.requirements?.length)
85
+ return contract.requirements.map((item) => ({ id: item.id, description: item.description ?? item.id, validators: [...new Set([...(item.validators ?? []), ...(item.validator ? [item.validator] : [])])] })); const validators = [...(contract.verification?.validators ?? []).map((item) => item.id), ...(contract.verification?.commands ?? []).map((item) => item.id)]; return (contract.quick?.acceptance ?? []).map((description, index) => ({ id: `QUICK-AC-${index + 1}`, description, validators })); }
86
+ function coverageFor(requirement, nodes, edges) { const req = `req:${requirement.id}`; const taskIds = edges.filter((edge) => edge.from === req && edge.type === "implemented-by").map((edge) => edge.to); const files = [...new Set(taskIds.flatMap((task) => edges.filter((edge) => edge.from === task && edge.type === "changed").map((edge) => edge.to.replace(/^file:/, ""))))].sort(); const validators = requirement.validators; const passingValidators = validators.filter((id) => nodes.get(`check:${id}`)?.data?.status === "PASS"); const missingValidators = validators.filter((id) => !passingValidators.includes(id)); const implementation = taskIds.length > 0 && files.length > 0; const validation = validators.length > 0 && missingValidators.length === 0; return { requirementId: requirement.id, implementation, validation, passingValidators, missingValidators, files, tasks: taskIds.map((id) => id.replace(/^task:/, "")), complete: implementation && validation }; }
87
+ function addNode(nodes, node) { if (!nodes.has(node.id))
88
+ nodes.set(node.id, node); }
89
+ function addEdge(edges, from, to, type) { edges.push({ from, to, type }); }
90
+ function uniqueEdges(edges) { const seen = new Set(); return edges.filter((edge) => { const key = `${edge.from}\0${edge.type}\0${edge.to}`; if (seen.has(key))
91
+ return false; seen.add(key); return true; }).sort((a, b) => `${a.from}:${a.type}:${a.to}`.localeCompare(`${b.from}:${b.type}:${b.to}`)); }
92
+ function matches(file, scope) { return scope === "**" || minimatch(file, scope, { dot: true }) || (Boolean(scope.split(/[?*\[]/, 1)[0]) && file.startsWith(scope.split(/[?*\[]/, 1)[0].replace(/\/+$/, ""))); }
93
+ function digest(value) { return crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex"); }
94
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/evidence/graph.ts"],"names":[],"mappings":"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"}
@@ -66,11 +66,11 @@ declare const issuePlanSchema: z.ZodObject<{
66
66
  low: "low";
67
67
  }>;
68
68
  flags: z.ZodDefault<z.ZodArray<z.ZodEnum<{
69
+ schema: "schema";
69
70
  security: "security";
70
71
  architecture: "architecture";
71
72
  authentication: "authentication";
72
73
  authorization: "authorization";
73
- schema: "schema";
74
74
  migration: "migration";
75
75
  "public-api": "public-api";
76
76
  "breaking-change": "breaking-change";
@@ -0,0 +1,24 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ export interface McpBenchmarkResult {
3
+ server: string;
4
+ type: "local" | "remote";
5
+ available: boolean;
6
+ baselineConfigTokens: number;
7
+ permissionSurfaceScore: number;
8
+ staleDataRisk: "low" | "medium" | "high";
9
+ latencyMs?: {
10
+ median: number;
11
+ min: number;
12
+ max: number;
13
+ samples: number[];
14
+ };
15
+ notes: string[];
16
+ }
17
+ export interface McpBenchmarkReport {
18
+ version: 1;
19
+ generatedAt: string;
20
+ results: McpBenchmarkResult[];
21
+ packs: Record<string, string[]>;
22
+ }
23
+ export declare function benchmarkMcpCatalog(root: string, config: HarnessProjectConfig, names?: string[]): Promise<McpBenchmarkReport>;
24
+ export declare function resolveMcpPack(config: HarnessProjectConfig, pack: string): string[];
@@ -0,0 +1,82 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { commandExists } from "../utils/process.js";
4
+ export async function benchmarkMcpCatalog(root, config, names) {
5
+ const catalog = config.mcp?.servers ?? {};
6
+ const selected = names?.length ? names : Object.keys(catalog).filter((name) => catalog[name].enabled !== false);
7
+ const repetitions = config.mcp?.benchmark?.repetitions ?? 3;
8
+ const results = [];
9
+ for (const name of selected) {
10
+ const server = catalog[name];
11
+ if (!server)
12
+ throw new Error(`Unknown MCP server '${name}'.`);
13
+ results.push(await benchmarkOne(root, name, server, repetitions));
14
+ }
15
+ const packs = {};
16
+ for (const [name, pack] of Object.entries(config.mcp?.packs ?? {}))
17
+ if (pack.enabled !== false)
18
+ packs[name] = pack.servers.filter((server) => Boolean(catalog[server]));
19
+ const report = { version: 1, generatedAt: new Date().toISOString(), results: results.sort((a, b) => a.server.localeCompare(b.server)), packs };
20
+ const output = path.resolve(root, config.mcp?.benchmark?.resultsDir ?? ".harness/mcp-benchmarks", `${Date.now()}.json`);
21
+ await fs.mkdir(path.dirname(output), { recursive: true });
22
+ await fs.writeFile(output, `${JSON.stringify(report, null, 2)}\n`);
23
+ return report;
24
+ }
25
+ export function resolveMcpPack(config, pack) { const value = config.mcp?.packs?.[pack]; if (!value || value.enabled === false)
26
+ throw new Error(`Unknown or disabled MCP pack '${pack}'.`); const catalog = config.mcp?.servers ?? {}; const missing = value.servers.filter((name) => !catalog[name]); if (missing.length)
27
+ throw new Error(`MCP pack '${pack}' references unknown servers: ${missing.join(", ")}`); return [...new Set(value.servers)]; }
28
+ async function benchmarkOne(root, name, server, repetitions) {
29
+ const notes = [];
30
+ const serialized = JSON.stringify({ name, ...server });
31
+ const baselineConfigTokens = Math.ceil(serialized.length / 4);
32
+ const samples = [];
33
+ let available = false;
34
+ if (server.type === "local") {
35
+ const command = server.command?.[0];
36
+ available = Boolean(command && await commandExists(command, root));
37
+ if (!available)
38
+ notes.push(`local command '${command ?? "<missing>"}' unavailable`);
39
+ else
40
+ for (let index = 0; index < repetitions; index += 1) {
41
+ const started = performance.now();
42
+ await commandExists(command, root);
43
+ samples.push(performance.now() - started);
44
+ }
45
+ }
46
+ else {
47
+ for (let index = 0; index < repetitions; index += 1) {
48
+ const controller = new AbortController();
49
+ const timeout = setTimeout(() => controller.abort(), Math.min(server.timeoutMs ?? 10_000, 10_000));
50
+ const started = performance.now();
51
+ try {
52
+ const response = await fetch(server.url, { method: "HEAD", headers: resolvedHeaders(server.headers), signal: controller.signal });
53
+ samples.push(performance.now() - started);
54
+ available = available || response.status < 500;
55
+ if (response.status === 401 || response.status === 403)
56
+ notes.push(`probe reached server but authentication is required (HTTP ${response.status})`);
57
+ }
58
+ catch (error) {
59
+ notes.push(`probe failed: ${String(error)}`);
60
+ }
61
+ finally {
62
+ clearTimeout(timeout);
63
+ }
64
+ }
65
+ }
66
+ const permissionSurfaceScore = permissionSurface(server);
67
+ const staleDataRisk = staleRisk(name, server);
68
+ if (baselineConfigTokens > 500)
69
+ notes.push("large MCP configuration footprint; measure runtime tool-schema overhead before broad enablement");
70
+ return { server: name, type: server.type, available, baselineConfigTokens, permissionSurfaceScore, staleDataRisk, latencyMs: samples.length ? summarizeLatency(samples) : undefined, notes: [...new Set(notes)] };
71
+ }
72
+ function permissionSurface(server) { let score = server.type === "remote" ? 2 : 1; score += Object.keys(server.environment ?? {}).length; score += Object.keys(server.headers ?? {}).length; if (server.oauth)
73
+ score += 2; if (server.command?.some((item) => /docker|podman|kubectl|terraform|gh|aws|gcloud|az/i.test(item)))
74
+ score += 3; if (/write|admin|mutation/i.test(server.description ?? ""))
75
+ score += 4; return score; }
76
+ function staleRisk(name, server) { const text = `${name} ${server.description ?? ""}`.toLowerCase(); if (/database|cluster|kubernetes|production|inventory|cloud/.test(text))
77
+ return "high"; if (/docs|documentation|issue|sentry|observability|search/.test(text))
78
+ return "medium"; return "low"; }
79
+ function summarizeLatency(samples) { const sorted = [...samples].sort((a, b) => a - b); const middle = Math.floor(sorted.length / 2); const median = sorted.length % 2 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2; return { median, min: sorted[0], max: sorted.at(-1), samples }; }
80
+ function resolvedHeaders(headers) { const result = new Headers(); for (const [name, value] of Object.entries(headers ?? {}))
81
+ result.set(name, value.replace(/\{env:([^}]+)\}/g, (_, env) => process.env[env] ?? "")); return result; }
82
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/mcp/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProcessResult } from "../utils/process.js";
2
+ import { runProcess } from "../utils/process.js";
3
+ export interface PaseoCapabilities {
4
+ version?: string;
5
+ background: boolean;
6
+ quiet: boolean;
7
+ json: boolean;
8
+ outputSchema: boolean;
9
+ daemonJson: boolean;
10
+ nativeToolsRecommended: boolean;
11
+ }
12
+ export interface PaseoBackgroundRunOptions {
13
+ title: string;
14
+ provider: string;
15
+ model?: string;
16
+ workspaceId?: string;
17
+ prompt: string;
18
+ }
19
+ type Runner = typeof runProcess;
20
+ export declare function detectPaseoCapabilities(root: string, run?: Runner): Promise<PaseoCapabilities>;
21
+ export declare function buildPaseoBackgroundRunCommand(options: PaseoBackgroundRunOptions, capabilities: PaseoCapabilities): string;
22
+ export declare function extractPaseoAgentId(stdout: string): string | undefined;
23
+ export declare function isRecoverableDaemonStatus(result: ProcessResult): boolean;
24
+ export {};
@@ -0,0 +1,104 @@
1
+ import { runProcess } from "../utils/process.js";
2
+ export async function detectPaseoCapabilities(root, run = runProcess) {
3
+ const [versionResult, runHelp, daemonHelp] = await Promise.all([
4
+ run("paseo --version", { cwd: root, timeoutMs: 15_000 }),
5
+ run("paseo run --help", { cwd: root, timeoutMs: 15_000 }),
6
+ run("paseo daemon status --help", { cwd: root, timeoutMs: 15_000 })
7
+ ]);
8
+ const version = parseVersion(`${versionResult.stdout}\n${versionResult.stderr}`);
9
+ const runText = `${runHelp.stdout}\n${runHelp.stderr}`;
10
+ const daemonText = `${daemonHelp.stdout}\n${daemonHelp.stderr}`;
11
+ return {
12
+ version,
13
+ background: hasOption(runText, "--background"),
14
+ quiet: hasOption(runText, "--quiet") || hasOption(runText, "-q") || semverAtLeast(version, [0, 4, 0]),
15
+ json: hasOption(runText, "--json"),
16
+ outputSchema: hasOption(runText, "--output-schema"),
17
+ daemonJson: hasOption(daemonText, "--json"),
18
+ nativeToolsRecommended: semverAtLeast(version, [0, 4, 0])
19
+ };
20
+ }
21
+ export function buildPaseoBackgroundRunCommand(options, capabilities) {
22
+ if (!capabilities.background)
23
+ throw new Error(`Installed Paseo${capabilities.version ? ` ${capabilities.version}` : ""} does not advertise background runs.`);
24
+ const parts = ["paseo run", "--background"];
25
+ if (capabilities.json)
26
+ parts.push("--json");
27
+ else if (capabilities.quiet)
28
+ parts.push("--quiet");
29
+ parts.push(`--title ${quote(options.title)}`, `--provider ${quote(options.provider)}`);
30
+ if (options.workspaceId)
31
+ parts.push(`--workspace ${quote(options.workspaceId)}`);
32
+ if (options.model)
33
+ parts.push(`--model ${quote(options.model)}`);
34
+ parts.push(quote(options.prompt));
35
+ return parts.join(" ");
36
+ }
37
+ export function extractPaseoAgentId(stdout) {
38
+ const trimmed = stdout.trim();
39
+ if (!trimmed)
40
+ return undefined;
41
+ try {
42
+ const parsed = JSON.parse(trimmed);
43
+ const id = findId(parsed);
44
+ if (id)
45
+ return id;
46
+ }
47
+ catch { /* older Paseo emits plain text */ }
48
+ const lines = trimmed.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
49
+ for (const line of lines.reverse()) {
50
+ const direct = line.match(/^(?:agent(?:Id)?[=: ]+)?([A-Za-z0-9][A-Za-z0-9._:-]{2,})$/i)?.[1];
51
+ if (direct)
52
+ return direct;
53
+ const embedded = line.match(/(?:agent(?:Id)?|id)["'=:\s]+([A-Za-z0-9][A-Za-z0-9._:-]{2,})/i)?.[1];
54
+ if (embedded)
55
+ return embedded;
56
+ }
57
+ return undefined;
58
+ }
59
+ export function isRecoverableDaemonStatus(result) {
60
+ if (result.exitCode === 0)
61
+ return false;
62
+ return /stale[_ -]?pid|unreachable|connection refused|daemon.*not.*running|not running/i.test(`${result.stderr}\n${result.stdout}`);
63
+ }
64
+ function findId(value) {
65
+ if (!value || typeof value !== "object")
66
+ return undefined;
67
+ if (Array.isArray(value)) {
68
+ for (const item of value) {
69
+ const found = findId(item);
70
+ if (found)
71
+ return found;
72
+ }
73
+ return undefined;
74
+ }
75
+ const record = value;
76
+ for (const key of ["agentId", "agent_id", "id"])
77
+ if (typeof record[key] === "string" && record[key])
78
+ return record[key];
79
+ for (const child of Object.values(record)) {
80
+ const found = findId(child);
81
+ if (found)
82
+ return found;
83
+ }
84
+ return undefined;
85
+ }
86
+ function parseVersion(text) { return text.match(/\b(?:v)?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/)?.[1]; }
87
+ function hasOption(text, option) { return text.includes(option); }
88
+ function semverAtLeast(version, minimum) {
89
+ if (!version)
90
+ return false;
91
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)/);
92
+ if (!match)
93
+ return false;
94
+ const actual = match.slice(1, 4).map(Number);
95
+ for (let i = 0; i < 3; i += 1) {
96
+ if (actual[i] > minimum[i])
97
+ return true;
98
+ if (actual[i] < minimum[i])
99
+ return false;
100
+ }
101
+ return true;
102
+ }
103
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
104
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/paseo/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ import { runProcess } from "../utils/process.js";
3
+ import { startPaseoHarness } from "./start.js";
4
+ export type ContextGuardState = "OK" | "PRESSURE" | "HANDOFF_REQUIRED" | "HARD_HANDOFF" | "UNKNOWN";
5
+ export interface ContextUsage {
6
+ used?: number;
7
+ limit?: number;
8
+ ratio?: number;
9
+ source: string;
10
+ }
11
+ export interface LeadHandoffArtifact {
12
+ version: 1;
13
+ createdAt: string;
14
+ reason: "CONTEXT_PRESSURE";
15
+ project: string;
16
+ previousAgentId: string;
17
+ rotatedAgentId?: string;
18
+ context: ContextUsage;
19
+ branch?: string;
20
+ activeRun?: string;
21
+ latestAudit?: string;
22
+ latestDelivery?: string;
23
+ semanticBrief?: string;
24
+ nextInstruction: string;
25
+ }
26
+ export interface ContextGuardResult {
27
+ state: ContextGuardState;
28
+ usage: ContextUsage;
29
+ handoffPath?: string;
30
+ rotatedAgentId?: string;
31
+ message: string;
32
+ }
33
+ type Runner = typeof runProcess;
34
+ type Starter = typeof startPaseoHarness;
35
+ export interface ContextGuardOptions {
36
+ brief?: string;
37
+ run?: Runner;
38
+ autoRotate?: boolean;
39
+ aehCommand?: string;
40
+ start?: Starter;
41
+ }
42
+ export declare function guardLeadContext(root: string, config: HarnessProjectConfig, agentId: string, options?: ContextGuardOptions): Promise<ContextGuardResult>;
43
+ export declare function inspectPaseoContextUsage(root: string, agentId: string, run?: Runner): Promise<ContextUsage>;
44
+ export declare function extractContextUsage(value: unknown): ContextUsage;
45
+ export {};
@@ -0,0 +1,153 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { runProcess } from "../utils/process.js";
5
+ import { startPaseoHarness } from "./start.js";
6
+ export async function guardLeadContext(root, config, agentId, options = {}) {
7
+ const run = options.run ?? runProcess;
8
+ const policy = contextPolicy(config);
9
+ const usage = await inspectPaseoContextUsage(root, agentId, run);
10
+ if (usage.ratio === undefined)
11
+ return { state: "UNKNOWN", usage, message: "Paseo did not expose a stable context-usage ratio; continue with delegation-first behavior and prefer a fresh lead on the next aeh start." };
12
+ if (usage.ratio < policy.pressure)
13
+ return { state: "OK", usage, message: `Lead context ${(usage.ratio * 100).toFixed(1)}% is below the pressure threshold.` };
14
+ if (usage.ratio < policy.handoff)
15
+ return { state: "PRESSURE", usage, message: `Lead context ${(usage.ratio * 100).toFixed(1)}% is under pressure. Stop exploratory shell work and delegate all non-semantic operations.` };
16
+ const artifactPath = await writeHandoffArtifact(root, config, agentId, usage, options.brief, run);
17
+ const state = usage.ratio >= policy.hard ? "HARD_HANDOFF" : "HANDOFF_REQUIRED";
18
+ const autoRotate = options.autoRotate ?? Boolean(process.env.PASEO_AGENT_ID);
19
+ if (!autoRotate)
20
+ return { state, usage, handoffPath: artifactPath, message: `${state}: context ${(usage.ratio * 100).toFixed(1)}%. Handoff artifact created at ${relative(root, artifactPath)}. Create a fresh lead with /paseo-handoff (preferred), Paseo create_agent, or rerun the guard from the managed lead to rotate automatically. Do not compact and continue the engineering workflow in the old lead.` };
21
+ const starter = options.start ?? startPaseoHarness;
22
+ const aehCommand = options.aehCommand ?? exactAehCommand();
23
+ const relativeHandoff = relative(root, artifactPath);
24
+ const fresh = await starter(root, config, { forceNew: true, resume: false, handoffPath: relativeHandoff, aehCommand });
25
+ await recordRotatedLead(artifactPath, fresh.agentId);
26
+ return {
27
+ state,
28
+ usage,
29
+ handoffPath: artifactPath,
30
+ rotatedAgentId: fresh.agentId,
31
+ message: `${state}: context ${(usage.ratio * 100).toFixed(1)}%. AEH rotated responsibility to fresh lead ${fresh.agentId} using ${relativeHandoff}. Stop engineering work in ${agentId}; do not compact-and-continue. The fresh lead bootstraps from deterministic artifacts.`
32
+ };
33
+ }
34
+ export async function inspectPaseoContextUsage(root, agentId, run = runProcess) {
35
+ const attempts = [`paseo ls -a -g --json`, `paseo logs ${quote(agentId)} --tail 5 --json`];
36
+ for (const command of attempts) {
37
+ const result = await run(command, { cwd: root, timeoutMs: 30_000 });
38
+ if (result.exitCode !== 0 || !result.stdout.trim())
39
+ continue;
40
+ try {
41
+ const parsed = JSON.parse(result.stdout);
42
+ const agent = findAgent(parsed, agentId) ?? parsed;
43
+ const usage = extractContextUsage(agent);
44
+ if (usage.ratio !== undefined)
45
+ return usage;
46
+ }
47
+ catch { /* older Paseo or non-JSON output */ }
48
+ }
49
+ return { source: "unavailable" };
50
+ }
51
+ export function extractContextUsage(value) {
52
+ const pairs = collectNumericFields(value);
53
+ const explicitRatio = first(pairs, ["contextusage", "contextusageratio", "contextpercentage", "contextpercent", "windowusage", "contextutilization"]);
54
+ if (explicitRatio !== undefined) {
55
+ const ratio = explicitRatio > 1 ? explicitRatio / 100 : explicitRatio;
56
+ if (ratio >= 0 && ratio <= 1.5)
57
+ return { ratio: Math.min(ratio, 1), source: "paseo-explicit-ratio" };
58
+ }
59
+ const used = first(pairs, ["contexttokens", "contextused", "usedcontexttokens", "tokensused", "totaltokens", "inputtokens"]);
60
+ const limit = first(pairs, ["contextwindow", "contextlimit", "contextwindowtokens", "maxtokens", "tokenlimit"]);
61
+ if (used !== undefined && limit !== undefined && limit > 0)
62
+ return { used, limit, ratio: Math.min(used / limit, 1), source: "paseo-token-fields" };
63
+ return { used, limit, source: "paseo-snapshot-no-ratio" };
64
+ }
65
+ function contextPolicy(config) {
66
+ const context = config.orchestration?.interactive?.context;
67
+ const pressure = clamp(context?.pressureThreshold ?? 0.70);
68
+ const handoff = Math.max(pressure, clamp(context?.handoffThreshold ?? 0.80));
69
+ const hard = Math.max(handoff, clamp(context?.hardHandoffThreshold ?? 0.90));
70
+ return { pressure, handoff, hard };
71
+ }
72
+ async function writeHandoffArtifact(root, config, agentId, usage, semanticBrief, run) {
73
+ const stateDir = config.orchestration?.interactive?.stateDir ?? ".harness/paseo";
74
+ const dir = path.resolve(root, stateDir, "handoffs");
75
+ await fs.mkdir(dir, { recursive: true });
76
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
77
+ const file = path.join(dir, `lead-${stamp}.json`);
78
+ const branchResult = await run("git branch --show-current", { cwd: root, timeoutMs: 10_000 });
79
+ const artifact = {
80
+ version: 1,
81
+ createdAt: new Date().toISOString(),
82
+ reason: "CONTEXT_PRESSURE",
83
+ project: config.project.name,
84
+ previousAgentId: agentId,
85
+ context: usage,
86
+ branch: branchResult.exitCode === 0 ? branchResult.stdout.trim() || undefined : undefined,
87
+ activeRun: await latestJsonPath(root, config.sdd?.runsDir ?? ".harness/runs"),
88
+ latestAudit: await existingRelative(root, ".harness/audits/latest.json"),
89
+ latestDelivery: await latestJsonPath(root, config.delivery?.stateDir ?? ".harness/delivery"),
90
+ semanticBrief: semanticBrief?.trim() || undefined,
91
+ nextInstruction: "Continue as a fresh AEH Lead. Read the referenced sealed/run/audit/delivery artifacts rather than asking the previous lead to replay its full context. Re-run deterministic checks before accepting any state transition."
92
+ };
93
+ await fs.writeFile(file, `${JSON.stringify(artifact, null, 2)}\n`);
94
+ return file;
95
+ }
96
+ async function recordRotatedLead(file, agentId) {
97
+ const artifact = JSON.parse(await fs.readFile(file, "utf8"));
98
+ artifact.rotatedAgentId = agentId;
99
+ await fs.writeFile(file, `${JSON.stringify(artifact, null, 2)}\n`);
100
+ }
101
+ async function latestJsonPath(root, relativeDir) {
102
+ const dir = path.resolve(root, relativeDir);
103
+ const names = await fs.readdir(dir).catch(() => []);
104
+ const json = names.filter((name) => name.endsWith(".json"));
105
+ if (!json.length)
106
+ return undefined;
107
+ const values = await Promise.all(json.map(async (name) => ({ name, stat: await fs.stat(path.join(dir, name)) })));
108
+ values.sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs);
109
+ return relative(root, path.join(dir, values[0].name));
110
+ }
111
+ async function existingRelative(root, relativePath) { try {
112
+ await fs.access(path.resolve(root, relativePath));
113
+ return relativePath.replaceAll("\\", "/");
114
+ }
115
+ catch {
116
+ return undefined;
117
+ } }
118
+ function exactAehCommand() { const entry = path.resolve(process.argv[1]); return `${JSON.stringify(process.execPath)} ${JSON.stringify(entry)}`; }
119
+ function findAgent(value, id) { if (Array.isArray(value)) {
120
+ for (const child of value) {
121
+ const found = findAgent(child, id);
122
+ if (found)
123
+ return found;
124
+ }
125
+ return undefined;
126
+ } if (!value || typeof value !== "object")
127
+ return undefined; const record = value; if ([record.id, record.agentId, record.agent_id].some((item) => item === id))
128
+ return record; for (const child of Object.values(record)) {
129
+ const found = findAgent(child, id);
130
+ if (found)
131
+ return found;
132
+ } return undefined; }
133
+ function collectNumericFields(value, out = new Map()) { if (Array.isArray(value)) {
134
+ for (const child of value)
135
+ collectNumericFields(child, out);
136
+ return out;
137
+ } if (!value || typeof value !== "object")
138
+ return out; for (const [key, child] of Object.entries(value)) {
139
+ const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, "");
140
+ if (typeof child === "number" && Number.isFinite(child) && !out.has(normalized))
141
+ out.set(normalized, child);
142
+ else
143
+ collectNumericFields(child, out);
144
+ } return out; }
145
+ function first(values, keys) { for (const key of keys) {
146
+ const value = values.get(key);
147
+ if (value !== undefined)
148
+ return value;
149
+ } return undefined; }
150
+ function clamp(value) { return Math.max(0, Math.min(1, value)); }
151
+ function relative(root, file) { return path.relative(root, file).replaceAll("\\", "/"); }
152
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
153
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/paseo/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAyB/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAA4B,EAAE,OAAe,EAAE,UAA+B,EAAE;IACnI,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,2IAA2I,EAAE,CAAC;IACxN,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,EAAE,CAAC;IAC9J,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4FAA4F,EAAE,CAAC;IAE3N,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClG,MAAM,KAAK,GAAsB,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAClG,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7E,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,oNAAoN,EAAE,CAAC;IAEpZ,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,eAAe,EAAE,CAAC;IAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IACvH,MAAM,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO;QACL,KAAK;QACL,KAAK;QACL,WAAW,EAAE,YAAY;QACzB,cAAc,EAAE,KAAK,CAAC,OAAO;QAC7B,OAAO,EAAE,GAAG,KAAK,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+CAA+C,KAAK,CAAC,OAAO,UAAU,eAAe,8BAA8B,OAAO,wFAAwF;KAC/Q,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,UAAU;IACpG,MAAM,QAAQ,GAAG,CAAC,uBAAuB,EAAE,cAAc,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,SAAS;QAC7D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAY,CAAC;YACpD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC;YACnD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACtJ,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;QACtE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAChH,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACnJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,MAA4B;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,oBAAoB,IAAI,IAAI,CAAC,CAAC,CAAC;IAC7E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAA4B,EAAE,OAAe,EAAE,KAAmB,EAAE,aAAiC,EAAE,GAAW;IAClK,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAwB;QACpC,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QAC5B,eAAe,EAAE,OAAO;QACxB,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,YAAY,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;QACzF,SAAS,EAAE,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,eAAe,CAAC;QAC7E,WAAW,EAAE,MAAM,gBAAgB,CAAC,IAAI,EAAE,6BAA6B,CAAC;QACxE,cAAc,EAAE,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,mBAAmB,CAAC;QAC5F,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS;QACjD,eAAe,EAAE,2NAA2N;KAC7O,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAwB,CAAC;IACpF,QAAQ,CAAC,cAAc,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,WAAmB;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AACD,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,YAAoB,IAAiC,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAAC,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,SAAS,CAAC;AAAC,CAAC,CAAC,CAAC;AACtO,SAAS,eAAe,KAAa,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1J,SAAS,SAAS,CAAC,KAAc,EAAE,EAAU,IAAa,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IAAC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAAC,CAAC;IAAC,OAAO,SAAS,CAAC;AAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;IAAE,OAAO,SAAS,CAAC,CAAC,MAAM,MAAM,GAAG,KAAgC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;IAAE,OAAO,MAAM,CAAC,CAAC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAAC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;AAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAC9gB,SAAS,oBAAoB,CAAC,KAAc,EAAE,MAAM,IAAI,GAAG,EAAkB,IAAyB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IAAC,KAAK,MAAM,KAAK,IAAI,KAAK;QAAE,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAAC,OAAO,GAAG,CAAC;AAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;IAAE,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;IAAC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;;QAAM,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACpjB,SAAS,KAAK,CAAC,MAA2B,EAAE,IAAc,IAAwB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;AAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AACvM,SAAS,KAAK,CAAC,KAAa,IAAY,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY,IAAY,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACjH,SAAS,KAAK,CAAC,KAAa,IAAY,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC"}