@tacuchi/agent-workflow-cli 25.1.2 → 25.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/adapters/node-process.js +35 -0
- package/dist/adapters/node-process.js.map +1 -1
- package/dist/application/amend-service.js +393 -0
- package/dist/application/amend-service.js.map +1 -0
- package/dist/application/decision-note-service.js +20 -3
- package/dist/application/decision-note-service.js.map +1 -1
- package/dist/application/doctor/actions.js +158 -0
- package/dist/application/doctor/actions.js.map +1 -0
- package/dist/application/doctor/apply.js +399 -0
- package/dist/application/doctor/apply.js.map +1 -0
- package/dist/application/doctor/auth-dsn.js +143 -0
- package/dist/application/doctor/auth-dsn.js.map +1 -0
- package/dist/application/doctor/auth-flow.js +28 -0
- package/dist/application/doctor/auth-flow.js.map +1 -0
- package/dist/application/doctor/auth-registry.js +12 -0
- package/dist/application/doctor/auth-registry.js.map +1 -0
- package/dist/application/doctor/hosts.js +41 -0
- package/dist/application/doctor/hosts.js.map +1 -0
- package/dist/application/doctor/native-host-state.js +211 -0
- package/dist/application/doctor/native-host-state.js.map +1 -0
- package/dist/application/doctor/prepare.js +262 -0
- package/dist/application/doctor/prepare.js.map +1 -0
- package/dist/application/doctor/provider-installation.js +124 -0
- package/dist/application/doctor/provider-installation.js.map +1 -0
- package/dist/application/doctor/provider-mcps.js +650 -0
- package/dist/application/doctor/provider-mcps.js.map +1 -0
- package/dist/application/doctor/provider-plugins-hooks.js +112 -0
- package/dist/application/doctor/provider-plugins-hooks.js.map +1 -0
- package/dist/application/doctor/provider-skills.js +212 -0
- package/dist/application/doctor/provider-skills.js.map +1 -0
- package/dist/application/doctor/provider-tools-auth.js +201 -0
- package/dist/application/doctor/provider-tools-auth.js.map +1 -0
- package/dist/application/doctor/provider-visibility.js +149 -0
- package/dist/application/doctor/provider-visibility.js.map +1 -0
- package/dist/application/doctor/repair-runner.js +169 -0
- package/dist/application/doctor/repair-runner.js.map +1 -0
- package/dist/application/doctor/report.js +155 -0
- package/dist/application/doctor/report.js.map +1 -0
- package/dist/application/doctor/types.js +5 -0
- package/dist/application/doctor/types.js.map +1 -0
- package/dist/application/flow/advance.js +152 -13
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/flow-service.js +18 -7
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +167 -7
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/run-projection.js +6 -1
- package/dist/application/flow/run-projection.js.map +1 -1
- package/dist/application/flow/submit.js +330 -7
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/mcp-doctor-service.js +1 -1
- package/dist/application/mcp-doctor-service.js.map +1 -1
- package/dist/application/mcp-host-reader.js +134 -26
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-receipt-service.js +9 -7
- package/dist/application/mcp-host-receipt-service.js.map +1 -1
- package/dist/application/plan-current-point.js +54 -0
- package/dist/application/plan-current-point.js.map +1 -0
- package/dist/application/plan-exec-decision-service.js +143 -4
- package/dist/application/plan-exec-decision-service.js.map +1 -1
- package/dist/application/plan-locator.js +78 -0
- package/dist/application/plan-locator.js.map +1 -0
- package/dist/application/plan-open-run.js +129 -0
- package/dist/application/plan-open-run.js.map +1 -0
- package/dist/application/reseal-service.js +14 -44
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/resume-service.js +9 -3
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/install-skill.js +10 -2
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +1 -1
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/session-narrative.js +15 -0
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/settle-service.js +442 -0
- package/dist/application/settle-service.js.map +1 -0
- package/dist/application/source-boundary-policy.js +87 -6
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/workline-index-service.js +165 -62
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/cli/commands/amend.js +122 -0
- package/dist/cli/commands/amend.js.map +1 -0
- package/dist/cli/commands/doctor.js +300 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/settle.js +197 -0
- package/dist/cli/commands/settle.js.map +1 -0
- package/dist/cli/commands/status.js +2 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/dispatch-plan.js +47 -0
- package/dist/cli/dispatch-plan.js.map +1 -0
- package/dist/cli/help-groups.js +15 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +54 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +26 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/domain/decision-note.js +166 -3
- package/dist/domain/decision-note.js.map +1 -1
- package/dist/domain/decision-preview.js.map +1 -1
- package/dist/domain/doctor/auth.js +65 -0
- package/dist/domain/doctor/auth.js.map +1 -0
- package/dist/domain/doctor/model.js +82 -0
- package/dist/domain/doctor/model.js.map +1 -0
- package/dist/domain/doctor/operations.js +114 -0
- package/dist/domain/doctor/operations.js.map +1 -0
- package/dist/domain/effective-contract.js +4 -3
- package/dist/domain/effective-contract.js.map +1 -1
- package/dist/domain/flow/answer.js +10 -0
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +124 -0
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/directive.js +8 -1
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/run-state.js +276 -34
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/obligation-correspondence.js +95 -0
- package/dist/domain/obligation-correspondence.js.map +1 -0
- package/dist/domain/reconciliation.js +142 -25
- package/dist/domain/reconciliation.js.map +1 -1
- package/dist/domain/redaction.js +40 -0
- package/dist/domain/redaction.js.map +1 -1
- package/dist/domain/settlement.js +129 -0
- package/dist/domain/settlement.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/SKILL.md +2 -1
- package/skills/w/commands/README.md +2 -1
- package/skills/w/commands/doctor.md +31 -0
- package/skills/w/commands/resume.md +2 -2
- package/skills/w/context/MANIFEST.json +4 -0
- package/skills/w/loops/plan-exec-loop/LOOP.md +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-mcps.js","sourceRoot":"","sources":["../../../src/application/doctor/provider-mcps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { doctorFindingId } from "../../domain/doctor/model.js";
|
|
2
|
+
import { runHostDoctor } from "../host-doctor-service.js";
|
|
3
|
+
import { reportHookTemplateLosses, reportHooksArmed } from "../self/host-states.js";
|
|
4
|
+
import { coverage } from "./types.js";
|
|
5
|
+
const CATEGORY = "plugins-hooks";
|
|
6
|
+
const SCOPE_HOST = "workspace";
|
|
7
|
+
export const pluginsHooksProvider = {
|
|
8
|
+
category: CATEGORY,
|
|
9
|
+
async run(input) {
|
|
10
|
+
const host = await runHostDoctor(input.ctx.fs, input.ctx.env, input.ctx.process);
|
|
11
|
+
const participating = new Set(input.hosts.map((candidate) => candidate.target));
|
|
12
|
+
const findings = [
|
|
13
|
+
...host.findings.map(dependencyFinding),
|
|
14
|
+
...(await reportHooksArmed(input.ctx))
|
|
15
|
+
.filter((report) => participating.has(report.target))
|
|
16
|
+
.map((report) => hooksArmedFinding(hostOf(input, report.target), report)),
|
|
17
|
+
...(await reportHookTemplateLosses(input.ctx))
|
|
18
|
+
.filter((loss) => participating.has(loss.target))
|
|
19
|
+
// A host that carries the whole template has nothing to say here: the
|
|
20
|
+
// armed finding beside it already reports the healthy case, and a second
|
|
21
|
+
// "nothing was lost" row per host would bury the ones that did lose.
|
|
22
|
+
.filter((loss) => !loss.template_read || loss.losses.length > 0)
|
|
23
|
+
.map((loss) => templateLossFinding(hostOf(input, loss.target), loss)),
|
|
24
|
+
];
|
|
25
|
+
return {
|
|
26
|
+
coverage: [
|
|
27
|
+
coverage(CATEGORY, SCOPE_HOST, "checked"),
|
|
28
|
+
...input.hosts.map((candidate) => coverage(CATEGORY, candidate.host, "checked")),
|
|
29
|
+
],
|
|
30
|
+
findings,
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/** An external dependency an installed third-party plugin needs. Never ours to install. */
|
|
35
|
+
function dependencyFinding(finding) {
|
|
36
|
+
const platform = process.platform;
|
|
37
|
+
const hint = platform === "darwin" || platform === "linux" || platform === "win32"
|
|
38
|
+
? finding.install_hint[platform]
|
|
39
|
+
: finding.install_hint.linux;
|
|
40
|
+
return {
|
|
41
|
+
id: doctorFindingId(SCOPE_HOST, CATEGORY, `dependencia:${finding.dependency}`),
|
|
42
|
+
host: SCOPE_HOST,
|
|
43
|
+
category: CATEGORY,
|
|
44
|
+
resource: { kind: "dependency", name: finding.dependency, locator: null },
|
|
45
|
+
state: finding.severity === "ok" ? "healthy" : "warning",
|
|
46
|
+
summary: finding.message,
|
|
47
|
+
impact: finding.severity === "ok"
|
|
48
|
+
? "los plugins que la requieren pueden usarla"
|
|
49
|
+
: `los plugins que la requieren fallan al usarla: ${finding.required_by.join(", ")}`,
|
|
50
|
+
evidence: [
|
|
51
|
+
`requerida por: ${finding.required_by.join(", ") || "ningún plugin"}`,
|
|
52
|
+
...finding.plugin_paths.map((path) => `plugin en ${path}`),
|
|
53
|
+
],
|
|
54
|
+
ownership: "n/a",
|
|
55
|
+
remediation: finding.severity === "ok"
|
|
56
|
+
? { kind: "none", action: null, guidance: [] }
|
|
57
|
+
: { kind: "manual", action: null, guidance: [hint] },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function hooksArmedFinding(host, report) {
|
|
61
|
+
return {
|
|
62
|
+
id: doctorFindingId(host, CATEGORY, "hooks"),
|
|
63
|
+
host,
|
|
64
|
+
category: CATEGORY,
|
|
65
|
+
resource: { kind: "hooks", name: report.label, locator: report.path },
|
|
66
|
+
state: report.armed ? "healthy" : "warning",
|
|
67
|
+
summary: report.armed
|
|
68
|
+
? `los hooks de Workline están armados en ${report.label}`
|
|
69
|
+
: `los hooks de Workline no están armados en ${report.label}`,
|
|
70
|
+
impact: report.armed
|
|
71
|
+
? "el host ejecuta los hooks que Workline instala"
|
|
72
|
+
: "el host no dispara los hooks de Workline: la continuidad entre turnos se degrada",
|
|
73
|
+
evidence: [`archivo inspeccionado: ${report.path}`],
|
|
74
|
+
ownership: "ours",
|
|
75
|
+
remediation: report.armed
|
|
76
|
+
? { kind: "none", action: null, guidance: [] }
|
|
77
|
+
: { kind: "manual", action: null, guidance: ["aw self install-hooks"] },
|
|
78
|
+
// Armar los hooks presupone que el bundle esté en ese host: si las dos
|
|
79
|
+
// acciones entran al mismo lote, el anotador las ordena.
|
|
80
|
+
...(report.armed
|
|
81
|
+
? {}
|
|
82
|
+
: { proposal: { op: "self.install-hooks", args: { target: report.target } } }),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* What this host cannot carry from the bundled template.
|
|
87
|
+
*
|
|
88
|
+
* `template_read: false` is `unverified`, never "no losses": the difference
|
|
89
|
+
* between "nothing was lost" and "nobody could tell" is the whole point.
|
|
90
|
+
*/
|
|
91
|
+
function templateLossFinding(host, loss) {
|
|
92
|
+
return {
|
|
93
|
+
id: doctorFindingId(host, CATEGORY, "plantilla-hooks"),
|
|
94
|
+
host,
|
|
95
|
+
category: CATEGORY,
|
|
96
|
+
resource: { kind: "hooks", name: "plantilla de hooks", locator: null },
|
|
97
|
+
state: loss.template_read ? "warning" : "unverified",
|
|
98
|
+
summary: loss.template_read
|
|
99
|
+
? "este host no puede expresar parte de la plantilla de hooks"
|
|
100
|
+
: "no se pudo leer la plantilla de hooks: no se sabe qué se pierde",
|
|
101
|
+
impact: loss.template_read
|
|
102
|
+
? "algunos hooks no existen acá aunque el resto esté armado"
|
|
103
|
+
: "no se puede afirmar que la plantilla se exprese entera",
|
|
104
|
+
evidence: loss.template_read ? loss.losses : ["la plantilla no se pudo leer"],
|
|
105
|
+
ownership: "ours",
|
|
106
|
+
remediation: { kind: "none", action: null, guidance: [] },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function hostOf(input, target) {
|
|
110
|
+
return input.hosts.find((candidate) => candidate.target === target)?.host ?? target;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=provider-plugins-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-plugins-hooks.js","sourceRoot":"","sources":["../../../src/application/doctor/provider-plugins-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { doctorFindingId, } from "../../domain/doctor/model.js";
|
|
2
|
+
import { capabilityReadiness, } from "../capability/readiness.js";
|
|
3
|
+
/**
|
|
4
|
+
* Skills — what is registered, whether its replicas landed, and whether the one
|
|
5
|
+
* capability that has a contract is actually ready.
|
|
6
|
+
*
|
|
7
|
+
* `listSkills` already answers the first two and `capabilityReadiness` the
|
|
8
|
+
* third, with a verdict that separates state, reason and action — the shape this
|
|
9
|
+
* whole model was modelled on. Neither is re-derived: an incomplete replica is
|
|
10
|
+
* read off the booleans the manager publishes, not re-inspected here.
|
|
11
|
+
*
|
|
12
|
+
* The seed list is deliberately empty. It only supplies descriptions and the
|
|
13
|
+
* `recommended` status, and a doctor that turned "you could also install this"
|
|
14
|
+
* into a finding would teach people to skim past the ones that matter.
|
|
15
|
+
*
|
|
16
|
+
* The category answers TWO things with two different scopes, and they are kept
|
|
17
|
+
* apart on purpose (AC-02):
|
|
18
|
+
*
|
|
19
|
+
* - The registered skills and their replicas belong to the PERSON, not to a
|
|
20
|
+
* host: the registry and the three replica roots hang off `$HOME`
|
|
21
|
+
* (`~/.agents`, `~/.claude`, `~/.gemini`) and no host governs them. Reporting
|
|
22
|
+
* the same user-level answer once per participating host would be the same
|
|
23
|
+
* sentence repeated N times, so it is anchored at the `workspace` pseudo-host
|
|
24
|
+
* — the same anchor the aggregate uses when no host participates.
|
|
25
|
+
* - A capability's DIRECT route is per host: it resolves against that host's own
|
|
26
|
+
* skills tree, so it can be installed in one and absent in the next. That half
|
|
27
|
+
* IS emitted per host, one coverage row each.
|
|
28
|
+
*/
|
|
29
|
+
import { listSkills } from "../self/skills-manager.js";
|
|
30
|
+
import { coverage } from "./types.js";
|
|
31
|
+
const CATEGORY = "skills";
|
|
32
|
+
/** Where a user-level skill finding lives: the workspace, not a host — replicas are per-user. */
|
|
33
|
+
const SCOPE_HOST = "workspace";
|
|
34
|
+
export const skillsProvider = {
|
|
35
|
+
category: CATEGORY,
|
|
36
|
+
async run(input) {
|
|
37
|
+
const findings = [];
|
|
38
|
+
const covered = [coverage(CATEGORY, SCOPE_HOST, "checked")];
|
|
39
|
+
for (const skill of await listSkills(input.ctx, [])) {
|
|
40
|
+
if (skill.status === "recommended")
|
|
41
|
+
continue;
|
|
42
|
+
findings.push(skillFinding(skill));
|
|
43
|
+
}
|
|
44
|
+
// One readiness read per participating host. The capability-level verdict is
|
|
45
|
+
// the same everywhere, but `exposures.direct` is resolved against THIS
|
|
46
|
+
// host's skills tree — exactly the half that can be missing in one host and
|
|
47
|
+
// present in the next. And when no host participates (`--only` over a host
|
|
48
|
+
// that is not on this machine) none is invented: there are no capability
|
|
49
|
+
// findings and no coverage row claims a host was checked.
|
|
50
|
+
for (const host of input.hosts) {
|
|
51
|
+
for (const report of await capabilityReadiness({
|
|
52
|
+
fs: input.ctx.fs,
|
|
53
|
+
env: input.ctx.env,
|
|
54
|
+
paths: input.ctx.paths,
|
|
55
|
+
host: host.host,
|
|
56
|
+
})) {
|
|
57
|
+
findings.push(capabilityFinding(host.host, report));
|
|
58
|
+
}
|
|
59
|
+
covered.push(coverage(CATEGORY, host.host, "checked"));
|
|
60
|
+
}
|
|
61
|
+
return { coverage: covered, findings };
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* A registered skill's `source`, with any URL userinfo removed.
|
|
66
|
+
*
|
|
67
|
+
* `source` is the string the person typed at register time, kept verbatim — and
|
|
68
|
+
* without a credential helper the usual way to reach a private repo is
|
|
69
|
+
* `https://<token>@github.com/acme/skills.git`. The global redaction cannot see
|
|
70
|
+
* that: `CONNECTION_URI` only covers `postgres|mysql|mongodb` and
|
|
71
|
+
* `SECRET_ASSIGNMENT` only `key=value` shapes, so the token would reach
|
|
72
|
+
* `evidence` and `resource.locator` intact (AC-11). The whole userinfo goes,
|
|
73
|
+
* never just the password half: a PAT is perfectly valid on its own in the user
|
|
74
|
+
* position, so telling a harmless username apart from a secret is not something
|
|
75
|
+
* this can decide — and the repo, which is what identifies the skill, survives.
|
|
76
|
+
*/
|
|
77
|
+
function withoutUrlUserinfo(source) {
|
|
78
|
+
return source.replace(/([a-z][a-z0-9+.-]*:\/\/)[^/\s]*@/gi, "$1***@");
|
|
79
|
+
}
|
|
80
|
+
function skillFinding(skill) {
|
|
81
|
+
const missing = Object.entries(skill.replicas)
|
|
82
|
+
.filter(([, present]) => !present)
|
|
83
|
+
.map(([host]) => host);
|
|
84
|
+
const source = withoutUrlUserinfo(skill.source);
|
|
85
|
+
const evidence = [
|
|
86
|
+
`estado en el registro: ${skill.status}`,
|
|
87
|
+
`origen: ${source}`,
|
|
88
|
+
`réplicas presentes: ${Object.entries(skill.replicas)
|
|
89
|
+
.filter(([, present]) => present)
|
|
90
|
+
.map(([host]) => host)
|
|
91
|
+
.join(", ") || "ninguna"}`,
|
|
92
|
+
];
|
|
93
|
+
const base = {
|
|
94
|
+
id: doctorFindingId(SCOPE_HOST, CATEGORY, skill.name),
|
|
95
|
+
host: SCOPE_HOST,
|
|
96
|
+
category: CATEGORY,
|
|
97
|
+
resource: { kind: "skill", name: skill.name, locator: source },
|
|
98
|
+
evidence,
|
|
99
|
+
};
|
|
100
|
+
// `unmanaged` is a skill living in the canonical root that this CLI never
|
|
101
|
+
// registered: it is somebody else's, so it is reported and left alone.
|
|
102
|
+
if (skill.status === "unmanaged") {
|
|
103
|
+
return {
|
|
104
|
+
...base,
|
|
105
|
+
state: "warning",
|
|
106
|
+
summary: `'${skill.name}' está en el árbol canónico y Workline no la registró`,
|
|
107
|
+
impact: "Workline no la actualiza ni la retira: no sabe de dónde vino",
|
|
108
|
+
ownership: "foreign",
|
|
109
|
+
remediation: {
|
|
110
|
+
kind: "manual",
|
|
111
|
+
action: null,
|
|
112
|
+
guidance: [`si es tuya, registrala con 'aw self skills register'; si no, dejala como está`],
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (missing.length === 0) {
|
|
117
|
+
return {
|
|
118
|
+
...base,
|
|
119
|
+
state: "healthy",
|
|
120
|
+
summary: `'${skill.name}' está registrada con todas sus réplicas`,
|
|
121
|
+
impact: "la skill se ve desde los hosts que leen esas réplicas",
|
|
122
|
+
ownership: "ours",
|
|
123
|
+
remediation: { kind: "none", action: null, guidance: [] },
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
state: "warning",
|
|
129
|
+
summary: `'${skill.name}' tiene réplicas faltantes: ${missing.join(", ")}`,
|
|
130
|
+
impact: "los hosts que leen esas réplicas no ven la skill",
|
|
131
|
+
ownership: "ours",
|
|
132
|
+
remediation: {
|
|
133
|
+
kind: "manual",
|
|
134
|
+
action: null,
|
|
135
|
+
guidance: [`aw self skills reinstall --name ${skill.name}`],
|
|
136
|
+
},
|
|
137
|
+
proposal: { op: "skills.reinstall", args: { name: skill.name } },
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** The two states readiness calls usable. Everything else owes a reason. */
|
|
141
|
+
function isReady(state) {
|
|
142
|
+
return state === "ready" || state === "resolved";
|
|
143
|
+
}
|
|
144
|
+
/** The `direct` verdict, and only when the capability declares that route. */
|
|
145
|
+
function directVerdict(report) {
|
|
146
|
+
return report.exposure.includes("direct") ? report.exposures.direct : null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The first of the two verdicts that fails, or null when both are usable.
|
|
150
|
+
*
|
|
151
|
+
* The capability comes first and the host's `direct` route second, which is the
|
|
152
|
+
* honest order: a capability that does not resolve is not fixed by installing a
|
|
153
|
+
* wrapper, so its reason is the one worth printing.
|
|
154
|
+
*/
|
|
155
|
+
function failingVerdict(report) {
|
|
156
|
+
if (!isReady(report.state)) {
|
|
157
|
+
return { state: report.state, reason: report.reason, action: report.action };
|
|
158
|
+
}
|
|
159
|
+
const direct = directVerdict(report);
|
|
160
|
+
return direct !== null && !isReady(direct.state) ? direct : null;
|
|
161
|
+
}
|
|
162
|
+
/** Both verdicts as read, with the host-dependent half named by its host. */
|
|
163
|
+
function capabilityEvidence(host, report) {
|
|
164
|
+
const direct = directVerdict(report);
|
|
165
|
+
return [
|
|
166
|
+
`estado: ${report.state}`,
|
|
167
|
+
...(report.reason === null ? [] : [report.reason]),
|
|
168
|
+
...(direct === null ? [] : [`ruta directa en '${host}': ${direct.state}`]),
|
|
169
|
+
...(direct === null || direct.reason === null ? [] : [direct.reason]),
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* A capability's readiness ON ONE HOST, translated one field at a time.
|
|
174
|
+
*
|
|
175
|
+
* `ReadinessVerdict` already separates the three things: `state`, the `reason`
|
|
176
|
+
* behind it and the `action` that fixes it. Mapping is all that happens here —
|
|
177
|
+
* inventing a second wording for a reason the engine already wrote is how the
|
|
178
|
+
* two surfaces end up telling the person different stories.
|
|
179
|
+
*
|
|
180
|
+
* Two verdicts are read, in this order: the capability itself, and — only when
|
|
181
|
+
* it declares the route — its `direct` exposure, which is the one that depends
|
|
182
|
+
* on the host. The order is the honest one: a capability that does not resolve
|
|
183
|
+
* is not fixed by installing a wrapper, so its reason comes first. Reporting
|
|
184
|
+
* only the top-level verdict was the defect: it is identical on every host, so a
|
|
185
|
+
* missing wrapper in one host's tree left no trace anywhere in the report.
|
|
186
|
+
*/
|
|
187
|
+
function capabilityFinding(host, report) {
|
|
188
|
+
const failed = failingVerdict(report);
|
|
189
|
+
return {
|
|
190
|
+
id: doctorFindingId(host, CATEGORY, `capability:${report.capability}`),
|
|
191
|
+
host,
|
|
192
|
+
category: CATEGORY,
|
|
193
|
+
resource: { kind: "capability", name: report.capability, locator: null },
|
|
194
|
+
state: failed === null ? "healthy" : "warning",
|
|
195
|
+
summary: failed === null
|
|
196
|
+
? `la capacidad '${report.capability}' está lista en '${host}'`
|
|
197
|
+
: `la capacidad '${report.capability}' está ${failed.state} en '${host}'`,
|
|
198
|
+
impact: failed === null
|
|
199
|
+
? "sus operaciones se pueden invocar"
|
|
200
|
+
: (failed.reason ?? "algunas de sus operaciones pueden no estar disponibles"),
|
|
201
|
+
evidence: capabilityEvidence(host, report),
|
|
202
|
+
ownership: "ours",
|
|
203
|
+
remediation: failed === null
|
|
204
|
+
? { kind: "none", action: null, guidance: [] }
|
|
205
|
+
: {
|
|
206
|
+
kind: "manual",
|
|
207
|
+
action: null,
|
|
208
|
+
guidance: failed.action === null ? [] : [failed.action],
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=provider-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-skills.js","sourceRoot":"","sources":["../../../src/application/doctor/provider-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools and authentication — un recorrido por el registro de proveedores.
|
|
3
|
+
*
|
|
4
|
+
* Este archivo no sabe qué es un DSN. Camina el registro, le pregunta a cada
|
|
5
|
+
* proveedor qué sujetos tiene y en qué estado están, y traduce eso al modelo
|
|
6
|
+
* común. Lo que antes estaba cableado acá vive ahora en `auth-dsn.ts`, y la
|
|
7
|
+
* diferencia importa: agregar una cosa autenticable es agregar un proveedor al
|
|
8
|
+
* registro, no editar el diagnóstico.
|
|
9
|
+
*
|
|
10
|
+
* También es el único choke point de la custodia. Los proveedores declaran su
|
|
11
|
+
* flujo; acá se comprueba con `custodyViolation` ANTES de que exista cualquier
|
|
12
|
+
* sugerencia de acción, así que un flujo que pondría el secreto en un argumento
|
|
13
|
+
* —o que no hereda la terminal, o que escribiría— sale como bloqueante con su
|
|
14
|
+
* razón y sin proposal. Como los proveedores no construyen hallazgos, no hay
|
|
15
|
+
* ningún camino que se saltee esta comprobación.
|
|
16
|
+
*/
|
|
17
|
+
import { authFindingState, custodyViolation, } from "../../domain/doctor/auth.js";
|
|
18
|
+
import { doctorFindingId } from "../../domain/doctor/model.js";
|
|
19
|
+
import { DOCTOR_AUTH_PROVIDERS } from "./auth-registry.js";
|
|
20
|
+
import { coverage } from "./types.js";
|
|
21
|
+
const CATEGORY = "tools-auth";
|
|
22
|
+
const SCOPE_HOST = "workspace";
|
|
23
|
+
export function createToolsAuthProvider(deps = {}) {
|
|
24
|
+
const providers = deps.providers ?? DOCTOR_AUTH_PROVIDERS;
|
|
25
|
+
return {
|
|
26
|
+
category: CATEGORY,
|
|
27
|
+
async run(input) {
|
|
28
|
+
const enumerated = providers.flatMap((provider) => provider.subjects(input.ctx).map((subject) => ({ provider, subject })));
|
|
29
|
+
if (enumerated.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
coverage: [
|
|
32
|
+
coverage(CATEGORY, SCOPE_HOST, "not-applicable", "no hay ninguna cosa autenticable registrada en este entorno"),
|
|
33
|
+
],
|
|
34
|
+
findings: [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const findings = [];
|
|
38
|
+
const seen = new Map();
|
|
39
|
+
for (const { provider, subject } of enumerated) {
|
|
40
|
+
const owner = seen.get(subject.id);
|
|
41
|
+
if (owner !== undefined) {
|
|
42
|
+
findings.push(collisionFinding(subject, owner, provider.id));
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
seen.set(subject.id, provider.id);
|
|
46
|
+
findings.push(await subjectFinding(provider, subject, input));
|
|
47
|
+
}
|
|
48
|
+
return { coverage: [coverage(CATEGORY, SCOPE_HOST, "checked")], findings };
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export const toolsAuthProvider = createToolsAuthProvider();
|
|
53
|
+
/**
|
|
54
|
+
* Qué dice el informe de cada estado de autenticación.
|
|
55
|
+
*
|
|
56
|
+
* La tabla existe para que el mapeo estado → hallazgo viva en UN lugar: el
|
|
57
|
+
* estado sale de `authFindingState`, en el dominio, y la prosa de acá. Antes la
|
|
58
|
+
* rama sana cortaba antes de llegar al mapeo y el resto se decidía con dos
|
|
59
|
+
* ternarios en el call site, así que la mitad de la regla vivía en el proveedor y
|
|
60
|
+
* la rama `present` del dominio no la alcanzaba ningún camino.
|
|
61
|
+
*/
|
|
62
|
+
const SUBJECT_PROSE = {
|
|
63
|
+
present: {
|
|
64
|
+
summary: (label) => `la autenticación de (${label}) está resuelta`,
|
|
65
|
+
impact: "el recurso que depende de esta credencial puede autenticarse",
|
|
66
|
+
},
|
|
67
|
+
absent: {
|
|
68
|
+
summary: (label) => `falta la autenticación de (${label})`,
|
|
69
|
+
impact: "el recurso que depende de esta credencial va a fallar cuando se use",
|
|
70
|
+
},
|
|
71
|
+
unverified: {
|
|
72
|
+
summary: (label) => `no se pudo verificar la autenticación de (${label})`,
|
|
73
|
+
impact: "el recurso puede estar sin autenticar y el informe no puede afirmar lo contrario",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
async function subjectFinding(provider, subject, input) {
|
|
77
|
+
const observed = await observe(provider, subject, input);
|
|
78
|
+
const base = {
|
|
79
|
+
id: doctorFindingId(SCOPE_HOST, CATEGORY, subject.id),
|
|
80
|
+
host: SCOPE_HOST,
|
|
81
|
+
category: CATEGORY,
|
|
82
|
+
resource: { kind: "credential", name: subject.label, locator: subject.locator },
|
|
83
|
+
evidence: observed.evidence,
|
|
84
|
+
ownership: "ours",
|
|
85
|
+
};
|
|
86
|
+
const flow = provider.flow(subject, input.ctx);
|
|
87
|
+
const custody = flow === null ? null : custodyViolation(flow);
|
|
88
|
+
if (flow !== null && custody !== null) {
|
|
89
|
+
// La custodia se rompe por la DECLARACIÓN, no por el estado del sujeto: un
|
|
90
|
+
// flujo así es peligroso aunque la credencial ya esté puesta, y que el
|
|
91
|
+
// veredicto salga 1 es lo correcto — es un defecto de este CLI, no del
|
|
92
|
+
// entorno de la persona.
|
|
93
|
+
return {
|
|
94
|
+
...base,
|
|
95
|
+
state: "blocking",
|
|
96
|
+
summary: `el flujo declarado para (${subject.label}) no puede preservar la custodia del secreto`,
|
|
97
|
+
impact: "no se ofrece ninguna reparación automática: correrlo filtraría la credencial",
|
|
98
|
+
evidence: [...observed.evidence, `custodia: ${custody}`],
|
|
99
|
+
remediation: {
|
|
100
|
+
kind: "manual",
|
|
101
|
+
action: null,
|
|
102
|
+
guidance: [
|
|
103
|
+
...provider.guidance(subject, input.ctx),
|
|
104
|
+
`el flujo del proveedor (${provider.id}) quedó bloqueado y hay que corregirlo en el CLI`,
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const prose = SUBJECT_PROSE[observed.state];
|
|
110
|
+
const authenticated = observed.state === "present";
|
|
111
|
+
const finding = {
|
|
112
|
+
...base,
|
|
113
|
+
state: authFindingState(observed.state),
|
|
114
|
+
summary: prose.summary(subject.label),
|
|
115
|
+
impact: prose.impact,
|
|
116
|
+
// Al sano no se le ofrece nada: no hay remedio para lo que no está roto. Los
|
|
117
|
+
// otros dos llevan la guía del proveedor, que nombra la variable y el archivo
|
|
118
|
+
// y nunca el valor.
|
|
119
|
+
remediation: authenticated
|
|
120
|
+
? { kind: "none", action: null, guidance: [] }
|
|
121
|
+
: { kind: "manual", action: null, guidance: provider.guidance(subject, input.ctx) },
|
|
122
|
+
};
|
|
123
|
+
// Un flujo declarado que pasa la custodia es una SUGERENCIA, no una acción:
|
|
124
|
+
// quién la recibe lo decide el anotador, en un solo lugar, con los predicados
|
|
125
|
+
// de propiedad. Y al sano no se le sugiere: la sugerencia existe para que algo
|
|
126
|
+
// se repare.
|
|
127
|
+
if (flow === null || authenticated)
|
|
128
|
+
return finding;
|
|
129
|
+
return {
|
|
130
|
+
...finding,
|
|
131
|
+
proposal: { op: "auth.flow", args: { provider: provider.id, subject: subject.id }, flow },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Qué se observó del sujeto: la lectura barata, o la verificación si se pidió.
|
|
136
|
+
*
|
|
137
|
+
* La verificación REEMPLAZA a `check` en vez de acompañarla. Son dos lecturas
|
|
138
|
+
* del mismo hecho, y ponerlas juntas en la evidencia las hace leer como dos
|
|
139
|
+
* hechos distintos; la verificación es la observación más fuerte y es la que
|
|
140
|
+
* queda.
|
|
141
|
+
*
|
|
142
|
+
* Y el nivel de autorización que el proveedor DECLARA se hace valer acá, que es
|
|
143
|
+
* el único lugar que llama a `verify`. Antes el campo `authorization` no lo leía
|
|
144
|
+
* nadie: cada proveedor repetía el control adentro de su propio `run`, así que la
|
|
145
|
+
* declaración podía mentir sin consecuencia y un proveedor nuevo que se olvidara
|
|
146
|
+
* del control salía de la máquina en una corrida donde nadie autorizó nada. Con
|
|
147
|
+
* el control acá, `run` puede confiar en que su autorización está concedida.
|
|
148
|
+
*
|
|
149
|
+
* Cuando falta esa autorización la observación se DEGRADA a la lectura barata y
|
|
150
|
+
* lo dice en la evidencia: una verificación que no corrió y se calla se lee como
|
|
151
|
+
* una que corrió.
|
|
152
|
+
*/
|
|
153
|
+
async function observe(provider, subject, input) {
|
|
154
|
+
const granted = input.verifyAuthorization;
|
|
155
|
+
if (granted === undefined)
|
|
156
|
+
return await provider.check(subject, input.ctx);
|
|
157
|
+
const needed = provider.verify.authorization;
|
|
158
|
+
if (needed !== null && !granted.includes(needed)) {
|
|
159
|
+
const shallow = await provider.check(subject, input.ctx);
|
|
160
|
+
return {
|
|
161
|
+
...shallow,
|
|
162
|
+
evidence: [
|
|
163
|
+
...shallow.evidence,
|
|
164
|
+
`la verificación profunda NO corrió: esta corrida no autorizó '${needed}' (lo autoriza \`aw doctor --verify-connection\`)`,
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return await provider.verify.run(subject, input.ctx, granted);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Dos sujetos con el mismo id, denunciado en vez de perdido.
|
|
172
|
+
*
|
|
173
|
+
* El id del sujeto es la identidad del hallazgo. Dos iguales colapsan en una
|
|
174
|
+
* fila y el informe pierde uno sin decir nada — el mismo defecto que ya costó
|
|
175
|
+
* una ronda en este plan, cuando sanear un id lo volvió no inyectivo y los
|
|
176
|
+
* hallazgos desaparecieron de un `Map`. Así que la colisión es bloqueante y
|
|
177
|
+
* nombra a los dos proveedores.
|
|
178
|
+
*/
|
|
179
|
+
function collisionFinding(subject, owner, duplicate) {
|
|
180
|
+
return {
|
|
181
|
+
// El id lleva al proveedor DUPLICADO y no sólo al sujeto: con tres
|
|
182
|
+
// proveedores declarando lo mismo, dos colisiones distintas colapsarían en
|
|
183
|
+
// una fila y el informe volvería a perder un hallazgo — que es exactamente
|
|
184
|
+
// el defecto que esta rama existe para denunciar.
|
|
185
|
+
id: doctorFindingId(SCOPE_HOST, CATEGORY, `colision:${duplicate}:${subject.id}`),
|
|
186
|
+
host: SCOPE_HOST,
|
|
187
|
+
category: CATEGORY,
|
|
188
|
+
resource: { kind: "credential", name: subject.label, locator: subject.locator },
|
|
189
|
+
state: "blocking",
|
|
190
|
+
summary: `dos proveedores de autenticación declaran el sujeto ${subject.id}`,
|
|
191
|
+
impact: "uno de los dos no se comprobó y el informe no puede hablar por él",
|
|
192
|
+
evidence: [`lo declaran los proveedores (${owner}) y (${duplicate})`],
|
|
193
|
+
ownership: "ours",
|
|
194
|
+
remediation: {
|
|
195
|
+
kind: "manual",
|
|
196
|
+
action: null,
|
|
197
|
+
guidance: [`prefijá los ids de sujeto del proveedor (${duplicate}) para que no colisionen`],
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=provider-tools-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-tools-auth.js","sourceRoot":"","sources":["../../../src/application/doctor/provider-tools-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAIL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAsB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAA8B,MAAM,oBAAoB,CAAC;AAEvF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,QAAQ,GAAG,YAAqB,CAAC;AACvC,MAAM,UAAU,GAAG,WAAW,CAAC;AAO/B,MAAM,UAAU,uBAAuB,CAAC,OAA8B,EAAE;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAqB,CAAC;IAC1D,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,KAAK,CAAC,GAAG,CAAC,KAA0B;YAClC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChD,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CACvE,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ,EAAE;wBACR,QAAQ,CACN,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,6DAA6D,CAC9D;qBACF;oBACD,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;YACvC,KAAK,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7D,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAmB,uBAAuB,EAAE,CAAC;AAE3E;;;;;;;;GAQG;AACH,MAAM,aAAa,GAGf;IACF,OAAO,EAAE;QACP,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,KAAK,iBAAiB;QAClE,MAAM,EAAE,8DAA8D;KACvE;IACD,MAAM,EAAE;QACN,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,KAAK,GAAG;QAC1D,MAAM,EAAE,qEAAqE;KAC9E;IACD,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,6CAA6C,KAAK,GAAG;QACzE,MAAM,EAAE,kFAAkF;KAC3F;CACF,CAAC;AAEF,KAAK,UAAU,cAAc,CAC3B,QAA+B,EAC/B,OAA0B,EAC1B,KAA0B;IAE1B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAqB,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;QACxF,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,SAAS,EAAE,MAAe;KAC3B,CAAC;IAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtC,2EAA2E;QAC3E,uEAAuE;QACvE,uEAAuE;QACvE,yBAAyB;QACzB,OAAO;YACL,GAAG,IAAI;YACP,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,4BAA4B,OAAO,CAAC,KAAK,8CAA8C;YAChG,MAAM,EAAE,8EAA8E;YACtF,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,aAAa,OAAO,EAAE,CAAC;YACxD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE;oBACR,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC;oBACxC,2BAA2B,QAAQ,CAAC,EAAE,kDAAkD;iBACzF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC;IACnD,MAAM,OAAO,GAAkB;QAC7B,GAAG,IAAI;QACP,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACrC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,6EAA6E;QAC7E,8EAA8E;QAC9E,oBAAoB;QACpB,WAAW,EAAE,aAAa;YACxB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;KACtF,CAAC;IACF,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,aAAa;IACb,IAAI,IAAI,KAAK,IAAI,IAAI,aAAa;QAAE,OAAO,OAAO,CAAC;IACnD,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;KAC1F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,OAAO,CACpB,QAA+B,EAC/B,OAA0B,EAC1B,KAA0B;IAE1B,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC;IAC1C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACzD,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE;gBACR,GAAG,OAAO,CAAC,QAAQ;gBACnB,iEAAiE,MAAM,mDAAmD;aAC3H;SACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACvB,OAA0B,EAC1B,KAAa,EACb,SAAiB;IAEjB,OAAO;QACL,mEAAmE;QACnE,2EAA2E;QAC3E,2EAA2E;QAC3E,kDAAkD;QAClD,EAAE,EAAE,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,SAAS,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QAChF,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;QAC/E,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,uDAAuD,OAAO,CAAC,EAAE,EAAE;QAC5E,MAAM,EAAE,mEAAmE;QAC3E,QAAQ,EAAE,CAAC,gCAAgC,KAAK,QAAQ,SAAS,GAAG,CAAC;QACrE,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,CAAC,4CAA4C,SAAS,0BAA0B,CAAC;SAC5F;KACF,CAAC;AACJ,CAAC"}
|