@tacuchi/agent-workflow-cli 20.26.0 → 21.1.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 +2 -1
- package/dist/adapters/node-file-system.js +3 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/capability/compose.js +161 -0
- package/dist/application/capability/compose.js.map +1 -0
- package/dist/application/capability/descriptor-loader.js +109 -0
- package/dist/application/capability/descriptor-loader.js.map +1 -0
- package/dist/application/capability/design-handler.js +299 -0
- package/dist/application/capability/design-handler.js.map +1 -0
- package/dist/application/capability/dispatcher.js +312 -0
- package/dist/application/capability/dispatcher.js.map +1 -0
- package/dist/application/capability/durable-effect.js +220 -0
- package/dist/application/capability/durable-effect.js.map +1 -0
- package/dist/application/capability/installed-inventory.js +168 -0
- package/dist/application/capability/installed-inventory.js.map +1 -0
- package/dist/application/capability/readiness.js +204 -0
- package/dist/application/capability/readiness.js.map +1 -0
- package/dist/application/capability/resolution.js +264 -0
- package/dist/application/capability/resolution.js.map +1 -0
- package/dist/application/capability/wrapper.js +187 -0
- package/dist/application/capability/wrapper.js.map +1 -0
- package/dist/application/context/manifest.js +11 -5
- package/dist/application/context/manifest.js.map +1 -1
- package/dist/application/context/measure.js +5 -2
- package/dist/application/context/measure.js.map +1 -1
- package/dist/application/context/plan-service.js +6 -6
- package/dist/application/context/plan-service.js.map +1 -1
- package/dist/application/design/design-bundle-service.js +148 -0
- package/dist/application/design/design-bundle-service.js.map +1 -0
- package/dist/application/design/design-gate-service.js +246 -0
- package/dist/application/design/design-gate-service.js.map +1 -0
- package/dist/application/design/design-graph-service.js +85 -0
- package/dist/application/design/design-graph-service.js.map +1 -0
- package/dist/application/design/design-index-service.js +132 -0
- package/dist/application/design/design-index-service.js.map +1 -0
- package/dist/application/design/design-proposal-service.js +69 -0
- package/dist/application/design/design-proposal-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +756 -0
- package/dist/application/design/design-publish-service.js.map +1 -0
- package/dist/application/design/design-record-service.js +100 -0
- package/dist/application/design/design-record-service.js.map +1 -0
- package/dist/application/design/design-resolver-service.js +165 -0
- package/dist/application/design/design-resolver-service.js.map +1 -0
- package/dist/application/flow/advance.js +533 -0
- package/dist/application/flow/advance.js.map +1 -0
- package/dist/application/flow/flow-service.js +65 -0
- package/dist/application/flow/flow-service.js.map +1 -0
- package/dist/application/flow/run-projection.js +80 -0
- package/dist/application/flow/run-projection.js.map +1 -0
- package/dist/application/flow/run-state-service.js +107 -0
- package/dist/application/flow/run-state-service.js.map +1 -0
- package/dist/application/flow/submit.js +423 -0
- package/dist/application/flow/submit.js.map +1 -0
- package/dist/application/resume-service.js +46 -14
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/install-skill.js +11 -0
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -0
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +18 -12
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/semantic-operation/publish.js +56 -9
- package/dist/application/semantic-operation/publish.js.map +1 -1
- package/dist/application/skills-resolver-service.js +27 -6
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +5 -1
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +6 -0
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +22 -2
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/capability.js +182 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/designs.js +110 -0
- package/dist/cli/commands/designs.js.map +1 -0
- package/dist/cli/commands/flow.js +71 -0
- package/dist/cli/commands/flow.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/resume.js +8 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/skills.js +55 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +50 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +9 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +7 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +5 -0
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +5 -1
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/domain/capability/descriptor.js +553 -0
- package/dist/domain/capability/descriptor.js.map +1 -0
- package/dist/domain/capability/effects.js +90 -0
- package/dist/domain/capability/effects.js.map +1 -0
- package/dist/domain/capability/protocol.js +494 -0
- package/dist/domain/capability/protocol.js.map +1 -0
- package/dist/domain/contract-reader.js +84 -0
- package/dist/domain/contract-reader.js.map +1 -0
- package/dist/domain/design/adapter.js +161 -0
- package/dist/domain/design/adapter.js.map +1 -0
- package/dist/domain/design/artifact-body.js +223 -0
- package/dist/domain/design/artifact-body.js.map +1 -0
- package/dist/domain/design/artifact.js +750 -0
- package/dist/domain/design/artifact.js.map +1 -0
- package/dist/domain/design/baseline.js +359 -0
- package/dist/domain/design/baseline.js.map +1 -0
- package/dist/domain/design/capability.js +310 -0
- package/dist/domain/design/capability.js.map +1 -0
- package/dist/domain/design/closure.js +161 -0
- package/dist/domain/design/closure.js.map +1 -0
- package/dist/domain/design/direct.js +108 -0
- package/dist/domain/design/direct.js.map +1 -0
- package/dist/domain/design/external-send.js +65 -0
- package/dist/domain/design/external-send.js.map +1 -0
- package/dist/domain/design/governance.js +298 -0
- package/dist/domain/design/governance.js.map +1 -0
- package/dist/domain/design/identity.js +145 -0
- package/dist/domain/design/identity.js.map +1 -0
- package/dist/domain/design/manifest.js +552 -0
- package/dist/domain/design/manifest.js.map +1 -0
- package/dist/domain/design/maturity.js +305 -0
- package/dist/domain/design/maturity.js.map +1 -0
- package/dist/domain/design/naming.js +117 -0
- package/dist/domain/design/naming.js.map +1 -0
- package/dist/domain/design/offline.js +92 -0
- package/dist/domain/design/offline.js.map +1 -0
- package/dist/domain/design/profiles.js +212 -0
- package/dist/domain/design/profiles.js.map +1 -0
- package/dist/domain/design/projections.js +165 -0
- package/dist/domain/design/projections.js.map +1 -0
- package/dist/domain/design/proposal.js +234 -0
- package/dist/domain/design/proposal.js.map +1 -0
- package/dist/domain/design/reference.js +234 -0
- package/dist/domain/design/reference.js.map +1 -0
- package/dist/domain/design/render-bundle.js +0 -0
- package/dist/domain/design/render-bundle.js.map +1 -0
- package/dist/domain/design/rendition.js +472 -0
- package/dist/domain/design/rendition.js.map +1 -0
- package/dist/domain/design/retired.js +61 -0
- package/dist/domain/design/retired.js.map +1 -0
- package/dist/domain/design/revision.js +219 -0
- package/dist/domain/design/revision.js.map +1 -0
- package/dist/domain/design/secrets.js +86 -0
- package/dist/domain/design/secrets.js.map +1 -0
- package/dist/domain/design/sources.js +180 -0
- package/dist/domain/design/sources.js.map +1 -0
- package/dist/domain/design/validation.js +19 -0
- package/dist/domain/design/validation.js.map +1 -0
- package/dist/domain/design/visual-evidence.js +155 -0
- package/dist/domain/design/visual-evidence.js.map +1 -0
- package/dist/domain/design/yaml-subset.js +390 -0
- package/dist/domain/design/yaml-subset.js.map +1 -0
- package/dist/domain/flow/answer.js +459 -0
- package/dist/domain/flow/answer.js.map +1 -0
- package/dist/domain/flow/authority.js +2276 -0
- package/dist/domain/flow/authority.js.map +1 -0
- package/dist/domain/flow/authorization.js +62 -0
- package/dist/domain/flow/authorization.js.map +1 -0
- package/dist/domain/flow/directive.js +421 -0
- package/dist/domain/flow/directive.js.map +1 -0
- package/dist/domain/flow/rules.js +140 -0
- package/dist/domain/flow/rules.js.map +1 -0
- package/dist/domain/flow/run-state.js +317 -0
- package/dist/domain/flow/run-state.js.map +1 -0
- package/dist/domain/harnesses.js +21 -0
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/safe-path.js +23 -0
- package/dist/domain/safe-path.js.map +1 -0
- package/dist/domain/skills.js +26 -3
- package/dist/domain/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +15 -13
- package/skills/w/artifacts/README.md +3 -4
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +2 -2
- package/skills/w/commands/plan-exec.md +11 -5
- package/skills/w/commands/plan-new.md +6 -2
- package/skills/w/commands/plan-refine.md +6 -3
- package/skills/w/commands/quick.md +2 -2
- package/skills/w/commands/spec-new.md +2 -2
- package/skills/w/commands/spec-refine.md +1 -0
- package/skills/w/context/MANIFEST.json +57 -9
- package/skills/w/harness/HARNESS.md +20 -0
- package/skills/w/loops/CHASSIS.md +11 -20
- package/skills/w/loops/CODE-POLICIES.md +18 -9
- package/skills/w/loops/README.md +1 -1
- package/skills/w/loops/plan-exec-loop/LOOP.md +126 -62
- package/skills/w/loops/plan-new-loop/LOOP.md +71 -73
- package/skills/w/loops/plan-refine-loop/LOOP.md +20 -10
- package/skills/w/loops/quick-loop/LOOP.md +18 -26
- package/skills/w/loops/spec-refine-loop/LOOP.md +28 -30
- package/skills/w/modules/COMPACTION.md +2 -6
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +2 -0
- package/skills/w/modules/DESIGN-REFERENCES.md +113 -0
- package/skills/w/modules/IDEATION-GATE.md +3 -3
- package/skills/w/modules/PERSIST-ROUTING.md +1 -0
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +65 -0
- package/skills/w/modules/PLAN-INPUT.md +5 -3
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +3 -1
- package/skills/w/modules/PLAN-SPLIT-GATE.md +7 -5
- package/skills/w/modules/PROMPT-CONTINUITY.md +3 -1
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +4 -4
- package/skills/w/roles/README.md +9 -5
- package/skills/w/roles/design/CONTRACT.md +80 -0
- package/skills/w/roles/design/ROLE.md +224 -0
- package/skills/w/schemas/capability-descriptor.schema.json +260 -0
- package/skills/w/schemas/design/design-baseline.v1.schema.json +71 -0
- package/skills/w/schemas/design/design-manifest.v1.schema.json +322 -0
- package/skills/w/schemas/design/design-render-bundle.v1.schema.json +191 -0
- package/skills/w/schemas/design/design-rendition.v1.schema.json +232 -0
- package/skills/w/schemas/design/design-review.v1.schema.json +72 -0
- package/skills/w/schemas/design/design-revocation.v1.schema.json +54 -0
- package/skills/w/schemas/design/ui-flow.v1.schema.json +211 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +242 -0
- package/skills/w/artifacts/artifacts-design/SPEC.md +0 -42
- package/skills/w/modules/PLAN-DESIGN-SPECS.md +0 -12
- package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +0 -7
- package/skills/w/roles/ui-spec/ROLE.md +0 -147
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one road into a capability — for the direct wrapper and for a flow alike.
|
|
3
|
+
*
|
|
4
|
+
* Everything a caller can influence goes through here: the envelope is built by
|
|
5
|
+
* the shared builder, the capability is resolved against real instances, the
|
|
6
|
+
* effects are authorized before anything runs, and the attempt comes back as
|
|
7
|
+
* outcome + output + receipt. Neither route can take a shortcut around it
|
|
8
|
+
* without the difference showing up in a digest, which is what makes
|
|
9
|
+
* "the two routes share a contract" a checkable property.
|
|
10
|
+
*
|
|
11
|
+
* The four verbs are STAGES of the adapter, not a second operation table. The
|
|
12
|
+
* operation (`create`, `validate`, …) travels in the envelope; `prepare`,
|
|
13
|
+
* `continue`, `validate` and `apply` say where in the durable handshake the
|
|
14
|
+
* attempt is. A capability with a sixth operation adds it to its descriptor; it
|
|
15
|
+
* never adds a verb here.
|
|
16
|
+
*
|
|
17
|
+
* Handlers register themselves by capability NAME in a registry. That is the
|
|
18
|
+
* mechanism behind "no branches by name": adding a capability means adding a
|
|
19
|
+
* descriptor and a handler, and nothing in SPEC, PLAN or QUICK changes.
|
|
20
|
+
*/
|
|
21
|
+
import { findOperation, } from "../../domain/capability/descriptor.js";
|
|
22
|
+
import { authorizeEffects } from "../../domain/capability/effects.js";
|
|
23
|
+
import { buildCapabilityRequest, buildReceipt, checkWorkspaceRequirement, continueInvocation, newInvocationId, receiptPersistence, } from "../../domain/capability/protocol.js";
|
|
24
|
+
import { RETIRED_SKILL_IDENTITIES, classifyCapabilityBinding } from "../../domain/skills.js";
|
|
25
|
+
import { resolveSkills } from "../skills-resolver-service.js";
|
|
26
|
+
import { applyDurableEffect, prepareDurableEffect, reconcileAfterFailure, } from "./durable-effect.js";
|
|
27
|
+
import { buildCapabilityInventory } from "./installed-inventory.js";
|
|
28
|
+
import { checkPin, pinSelection, resolveCapability, } from "./resolution.js";
|
|
29
|
+
const HANDLERS = new Map();
|
|
30
|
+
export function registerCapability(handler) {
|
|
31
|
+
HANDLERS.set(handler.descriptor.name, handler);
|
|
32
|
+
}
|
|
33
|
+
export function capabilityHandler(name) {
|
|
34
|
+
return HANDLERS.get(name) ?? null;
|
|
35
|
+
}
|
|
36
|
+
export function registeredCapabilities() {
|
|
37
|
+
return [...HANDLERS.keys()].sort();
|
|
38
|
+
}
|
|
39
|
+
export async function dispatchCapability(input, ctx) {
|
|
40
|
+
const retired = RETIRED_SKILL_IDENTITIES.get(input.capability.toLowerCase());
|
|
41
|
+
if (retired !== undefined) {
|
|
42
|
+
// Not an alias, and not a silent fallback to the live name either: honoring
|
|
43
|
+
// it here would make the retired name an accepted one.
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
failure: {
|
|
47
|
+
code: "CAPABILITY_NAME_RETIRED",
|
|
48
|
+
message: `'${input.capability}' está retirado — ${retired}`,
|
|
49
|
+
action: "invocá la capacidad por su nombre vigente: 'design'",
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const handler = capabilityHandler(input.capability);
|
|
54
|
+
if (handler === null) {
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
failure: {
|
|
58
|
+
code: "CAPABILITY_UNKNOWN",
|
|
59
|
+
message: `no hay ninguna capacidad registrada con el nombre '${input.capability}'`,
|
|
60
|
+
action: `usá una de: ${registeredCapabilities().join(", ") || "(ninguna)"}`,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (input.verb === "apply")
|
|
65
|
+
return applyStage(input, ctx, handler);
|
|
66
|
+
return attemptStage(input, ctx, handler);
|
|
67
|
+
}
|
|
68
|
+
async function attemptStage(input, ctx, handler) {
|
|
69
|
+
const { descriptor } = handler;
|
|
70
|
+
const resolved = await resolveFor(input, ctx, descriptor);
|
|
71
|
+
const operationName = input.operation ?? input.parent?.operation ?? descriptor.default_operation;
|
|
72
|
+
if (operationName === null || operationName === undefined) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
failure: {
|
|
76
|
+
code: "CAPABILITY_OPERATION_MISSING",
|
|
77
|
+
message: `'${descriptor.name}' no declara operación por defecto`,
|
|
78
|
+
action: `nombrá la operación: ${descriptor.operations.map((o) => o.name).join(", ")}`,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const built = buildFor(input, ctx, descriptor, operationName);
|
|
83
|
+
if (!built.ok)
|
|
84
|
+
return { ok: false, failure: built.failure };
|
|
85
|
+
const { request, operation } = built;
|
|
86
|
+
// A continuation runs against the selection the FIRST attempt fixed. If those
|
|
87
|
+
// bytes moved, the conversation is answering something that no longer exists.
|
|
88
|
+
if (input.pin != null) {
|
|
89
|
+
const stillThere = checkPin(input.pin, await buildCapabilityInventory(ctx.fs, ctx.env));
|
|
90
|
+
if (!stillThere.ok) {
|
|
91
|
+
return receiptOf(request, descriptor, resolved, {
|
|
92
|
+
kind: "blocked",
|
|
93
|
+
failure: {
|
|
94
|
+
code: "CAPABILITY_SELECTION_CHANGED",
|
|
95
|
+
message: stillThere.degradation.loss,
|
|
96
|
+
action: stillThere.action,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const blocked = blockedByResolution(resolved, operation);
|
|
102
|
+
if (blocked !== null) {
|
|
103
|
+
return receiptOf(request, descriptor, resolved, {
|
|
104
|
+
kind: "blocked",
|
|
105
|
+
failure: blocked,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const workspace = checkWorkspaceRequirement(operation, request.context);
|
|
109
|
+
if (!workspace.ok) {
|
|
110
|
+
return receiptOf(request, descriptor, resolved, {
|
|
111
|
+
kind: "blocked",
|
|
112
|
+
failure: workspace.failure,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const authorization = authorizeEffects(operation.effects, {
|
|
116
|
+
sensitiveSources: input.sensitiveSources === true,
|
|
117
|
+
scopeExpanded: false,
|
|
118
|
+
}, ctx.effectPolicy);
|
|
119
|
+
const result = await handler.run({
|
|
120
|
+
...ctx,
|
|
121
|
+
verb: input.verb,
|
|
122
|
+
request,
|
|
123
|
+
operation,
|
|
124
|
+
answer: input.answer ?? null,
|
|
125
|
+
});
|
|
126
|
+
if (result.kind !== "durable")
|
|
127
|
+
return receiptOf(request, descriptor, resolved, result);
|
|
128
|
+
const prepared = prepareDurableEffect({
|
|
129
|
+
request,
|
|
130
|
+
authorization,
|
|
131
|
+
artifacts: result.artifacts,
|
|
132
|
+
base: result.base ?? null,
|
|
133
|
+
});
|
|
134
|
+
if (!prepared.ok) {
|
|
135
|
+
return receiptOf(request, descriptor, resolved, {
|
|
136
|
+
kind: "blocked",
|
|
137
|
+
failure: prepared.failure,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// A durable candidate is not an applied one. The attempt stops here with the
|
|
141
|
+
// preview and the seal, and `apply` is a separate, authorized step.
|
|
142
|
+
return receiptOf(request, descriptor, resolved, {
|
|
143
|
+
kind: "needs_input",
|
|
144
|
+
gaps: [
|
|
145
|
+
`aprobación visible para: ${prepared.plan.requires_approval.join(", ") || "publicar los artefactos propuestos"}`,
|
|
146
|
+
],
|
|
147
|
+
}, { plan: prepared.plan, output: result.output, authorization });
|
|
148
|
+
}
|
|
149
|
+
async function applyStage(input, ctx, handler) {
|
|
150
|
+
const { descriptor } = handler;
|
|
151
|
+
if (input.plan == null || input.approval == null || input.request == null) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
failure: {
|
|
155
|
+
code: "CAPABILITY_APPLY_INCOMPLETE",
|
|
156
|
+
message: "apply necesita el plan, su request y la aprobación",
|
|
157
|
+
action: "pasá el plan que devolvió validate junto con el digest aprobado",
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (ctx.workspace === null) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
failure: {
|
|
165
|
+
code: "CAPABILITY_WORKSPACE_REQUIRED",
|
|
166
|
+
message: "aplicar un efecto durable necesita un workspace",
|
|
167
|
+
action: "corré apply dentro del workspace donde se preparó la propuesta",
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const resolved = await resolveFor(input, ctx, descriptor);
|
|
172
|
+
const operation = findOperation(descriptor, input.request.operation);
|
|
173
|
+
const authorization = authorizeEffects(operation.effects, { sensitiveSources: input.sensitiveSources === true, scopeExpanded: false }, ctx.effectPolicy);
|
|
174
|
+
const applied = await applyDurableEffect(ctx.fs, ctx.paths, {
|
|
175
|
+
root: ctx.workspace,
|
|
176
|
+
plan: input.plan,
|
|
177
|
+
approval: input.approval,
|
|
178
|
+
selfAuthorized: authorization.selfAuthorized,
|
|
179
|
+
});
|
|
180
|
+
if (!applied.ok) {
|
|
181
|
+
// Whatever landed is enumerated with the failure, and the next action is a
|
|
182
|
+
// reconciliation — never a shrug that reads as "nothing happened".
|
|
183
|
+
const reconciliation = reconcileAfterFailure("failed", applied.applied.map((cls) => ({ class: cls, what: `efecto '${cls}' ya aplicado` })));
|
|
184
|
+
return receiptOf(input.request, descriptor, resolved, { kind: "blocked", failure: { ...applied.failure, action: reconciliation.next_action } }, { applied: reconciliation.applied, authorization });
|
|
185
|
+
}
|
|
186
|
+
return receiptOf(input.request, descriptor, resolved, {
|
|
187
|
+
kind: "completed",
|
|
188
|
+
output: {
|
|
189
|
+
value: { written: applied.result.written },
|
|
190
|
+
reference: null,
|
|
191
|
+
completeness: "complete",
|
|
192
|
+
},
|
|
193
|
+
}, { applied: applied.result.applied, authorization });
|
|
194
|
+
}
|
|
195
|
+
async function resolveFor(input, ctx, descriptor) {
|
|
196
|
+
const skills = await resolveSkills(ctx.fs, ctx.paths);
|
|
197
|
+
const slot = skills.skills[descriptor.name];
|
|
198
|
+
const binding = slot === undefined
|
|
199
|
+
? { state: "floor_and_improvements", reason: null, action: null }
|
|
200
|
+
: classifyCapabilityBinding(slot, descriptor.name);
|
|
201
|
+
const inventory = await buildCapabilityInventory(ctx.fs, ctx.env);
|
|
202
|
+
return resolveCapability({
|
|
203
|
+
descriptor,
|
|
204
|
+
binding,
|
|
205
|
+
inventory,
|
|
206
|
+
hostSelection: input.hostSelection ?? null,
|
|
207
|
+
operation: input.operation ?? input.parent?.operation ?? null,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function blockedByResolution(resolved, operation) {
|
|
211
|
+
const availability = resolved.operations.find((o) => o.operation === operation.name);
|
|
212
|
+
if (availability === undefined || availability.available)
|
|
213
|
+
return null;
|
|
214
|
+
return {
|
|
215
|
+
code: resolved.state === "disabled" ? "CAPABILITY_OPERATION_OFF" : "CAPABILITY_UNAVAILABLE",
|
|
216
|
+
message: availability.reason ?? `'${operation.name}' no está disponible`,
|
|
217
|
+
action: resolved.action ?? "revisá 'aw skills --detail' para ver el estado de la capacidad",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function buildFor(input, ctx, descriptor, operationName) {
|
|
221
|
+
const caller = { route: input.route, host: ctx.host, flow: input.flow ?? null };
|
|
222
|
+
const context = {
|
|
223
|
+
workspace: ctx.workspace,
|
|
224
|
+
target: input.target ?? null,
|
|
225
|
+
base: input.base ?? null,
|
|
226
|
+
profile: input.profile ?? null,
|
|
227
|
+
};
|
|
228
|
+
const policy = {
|
|
229
|
+
sensitive_sources: input.sensitiveSources === true,
|
|
230
|
+
external_transmission: input.externalTransmission === true,
|
|
231
|
+
};
|
|
232
|
+
const built = input.verb === "continue" && input.parent != null
|
|
233
|
+
? continueInvocation({
|
|
234
|
+
parent: input.parent,
|
|
235
|
+
descriptor,
|
|
236
|
+
inputs: input.inputs ?? [],
|
|
237
|
+
caller,
|
|
238
|
+
context,
|
|
239
|
+
policy,
|
|
240
|
+
authorizations: [],
|
|
241
|
+
})
|
|
242
|
+
: buildCapabilityRequest({
|
|
243
|
+
invocationId: input.parent?.invocation_id ?? newInvocationId(),
|
|
244
|
+
attempt: 1,
|
|
245
|
+
descriptor,
|
|
246
|
+
operation: operationName,
|
|
247
|
+
caller,
|
|
248
|
+
context,
|
|
249
|
+
inputs: input.inputs ?? [],
|
|
250
|
+
policy,
|
|
251
|
+
authorizations: [],
|
|
252
|
+
parentRequestDigest: null,
|
|
253
|
+
});
|
|
254
|
+
if (!built.ok)
|
|
255
|
+
return { ok: false, failure: built.failure };
|
|
256
|
+
return { ok: true, request: built.request, operation: built.operation };
|
|
257
|
+
}
|
|
258
|
+
function receiptOf(request, descriptor, resolution, result, extras = {}) {
|
|
259
|
+
const dispositions = request.inputs.map((i) => ({
|
|
260
|
+
name: i.name,
|
|
261
|
+
used: true,
|
|
262
|
+
reason: null,
|
|
263
|
+
provenance: i.provenance,
|
|
264
|
+
}));
|
|
265
|
+
const output = result.kind === "completed" ? result.output : (extras.output ?? null);
|
|
266
|
+
const built = buildReceipt({
|
|
267
|
+
request,
|
|
268
|
+
descriptor,
|
|
269
|
+
outcome: result.kind === "durable" ? "completed" : result.kind,
|
|
270
|
+
floor: resolution.floor,
|
|
271
|
+
selection: resolution.selection,
|
|
272
|
+
inputs: dispositions,
|
|
273
|
+
output,
|
|
274
|
+
validations: result.kind === "completed" ? (result.validations ?? []) : [],
|
|
275
|
+
effects: {
|
|
276
|
+
planned: [...(extras.authorization?.planned ?? [])],
|
|
277
|
+
approved: [...(extras.authorization?.needsPreflight ?? [])].filter((c) => (extras.applied ?? []).includes(c)),
|
|
278
|
+
applied: [...(extras.applied ?? [])],
|
|
279
|
+
},
|
|
280
|
+
degradations: resolution.degradations,
|
|
281
|
+
gaps: result.kind === "needs_input" ? result.gaps : [],
|
|
282
|
+
error: result.kind === "blocked" ? result.failure : null,
|
|
283
|
+
nextAction: nextAction(result, resolution),
|
|
284
|
+
});
|
|
285
|
+
if (!built.ok)
|
|
286
|
+
return { ok: false, failure: built.failure };
|
|
287
|
+
return {
|
|
288
|
+
ok: true,
|
|
289
|
+
attempt: {
|
|
290
|
+
request,
|
|
291
|
+
receipt: built.receipt,
|
|
292
|
+
output,
|
|
293
|
+
resolution,
|
|
294
|
+
pin: pinSelection(resolution, descriptor),
|
|
295
|
+
persistence: receiptPersistence(built.receipt),
|
|
296
|
+
plan: extras.plan ?? null,
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function nextAction(result, resolution) {
|
|
301
|
+
if (result.kind === "needs_input") {
|
|
302
|
+
return "contestá con 'aw capability continue' o, si hay una propuesta, aprobala y corré 'apply'";
|
|
303
|
+
}
|
|
304
|
+
if (result.kind === "blocked")
|
|
305
|
+
return result.failure.action;
|
|
306
|
+
if (result.kind === "durable")
|
|
307
|
+
return "revisá la propuesta y aprobala para aplicarla";
|
|
308
|
+
return resolution.degradations.length > 0
|
|
309
|
+
? "el resultado salió del floor: revisá la degradación del receipt"
|
|
310
|
+
: "nada pendiente: el intento se completó";
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../src/application/capability/dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bridge from a capability attempt to the durable handshake that already
|
|
3
|
+
* exists — and the line that keeps the two from merging.
|
|
4
|
+
*
|
|
5
|
+
* `prepare → validate → apply` is how this repo previews, approves and writes.
|
|
6
|
+
* It is not a conversation, and a capability's attempts are not stages of it.
|
|
7
|
+
* The distinction is load-bearing: an operation that only reads, or an attempt
|
|
8
|
+
* that answers `needs_input`, must not manufacture a preview and an approval for
|
|
9
|
+
* something that will never be written. So this adapter is entered ONLY when an
|
|
10
|
+
* attempt is about to produce a durable effect, and it refuses otherwise.
|
|
11
|
+
*
|
|
12
|
+
* What it adds on top of the existing machinery is the four things that have to
|
|
13
|
+
* be true together before the first byte lands: the request is the one that was
|
|
14
|
+
* sealed, the candidate output is the one that was shown, the authorization
|
|
15
|
+
* covers the effect classes about to be exercised, and the base has not moved.
|
|
16
|
+
* Any of the four failing stops before `publishArtifacts` is called at all.
|
|
17
|
+
*/
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { withCwdLock } from "../lock-service.js";
|
|
20
|
+
import { SEMANTIC_PROTOCOL_VERSION, approvalDigest, semanticDigest, } from "../semantic-operation/protocol.js";
|
|
21
|
+
import { publishArtifacts } from "../semantic-operation/publish.js";
|
|
22
|
+
/**
|
|
23
|
+
* The one way to digest a base.
|
|
24
|
+
*
|
|
25
|
+
* Two conventions for "the digest of this file" is a comparison that fails for a
|
|
26
|
+
* reason nobody can see: prepare would seal one form and apply recompute the
|
|
27
|
+
* other, and every publication would look stale. Exported so both sides call the
|
|
28
|
+
* same function rather than each reaching for a hash.
|
|
29
|
+
*/
|
|
30
|
+
export function baseDigest(text) {
|
|
31
|
+
return semanticDigest(text);
|
|
32
|
+
}
|
|
33
|
+
const DURABLE_CLASSES = [
|
|
34
|
+
"local_additive",
|
|
35
|
+
"mutate_overwrite",
|
|
36
|
+
"execute",
|
|
37
|
+
"network_external",
|
|
38
|
+
"destructive",
|
|
39
|
+
];
|
|
40
|
+
export function prepareDurableEffect(input) {
|
|
41
|
+
const durable = input.authorization.planned.filter((c) => DURABLE_CLASSES.includes(c));
|
|
42
|
+
if (durable.length === 0) {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
failure: {
|
|
46
|
+
code: "CAPABILITY_EFFECT_NOT_DURABLE",
|
|
47
|
+
message: `'${input.request.operation}' no declara ningún efecto durable`,
|
|
48
|
+
action: "una operación read-only devuelve su resultado y no atraviesa preview ni aprobación",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (input.authorization.denied.length > 0) {
|
|
53
|
+
const first = input.authorization.denied[0];
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
failure: {
|
|
57
|
+
code: "CAPABILITY_EFFECT_DENIED",
|
|
58
|
+
message: `la política del host no admite el efecto '${first?.class}'`,
|
|
59
|
+
action: "quitá la operación o ajustá la política del host, que siempre prevalece",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (input.artifacts.length === 0) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
failure: {
|
|
67
|
+
code: "CAPABILITY_EFFECT_EMPTY",
|
|
68
|
+
message: "no hay ningún artefacto candidato que publicar",
|
|
69
|
+
action: "producí el output antes de preparar el efecto durable",
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const response = asSemanticResponse(input.request, input.artifacts);
|
|
74
|
+
return {
|
|
75
|
+
ok: true,
|
|
76
|
+
plan: {
|
|
77
|
+
capability: input.request.capability,
|
|
78
|
+
operation: input.request.operation,
|
|
79
|
+
request_digest: input.request.request_digest,
|
|
80
|
+
semantic_inputs_digest: input.request.semantic_inputs_digest,
|
|
81
|
+
artifacts: input.artifacts,
|
|
82
|
+
preview: input.artifacts.map((a) => ({
|
|
83
|
+
path: a.path,
|
|
84
|
+
bytes: Buffer.byteLength(a.content, "utf8"),
|
|
85
|
+
overwrite: a.overwrite === true,
|
|
86
|
+
})),
|
|
87
|
+
approval_digest: approvalDigest(response),
|
|
88
|
+
requires_approval: [...input.authorization.needsPreflight],
|
|
89
|
+
base: input.base ?? null,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The exact bytes proposed, in the shape the existing seal already understands.
|
|
95
|
+
*
|
|
96
|
+
* Reusing `approvalDigest` rather than inventing a capability-flavoured one is
|
|
97
|
+
* the whole point of the adapter: one seal over "what was approved is what gets
|
|
98
|
+
* written", not two that can disagree.
|
|
99
|
+
*/
|
|
100
|
+
function asSemanticResponse(request, artifacts) {
|
|
101
|
+
return {
|
|
102
|
+
version: SEMANTIC_PROTOCOL_VERSION,
|
|
103
|
+
operation: `${request.capability}.${request.operation}`,
|
|
104
|
+
input_digest: request.semantic_inputs_digest,
|
|
105
|
+
state: "proposed",
|
|
106
|
+
artifacts: artifacts.map((a) => ({ path: a.path, content: a.content })),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export async function applyDurableEffect(fs, paths, input) {
|
|
110
|
+
const gate = checkApproval(input);
|
|
111
|
+
if (gate !== null)
|
|
112
|
+
return { ok: false, failure: gate, applied: [] };
|
|
113
|
+
const stale = await checkBase(fs, input);
|
|
114
|
+
if (stale !== null)
|
|
115
|
+
return { ok: false, failure: stale, applied: [] };
|
|
116
|
+
const outcome = await withCwdLock(fs, paths, async () => publishArtifacts(fs, input.root, input.plan.artifacts));
|
|
117
|
+
if ("error" in outcome) {
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
failure: {
|
|
121
|
+
code: "CAPABILITY_EFFECT_LOCKED",
|
|
122
|
+
message: outcome.error,
|
|
123
|
+
action: "esperá a que se libere el lock del workspace y volvé a aplicar",
|
|
124
|
+
},
|
|
125
|
+
applied: [],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (!outcome.ok) {
|
|
129
|
+
// `publishArtifacts` is all-or-nothing and rolls back, so nothing landed —
|
|
130
|
+
// and saying so explicitly is what makes the empty list a claim rather than
|
|
131
|
+
// an omission.
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
failure: {
|
|
135
|
+
code: outcome.failure.code,
|
|
136
|
+
message: outcome.failure.message,
|
|
137
|
+
action: outcome.failure.action,
|
|
138
|
+
},
|
|
139
|
+
applied: [],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
ok: true,
|
|
144
|
+
result: {
|
|
145
|
+
written: outcome.value.written,
|
|
146
|
+
applied: [...new Set([...input.selfAuthorized, ...input.approval.granted])].filter((c) => DURABLE_CLASSES.includes(c)),
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function checkApproval(input) {
|
|
151
|
+
if (input.approval.digest !== input.plan.approval_digest) {
|
|
152
|
+
return {
|
|
153
|
+
code: "CAPABILITY_APPROVAL_MISMATCH",
|
|
154
|
+
message: "lo aprobado no son los bytes que se van a escribir",
|
|
155
|
+
action: "volvé a preparar el efecto y aprobá la propuesta que se muestra",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const missing = input.plan.requires_approval.filter((c) => !input.approval.granted.includes(c));
|
|
159
|
+
if (missing.length > 0) {
|
|
160
|
+
return {
|
|
161
|
+
code: "CAPABILITY_APPROVAL_MISSING",
|
|
162
|
+
message: `falta aprobación visible para: ${missing.join(", ")}`,
|
|
163
|
+
action: "mostrá datos, destino y efecto, y pedí aprobación antes de aplicar",
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The base has to still be the base.
|
|
170
|
+
*
|
|
171
|
+
* A candidate output computed from revision N and published on top of revision
|
|
172
|
+
* N+1 is a silent overwrite of whatever happened in between — the reason the
|
|
173
|
+
* compare-and-swap exists at all. Re-read at apply, never trusted from prepare.
|
|
174
|
+
*/
|
|
175
|
+
async function checkBase(fs, input) {
|
|
176
|
+
const base = input.plan.base;
|
|
177
|
+
if (base === null)
|
|
178
|
+
return null;
|
|
179
|
+
const absolute = join(input.root, base.path);
|
|
180
|
+
if (!(await fs.exists(absolute))) {
|
|
181
|
+
return {
|
|
182
|
+
code: "CAPABILITY_BASE_GONE",
|
|
183
|
+
message: `la base '${base.path}' ya no existe`,
|
|
184
|
+
action: "volvé a preparar la operación sobre la base vigente",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const current = baseDigest(await fs.readText(absolute));
|
|
188
|
+
if (current !== base.digest) {
|
|
189
|
+
return {
|
|
190
|
+
code: "CAPABILITY_BASE_STALE",
|
|
191
|
+
message: `'${base.path}' cambió después de preparar la propuesta`,
|
|
192
|
+
action: "volvé a preparar la operación sobre la base vigente y revisá el resultado",
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* What to say when something broke or was cancelled AFTER an effect landed.
|
|
199
|
+
*
|
|
200
|
+
* The failure mode this closes is the comfortable one: reporting a cancellation
|
|
201
|
+
* as if nothing had happened, because the operation "did not finish". An
|
|
202
|
+
* external step that already left the machine cannot be un-left, so the honest
|
|
203
|
+
* report enumerates it and hands back the reconciliation to run.
|
|
204
|
+
*/
|
|
205
|
+
export function reconcileAfterFailure(outcome, partial) {
|
|
206
|
+
if (partial.length === 0) {
|
|
207
|
+
return {
|
|
208
|
+
applied: [],
|
|
209
|
+
next_action: outcome === "cancelled"
|
|
210
|
+
? "no se aplicó ningún efecto: podés volver a intentar cuando quieras"
|
|
211
|
+
: "no se aplicó ningún efecto: corregí la causa del fallo y volvé a intentar",
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const detail = partial.map((p) => `${p.class}: ${p.what}`).join("; ");
|
|
215
|
+
return {
|
|
216
|
+
applied: [...new Set(partial.map((p) => p.class))],
|
|
217
|
+
next_action: `quedaron efectos aplicados que hay que reconciliar a mano — ${detail}`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=durable-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-effect.js","sourceRoot":"","sources":["../../../src/application/capability/durable-effect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,cAAc,GACf,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAiBpE;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AA2BD,MAAM,eAAe,GAA2B;IAC9C,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,kBAAkB;IAClB,aAAa;CACd,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAgC;IACnE,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,oCAAoC;gBACxE,MAAM,EACJ,oFAAoF;aACvF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,6CAA6C,KAAK,EAAE,KAAK,GAAG;gBACrE,MAAM,EAAE,yEAAyE;aAClF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,gDAAgD;gBACzD,MAAM,EAAE,uDAAuD;aAChE;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACJ,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;YACpC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;YAClC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;YAC5C,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB;YAC5D,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC;gBAC3C,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;aAChC,CAAC,CAAC;YACH,eAAe,EAAE,cAAc,CAAC,QAAQ,CAAC;YACzC,iBAAiB,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC;YAC1D,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;SACzB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,OAA0B,EAC1B,SAAgC;IAEhC,OAAO;QACL,OAAO,EAAE,yBAAyB;QAClC,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE;QACvD,YAAY,EAAE,OAAO,CAAC,sBAAsB;QAC5C,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AA2BD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAkB,EAClB,KAAmB,EACnB,KAA8B;IAE9B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEpE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEtE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CACtD,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CACvD,CAAC;IACF,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,MAAM,EAAE,gEAAgE;aACzE;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,2EAA2E;QAC3E,4EAA4E;QAC5E,eAAe;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aAC/B;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;YAC9B,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACvF,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5B;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAA8B;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,oDAAoD;YAC7D,MAAM,EAAE,iEAAiE;SAC1E,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,kCAAkC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/D,MAAM,EAAE,oEAAoE;SAC7E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,SAAS,CACtB,EAAkB,EAClB,KAA8B;IAE9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,YAAY,IAAI,CAAC,IAAI,gBAAgB;YAC9C,MAAM,EAAE,qDAAqD;SAC9D,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,2CAA2C;YACjE,MAAM,EAAE,2EAA2E;SACpF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAaD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+B,EAC/B,OAAiC;IAEjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,EAAE;YACX,WAAW,EACT,OAAO,KAAK,WAAW;gBACrB,CAAC,CAAC,oEAAoE;gBACtE,CAAC,CAAC,2EAA2E;SAClF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,WAAW,EAAE,+DAA+D,MAAM,EAAE;KACrF,CAAC;AACJ,CAAC"}
|