@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,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rules that read the registry's declarative fields — thresholds,
|
|
3
|
+
* conditions and the binding of an invocation to a run.
|
|
4
|
+
*
|
|
5
|
+
* They live apart from the table for the same reason the table is a table: the
|
|
6
|
+
* registry says WHAT each transition declares, and this module says what those
|
|
7
|
+
* declarations MEAN. Every function here is pure and takes what it needs as
|
|
8
|
+
* arguments, so a fixture journey exercises exactly the code production walks.
|
|
9
|
+
*
|
|
10
|
+
* Two of them are fail-closed in the direction that costs the least: a condition
|
|
11
|
+
* that cannot be resolved does NOT skip its transition — a registry mistake must
|
|
12
|
+
* make the run ask, never make it drop a step in silence — and an invocation with
|
|
13
|
+
* an unbound placeholder is refused rather than emitted, because a command nobody
|
|
14
|
+
* can run is worse than a boundary that says why it could not be built.
|
|
15
|
+
*/
|
|
16
|
+
import { DOCS_BOUNDARY, RUN_PLACEHOLDERS, conditionOf, } from "./authority.js";
|
|
17
|
+
/**
|
|
18
|
+
* Whether a threshold fired, counted over what was actually observed.
|
|
19
|
+
*
|
|
20
|
+
* Only DISTINCT signals the observed row declares are counted: a repeated signal
|
|
21
|
+
* is one observation sent twice, and a signal belonging to another boundary is
|
|
22
|
+
* not this rule's evidence. Both would otherwise let a gate fire on noise.
|
|
23
|
+
*/
|
|
24
|
+
export function thresholdFired(rule, journey, observations) {
|
|
25
|
+
const observed = journey.find((decision) => decision.id === rule.observed);
|
|
26
|
+
if (observed === undefined)
|
|
27
|
+
return false;
|
|
28
|
+
// The subset the rule names, intersected with what the row actually declares:
|
|
29
|
+
// a rule may only count signals its observed boundary can produce, so a typo in
|
|
30
|
+
// `of` narrows to nothing instead of counting something else.
|
|
31
|
+
const declaredVocabulary = observed.signals ?? [];
|
|
32
|
+
const counted = rule.of ?? declaredVocabulary;
|
|
33
|
+
const vocabulary = new Set(declaredVocabulary.filter((signal) => counted.includes(signal)));
|
|
34
|
+
const declared = observations
|
|
35
|
+
.filter((observation) => observation.transition === rule.observed)
|
|
36
|
+
.flatMap((observation) => observation.signals)
|
|
37
|
+
.filter((signal) => vocabulary.has(signal));
|
|
38
|
+
return new Set(declared).size >= rule.min;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Why this transition is passed over — or `null` when it happens.
|
|
42
|
+
*
|
|
43
|
+
* The reason travels instead of a bare boolean because the trace has to be able
|
|
44
|
+
* to say what was skipped and why: `applied.length` is the journey's cursor, so a
|
|
45
|
+
* step nobody applied still has to be accounted for, and "it did not happen"
|
|
46
|
+
* without a cause is indistinguishable from a step that was lost.
|
|
47
|
+
*/
|
|
48
|
+
export function skipReason(decision, journey, observations) {
|
|
49
|
+
const condition = conditionOf(decision);
|
|
50
|
+
if (condition === null)
|
|
51
|
+
return null;
|
|
52
|
+
// No evidence means the rule did not fire, and a rule that did not fire skips.
|
|
53
|
+
// That is the doctrine's own default — "borderline continues without asking" —
|
|
54
|
+
// and it is the direction that assumes nothing: the alternative would emit a
|
|
55
|
+
// question on zero observations and then read the answer as if it had cause.
|
|
56
|
+
if (thresholdFired(condition.threshold, journey, observations))
|
|
57
|
+
return null;
|
|
58
|
+
return condition.otherwise;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The action as it will be emitted: every placeholder replaced by this run's
|
|
62
|
+
* coordinates.
|
|
63
|
+
*
|
|
64
|
+
* Binding happens before the seal is computed, so what gets sealed, what gets
|
|
65
|
+
* shown and what the result is compared against are the same three strings. A
|
|
66
|
+
* placeholder left over means the registry referenced something this run cannot
|
|
67
|
+
* supply, and that is returned as a failure rather than emitted — `{session}`
|
|
68
|
+
* printed in a command line is the kind of defect that only surfaces when
|
|
69
|
+
* somebody tries to run it.
|
|
70
|
+
*/
|
|
71
|
+
export function bindAction(action, binding) {
|
|
72
|
+
// Driven by the closed set, not by two hardcoded replacements: the vocabulary
|
|
73
|
+
// and what it binds to are one decision, and splitting them is how a declared
|
|
74
|
+
// placeholder ends up with nothing replacing it.
|
|
75
|
+
const value = {
|
|
76
|
+
"{session}": binding.session,
|
|
77
|
+
"{code}": binding.code,
|
|
78
|
+
};
|
|
79
|
+
const bind = (text) => RUN_PLACEHOLDERS.reduce((bound, placeholder) => bound.split(placeholder).join(value[placeholder]), text);
|
|
80
|
+
const bound = {
|
|
81
|
+
...action,
|
|
82
|
+
invocation: {
|
|
83
|
+
...action.invocation,
|
|
84
|
+
args: action.invocation.args.map(bind),
|
|
85
|
+
target: bind(action.invocation.target),
|
|
86
|
+
input: action.invocation.input === null ? null : bind(action.invocation.input),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
const unbound = unboundPlaceholder(bound);
|
|
90
|
+
return unbound === null ? { ok: true, action: bound } : { ok: false, unbound };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The first placeholder still standing after binding, if any.
|
|
94
|
+
*
|
|
95
|
+
* It looks for the SHAPE, not only the two known names: `{sesion}` is a typo that
|
|
96
|
+
* binds to nothing, and reporting it as "unbound" beats emitting a command with a
|
|
97
|
+
* brace in it. The stdin payload is exempt — a JSON body legitimately carries
|
|
98
|
+
* braces, and refusing those would make the field unusable.
|
|
99
|
+
*/
|
|
100
|
+
const PLACEHOLDER_SHAPE = /\{[a-z_-]+\}/;
|
|
101
|
+
function unboundPlaceholder(action) {
|
|
102
|
+
const parts = [action.invocation.program, ...action.invocation.args, action.invocation.target];
|
|
103
|
+
for (const part of parts) {
|
|
104
|
+
const found = PLACEHOLDER_SHAPE.exec(part);
|
|
105
|
+
if (found !== null)
|
|
106
|
+
return found[0];
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/** Any `docs/<folder>` a string names, wherever inside it the path appears. */
|
|
111
|
+
const DOCS_PATH = /(?:^|[\s"'=(,])(docs\/[A-Za-z0-9._-]+)/g;
|
|
112
|
+
/**
|
|
113
|
+
* The `docs/` folder this action would write and this flow may not — or `null`.
|
|
114
|
+
*
|
|
115
|
+
* The chassis' hard rule is "no auto-export": a loop writes its own flow's
|
|
116
|
+
* document and nothing else, and promoting anything into another `docs/` folder
|
|
117
|
+
* is a separate, explicit step. Stated only in prose, the rule could be broken by
|
|
118
|
+
* a single registry row naming the wrong path, and the breach would be invisible
|
|
119
|
+
* until a run had already written outside its lane.
|
|
120
|
+
*
|
|
121
|
+
* Checked over the WHOLE invocation, not only its `target`: the path a command
|
|
122
|
+
* writes usually rides in an argument, and a boundary that inspected only the
|
|
123
|
+
* target would pass `aw export-manuals --out docs/manuals` with a target of `.`.
|
|
124
|
+
* Reading is not the concern — this is about what a delegated step may WRITE —
|
|
125
|
+
* but an action that only reads a foreign `docs/` folder has no reason to name it
|
|
126
|
+
* either, and refusing is the direction that costs a registry edit instead of an
|
|
127
|
+
* unauthorized write.
|
|
128
|
+
*/
|
|
129
|
+
export function docsBoundaryBreach(action, flow) {
|
|
130
|
+
const allowed = DOCS_BOUNDARY[flow];
|
|
131
|
+
const parts = [...action.invocation.args, action.invocation.target];
|
|
132
|
+
for (const part of parts) {
|
|
133
|
+
for (const [, path] of part.matchAll(DOCS_PATH)) {
|
|
134
|
+
if (path !== undefined && !allowed.includes(path))
|
|
135
|
+
return path;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/domain/flow/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run's state, owned by the CLI — and the reason it can be trusted.
|
|
3
|
+
*
|
|
4
|
+
* A flow run stops at boundaries and is picked up later, possibly from another
|
|
5
|
+
* host, with the original conversation gone. What survives that is this file:
|
|
6
|
+
* which flow, which transitions were already applied, which boundary is in
|
|
7
|
+
* force, what was authorized, and the attempt history that tells a resend apart
|
|
8
|
+
* from a new attempt.
|
|
9
|
+
*
|
|
10
|
+
* It is sealed with the SAME canonicalization the rest of the system uses
|
|
11
|
+
* (`canonicalJson` / `semanticDigest`) rather than a second digest criterion —
|
|
12
|
+
* two digests over the same bytes is exactly how a "tampered" verdict becomes
|
|
13
|
+
* unfalsifiable.
|
|
14
|
+
*
|
|
15
|
+
* Reading is **fail-closed** and the four verdicts are deliberately distinct: an
|
|
16
|
+
* ABSENT state in an open session is a LEGACY session, not corruption, and its
|
|
17
|
+
* answer is an adoption action; an unknown version, invalid JSON or a digest
|
|
18
|
+
* that does not match are refusals with a repair action. None of them advances.
|
|
19
|
+
*
|
|
20
|
+
* The human artifacts (`SESSION.md`, `CHECKPOINT.md`, `BACKLOG.md`) are not
|
|
21
|
+
* touched by any of this: they keep their headings and their role as the run's
|
|
22
|
+
* readable log.
|
|
23
|
+
*/
|
|
24
|
+
import { WORKLINE_FLOWS } from "../../application/capability/compose.js";
|
|
25
|
+
import { canonicalJson, semanticDigest } from "../../application/semantic-operation/protocol.js";
|
|
26
|
+
import { isEffectClass } from "../capability/effects.js";
|
|
27
|
+
export const FLOW_RUN_STATE_VERSION = 4;
|
|
28
|
+
/** The CLI-owned run state inside the session folder. Machine-local, dotted. */
|
|
29
|
+
export const FLOW_RUN_STATE_FILE = ".flow-run.json";
|
|
30
|
+
/**
|
|
31
|
+
* How many times one boundary may be answered before the run degrades it.
|
|
32
|
+
*
|
|
33
|
+
* The chassis states the rule without a number ("`attempts[gap]++`, `MAX` cap")
|
|
34
|
+
* because the number is not doctrine — what is doctrine is that a gap must not
|
|
35
|
+
* be re-fired forever. Three is the smallest cap that still allows a genuine
|
|
36
|
+
* correction: a first answer, a fix after reading why it was refused, and one
|
|
37
|
+
* more. The fourth would be the loop the rule exists to prevent.
|
|
38
|
+
*/
|
|
39
|
+
export const MAX_BOUNDARY_ATTEMPTS = 3;
|
|
40
|
+
/** How many attempts this run has already spent on one transition. */
|
|
41
|
+
export function attemptsAt(state, transition) {
|
|
42
|
+
return state.attempts.filter((attempt) => attempt.transition === transition).length;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The seal of everything an answer was written AGAINST — attempts excluded.
|
|
46
|
+
*
|
|
47
|
+
* Not a second digest criterion: the same canonicalization over a deliberately
|
|
48
|
+
* narrower input, declared once, here. `digest` seals the file so tampering is
|
|
49
|
+
* detectable and must therefore cover every field. Staleness asks a different
|
|
50
|
+
* question — "did what this answer depends on move?" — and a failed attempt that
|
|
51
|
+
* was recorded moves nothing it depends on: same position, same boundary, same
|
|
52
|
+
* action, same effects. Sealing the attempts into it would report the caller's
|
|
53
|
+
* own previous refusal back to them as `FLOW_ANSWER_STALE`, replacing a precise
|
|
54
|
+
* reason ("this evidence is missing") with a vague one.
|
|
55
|
+
*/
|
|
56
|
+
export function positionDigest(state) {
|
|
57
|
+
const { attempts: _spent, digest: _seal, ...position } = state;
|
|
58
|
+
return semanticDigest(position);
|
|
59
|
+
}
|
|
60
|
+
/** The state minus its own seal — exactly what {@link sealRunState} digests. */
|
|
61
|
+
function withoutSeal(state) {
|
|
62
|
+
const { digest: _seal, ...rest } = state;
|
|
63
|
+
return rest;
|
|
64
|
+
}
|
|
65
|
+
export function sealRunState(state) {
|
|
66
|
+
return { ...state, digest: semanticDigest(state) };
|
|
67
|
+
}
|
|
68
|
+
export function newRunState(flow, session) {
|
|
69
|
+
return sealRunState({
|
|
70
|
+
version: FLOW_RUN_STATE_VERSION,
|
|
71
|
+
flow,
|
|
72
|
+
session,
|
|
73
|
+
applied: [],
|
|
74
|
+
skipped: [],
|
|
75
|
+
boundary: null,
|
|
76
|
+
pending_action: null,
|
|
77
|
+
observations: [],
|
|
78
|
+
authorizations: [],
|
|
79
|
+
effects: { planned: [], approved: [], applied: [] },
|
|
80
|
+
attempts: [],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Apply one transition, re-sealing the result.
|
|
85
|
+
*
|
|
86
|
+
* Pure on purpose: the atomic write is the service's job, and keeping the state
|
|
87
|
+
* transition free of I/O is what makes "a failure halfway through leaves no
|
|
88
|
+
* intermediate state applied" checkable — the next state either exists whole or
|
|
89
|
+
* was never produced.
|
|
90
|
+
*/
|
|
91
|
+
export function applyTransition(state, decisionId, effects = []) {
|
|
92
|
+
return sealRunState({
|
|
93
|
+
...withoutSeal(state),
|
|
94
|
+
applied: [...state.applied, decisionId],
|
|
95
|
+
// planned before applied, always: an effect that shows up as applied without
|
|
96
|
+
// ever having been planned is the lie `buildReceipt` refuses, and the
|
|
97
|
+
// directive refuses it too.
|
|
98
|
+
effects: {
|
|
99
|
+
planned: union(state.effects.planned, effects),
|
|
100
|
+
approved: [...state.effects.approved],
|
|
101
|
+
applied: union(state.effects.applied, effects),
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pass over a conditional transition without applying it.
|
|
107
|
+
*
|
|
108
|
+
* The cursor advances — the journey is a sequence and the run has to leave the
|
|
109
|
+
* step behind — but nothing else moves: no effect is planned, none is applied,
|
|
110
|
+
* and the id lands in `skipped` so the trace can say the step was omitted rather
|
|
111
|
+
* than decided. A skip that only advanced the cursor would be indistinguishable
|
|
112
|
+
* from having applied it, which is the exact lie a conditional step invites.
|
|
113
|
+
*/
|
|
114
|
+
export function skipTransition(state, decisionId) {
|
|
115
|
+
return sealRunState({
|
|
116
|
+
...withoutSeal(state),
|
|
117
|
+
applied: [...state.applied, decisionId],
|
|
118
|
+
skipped: [...state.skipped, decisionId],
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** Move the boundary to where the walk stopped, applying nothing. */
|
|
122
|
+
export function withBoundary(state, boundary) {
|
|
123
|
+
return sealRunState({ ...withoutSeal(state), boundary });
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Record — or clear — the delegated action the run is waiting on.
|
|
127
|
+
*
|
|
128
|
+
* Clearing is as load-bearing as setting: a run that moved past an execution
|
|
129
|
+
* boundary and kept the old pending action would tell whoever resumes it to run
|
|
130
|
+
* something the engine no longer expects.
|
|
131
|
+
*/
|
|
132
|
+
export function withPendingAction(state, pending) {
|
|
133
|
+
return sealRunState({ ...withoutSeal(state), pending_action: pending });
|
|
134
|
+
}
|
|
135
|
+
/** Keep a validated observation for the rule that consumes it later. */
|
|
136
|
+
export function withObservation(state, observation) {
|
|
137
|
+
return sealRunState({
|
|
138
|
+
...withoutSeal(state),
|
|
139
|
+
observations: [
|
|
140
|
+
...state.observations.filter((past) => past.transition !== observation.transition),
|
|
141
|
+
observation,
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** Record one attempt in the persisted history, re-sealing the result. */
|
|
146
|
+
export function withAttempt(state, attempt) {
|
|
147
|
+
return sealRunState({ ...withoutSeal(state), attempts: [...state.attempts, attempt] });
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Grant the run an authorization the person just gave.
|
|
151
|
+
*
|
|
152
|
+
* The classes land in BOTH `authorizations` — what the run may exercise from here
|
|
153
|
+
* on — and `effects.approved` — the ledger moment. The two are the same split the
|
|
154
|
+
* capability contract already makes between the request's authorizations and the
|
|
155
|
+
* receipt's approved effects, and the directive enforces `approved ⊆ authorizations`.
|
|
156
|
+
*/
|
|
157
|
+
export function withApproval(state, effects) {
|
|
158
|
+
return sealRunState({
|
|
159
|
+
...withoutSeal(state),
|
|
160
|
+
authorizations: union(state.authorizations, effects),
|
|
161
|
+
effects: {
|
|
162
|
+
planned: union(state.effects.planned, effects),
|
|
163
|
+
approved: union(state.effects.approved, effects),
|
|
164
|
+
applied: [...state.effects.applied],
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function union(current, added) {
|
|
169
|
+
return [...new Set([...current, ...added])];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Parse a persisted state, refusing anything that cannot be trusted.
|
|
173
|
+
*
|
|
174
|
+
* Order matters: shape before version before seal. A file whose version is
|
|
175
|
+
* unknown must not be judged by a digest rule that version may not even use.
|
|
176
|
+
*/
|
|
177
|
+
export function parseRunState(raw) {
|
|
178
|
+
if (raw.trim().length === 0) {
|
|
179
|
+
return refuse("FLOW_RUN_INVALID", "el estado de corrida está vacío", "reconstruí la corrida con 'aw flow advance --adopt', o restaurá el archivo");
|
|
180
|
+
}
|
|
181
|
+
let parsed;
|
|
182
|
+
try {
|
|
183
|
+
parsed = JSON.parse(raw);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return refuse("FLOW_RUN_INVALID", "el estado de corrida no es JSON válido", "no se avanza sobre un estado ilegible: restauralo o re-adoptá la sesión con 'aw flow advance --adopt'");
|
|
187
|
+
}
|
|
188
|
+
if (!isRecord(parsed)) {
|
|
189
|
+
return refuse("FLOW_RUN_INVALID", "el estado de corrida no es un objeto JSON", "restauralo o re-adoptá la sesión con 'aw flow advance --adopt'");
|
|
190
|
+
}
|
|
191
|
+
if (parsed.version !== FLOW_RUN_STATE_VERSION) {
|
|
192
|
+
// No silent migration, in either direction: an older state predates fields
|
|
193
|
+
// the engine now reads, and inventing them would fabricate the very history
|
|
194
|
+
// this file exists to make trustworthy. Re-adoption is explicit and cheap.
|
|
195
|
+
return refuse("FLOW_RUN_VERSION_UNSUPPORTED", `versión de estado de corrida no soportada: ${String(parsed.version)}`, `esta versión del CLI lee la ${FLOW_RUN_STATE_VERSION}: actualizá el CLI, o re-adoptá la sesión con 'aw flow advance --flow <flow> --adopt' (no hay migración automática)`);
|
|
196
|
+
}
|
|
197
|
+
const shape = checkShape(parsed);
|
|
198
|
+
if (shape !== null)
|
|
199
|
+
return { ok: false, failure: shape };
|
|
200
|
+
const state = parsed;
|
|
201
|
+
if (semanticDigest(withoutSeal(state)) !== state.digest) {
|
|
202
|
+
return refuse("FLOW_RUN_TAMPERED", "el estado de corrida no coincide con su propio sello", "fue editado fuera del CLI: descartá el archivo y re-adoptá la sesión con 'aw flow advance --adopt'");
|
|
203
|
+
}
|
|
204
|
+
return { ok: true, state };
|
|
205
|
+
}
|
|
206
|
+
export function serializeRunState(state) {
|
|
207
|
+
return `${canonicalJson(state)}\n`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Whether the persisted state is coherent with the journey it claims to walk.
|
|
211
|
+
*
|
|
212
|
+
* A state can be well-formed and sealed and still be AHEAD of the journey — it
|
|
213
|
+
* names transitions this build does not know, or in an order the journey does
|
|
214
|
+
* not have. Advancing over it would apply transitions on top of a history
|
|
215
|
+
* nobody can reproduce, so it is refused with the same fail-closed rule.
|
|
216
|
+
*/
|
|
217
|
+
export function checkAgainstJourney(state, journey) {
|
|
218
|
+
const ids = journey.map((decision) => decision.id);
|
|
219
|
+
for (const [index, applied] of state.applied.entries()) {
|
|
220
|
+
if (ids[index] === applied)
|
|
221
|
+
continue;
|
|
222
|
+
return {
|
|
223
|
+
code: "FLOW_RUN_AHEAD_OF_JOURNEY",
|
|
224
|
+
message: `el estado dice haber aplicado '${applied}' donde el recorrido tiene '${ids[index] ?? "(nada)"}'`,
|
|
225
|
+
action: "el estado no corresponde a este recorrido: revisá el flow de la corrida o re-adoptá la sesión",
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const next = ids[state.applied.length] ?? null;
|
|
229
|
+
if (state.boundary !== null && state.boundary !== next) {
|
|
230
|
+
return {
|
|
231
|
+
code: "FLOW_RUN_AHEAD_OF_JOURNEY",
|
|
232
|
+
message: `la frontera vigente dice '${state.boundary}' y el recorrido sigue en '${next ?? "(nada)"}'`,
|
|
233
|
+
action: "recalculá la frontera avanzando de nuevo; no se responde sobre una frontera que el estado no sostiene",
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
function checkShape(parsed) {
|
|
239
|
+
const invalid = (why) => ({
|
|
240
|
+
code: "FLOW_RUN_INVALID",
|
|
241
|
+
message: `el estado de corrida ${why}`,
|
|
242
|
+
action: "restauralo o re-adoptá la sesión con 'aw flow advance --adopt'",
|
|
243
|
+
});
|
|
244
|
+
if (!WORKLINE_FLOWS.includes(parsed.flow)) {
|
|
245
|
+
return invalid(`declara un flow desconocido: ${String(parsed.flow)}`);
|
|
246
|
+
}
|
|
247
|
+
if (typeof parsed.session !== "string" || parsed.session.trim().length === 0) {
|
|
248
|
+
return invalid("no dice a qué sesión pertenece");
|
|
249
|
+
}
|
|
250
|
+
const applied = parsed.applied;
|
|
251
|
+
if (!isStringArray(applied))
|
|
252
|
+
return invalid("no trae la lista de transiciones aplicadas");
|
|
253
|
+
if (!isStringArray(parsed.skipped))
|
|
254
|
+
return invalid("no trae la lista de transiciones omitidas");
|
|
255
|
+
if (parsed.skipped.some((id) => !applied.includes(id))) {
|
|
256
|
+
return invalid("declara una transición omitida que el recorrido nunca pasó");
|
|
257
|
+
}
|
|
258
|
+
if (parsed.boundary !== null && typeof parsed.boundary !== "string") {
|
|
259
|
+
return invalid("declara una frontera que no es un identificador");
|
|
260
|
+
}
|
|
261
|
+
if (!isPendingAction(parsed.pending_action)) {
|
|
262
|
+
return invalid("declara una acción pendiente sin transición o sin sello");
|
|
263
|
+
}
|
|
264
|
+
if (!isObservationArray(parsed.observations)) {
|
|
265
|
+
return invalid("trae observaciones que no son señales declaradas por transición");
|
|
266
|
+
}
|
|
267
|
+
if (!isEffectClassArray(parsed.authorizations)) {
|
|
268
|
+
return invalid("declara autorizaciones que no son clases de efecto");
|
|
269
|
+
}
|
|
270
|
+
if (!isEffectLedger(parsed.effects))
|
|
271
|
+
return invalid("no trae el registro de efectos completo");
|
|
272
|
+
if (!isAttemptArray(parsed.attempts))
|
|
273
|
+
return invalid("trae un historial de intentos inválido");
|
|
274
|
+
if (typeof parsed.digest !== "string")
|
|
275
|
+
return invalid("no trae su sello");
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
function refuse(code, message, action) {
|
|
279
|
+
return { ok: false, failure: { code, message, action } };
|
|
280
|
+
}
|
|
281
|
+
function isRecord(value) {
|
|
282
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
283
|
+
}
|
|
284
|
+
function isStringArray(value) {
|
|
285
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
286
|
+
}
|
|
287
|
+
function isEffectClassArray(value) {
|
|
288
|
+
return Array.isArray(value) && value.every(isEffectClass);
|
|
289
|
+
}
|
|
290
|
+
function isEffectLedger(value) {
|
|
291
|
+
if (!isRecord(value))
|
|
292
|
+
return false;
|
|
293
|
+
return (isEffectClassArray(value.planned) &&
|
|
294
|
+
isEffectClassArray(value.approved) &&
|
|
295
|
+
isEffectClassArray(value.applied));
|
|
296
|
+
}
|
|
297
|
+
function isPendingAction(value) {
|
|
298
|
+
if (value === null)
|
|
299
|
+
return true;
|
|
300
|
+
return (isRecord(value) && typeof value.transition === "string" && typeof value.digest === "string");
|
|
301
|
+
}
|
|
302
|
+
function isObservationArray(value) {
|
|
303
|
+
if (!Array.isArray(value))
|
|
304
|
+
return false;
|
|
305
|
+
return value.every((entry) => isRecord(entry) && typeof entry.transition === "string" && isStringArray(entry.signals));
|
|
306
|
+
}
|
|
307
|
+
function isAttemptArray(value) {
|
|
308
|
+
if (!Array.isArray(value))
|
|
309
|
+
return false;
|
|
310
|
+
return value.every((entry) => isRecord(entry) &&
|
|
311
|
+
typeof entry.invocation_id === "string" &&
|
|
312
|
+
Number.isInteger(entry.attempt) &&
|
|
313
|
+
typeof entry.request_digest === "string" &&
|
|
314
|
+
typeof entry.transition === "string" &&
|
|
315
|
+
(entry.parent_request_digest === null || typeof entry.parent_request_digest === "string"));
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../../src/domain/flow/run-state.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/harnesses.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { HOST_VERIFICATIONS } from "./host-verification.js";
|
|
2
|
+
/** The mention form every host that auto-discovers skills by description shares. */
|
|
3
|
+
const MENTION = {
|
|
4
|
+
kind: "mention",
|
|
5
|
+
template: "<name>",
|
|
6
|
+
note: "las skills se activan por su description: se nombra la capacidad en la conversación",
|
|
7
|
+
};
|
|
2
8
|
export const HARNESSES = [
|
|
3
9
|
{
|
|
4
10
|
id: "claude-code",
|
|
@@ -20,6 +26,7 @@ export const HARNESSES = [
|
|
|
20
26
|
pluginHooksDir: "hooks",
|
|
21
27
|
skillsDirs: [".claude/skills"],
|
|
22
28
|
installTarget: "claude",
|
|
29
|
+
invocation: MENTION,
|
|
23
30
|
},
|
|
24
31
|
{
|
|
25
32
|
id: "codex",
|
|
@@ -50,6 +57,7 @@ export const HARNESSES = [
|
|
|
50
57
|
// secondary for older builds. Verified vs developers.openai.com/codex/skills.
|
|
51
58
|
skillsDirs: [".agents/skills", ".codex/skills"],
|
|
52
59
|
installTarget: "codex",
|
|
60
|
+
invocation: MENTION,
|
|
53
61
|
},
|
|
54
62
|
{
|
|
55
63
|
// Detection: OZ_RUN_ID takes priority over warp markers to handle overlap.
|
|
@@ -73,6 +81,7 @@ export const HARNESSES = [
|
|
|
73
81
|
pluginHooksDir: null,
|
|
74
82
|
skillsDirs: [".agents/skills"],
|
|
75
83
|
installTarget: "oz",
|
|
84
|
+
invocation: MENTION,
|
|
76
85
|
},
|
|
77
86
|
{
|
|
78
87
|
id: "warp",
|
|
@@ -104,6 +113,7 @@ export const HARNESSES = [
|
|
|
104
113
|
// (skill-as-command). See install-skill.ts:synthesizeCommandSkills.
|
|
105
114
|
skillsDirs: [".warp/skills", ".agents/skills", ".claude/skills", ".codex/skills"],
|
|
106
115
|
installTarget: "warp",
|
|
116
|
+
invocation: MENTION,
|
|
107
117
|
},
|
|
108
118
|
{
|
|
109
119
|
// Gemini CLI (deprecated mid-2026) + Antigravity CLI (`agy`, successor;
|
|
@@ -143,6 +153,7 @@ export const HARNESSES = [
|
|
|
143
153
|
pluginHooksDir: null, // Extension-bundled hooks (BeforeTool) — Phase 2
|
|
144
154
|
skillsDirs: [".agents/skills", ".gemini/skills"],
|
|
145
155
|
installTarget: "gemini",
|
|
156
|
+
invocation: MENTION,
|
|
146
157
|
},
|
|
147
158
|
{
|
|
148
159
|
// OpenCode (sst/opencode). Config `opencode.json` ($schema); MCP under `mcp`
|
|
@@ -167,6 +178,7 @@ export const HARNESSES = [
|
|
|
167
178
|
pluginHooksDir: null,
|
|
168
179
|
skillsDirs: [".opencode/skills", ".agents/skills", ".claude/skills"],
|
|
169
180
|
installTarget: "opencode",
|
|
181
|
+
invocation: MENTION,
|
|
170
182
|
},
|
|
171
183
|
{
|
|
172
184
|
// Crush (charmbracelet/crush). Config `crush.json` ($schema charm.land/crush.json);
|
|
@@ -202,6 +214,7 @@ export const HARNESSES = [
|
|
|
202
214
|
".claude/skills",
|
|
203
215
|
],
|
|
204
216
|
installTarget: "crush",
|
|
217
|
+
invocation: MENTION,
|
|
205
218
|
},
|
|
206
219
|
{
|
|
207
220
|
// Kimi Code (MoonshotAI) — successor of the Python `kimi-cli`, shipped as a
|
|
@@ -242,6 +255,14 @@ export const HARNESSES = [
|
|
|
242
255
|
pluginHooksDir: null, // Its hooks live in config.toml, not in a plugin dir.
|
|
243
256
|
skillsDirs: [".kimi-code/skills", ".agents/skills"],
|
|
244
257
|
installTarget: "kimi",
|
|
258
|
+
// The one host with a VERIFIED typed form: a skill dropped in
|
|
259
|
+
// ~/.agents/skills was listed and invoked this way (probe 2026-07-29, the
|
|
260
|
+
// same one `COMMAND_SKILLS_HOSTS` rests on).
|
|
261
|
+
invocation: {
|
|
262
|
+
kind: "slash",
|
|
263
|
+
template: "/skill:<name>",
|
|
264
|
+
note: "probe 2026-07-29: las skills SON la superficie de comandos de Kimi Code",
|
|
265
|
+
},
|
|
245
266
|
},
|
|
246
267
|
];
|
|
247
268
|
/** Hosts that auto-discover skills from the open-standard `~/.agents/skills`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared relative-path guard for every write boundary.
|
|
3
|
+
*
|
|
4
|
+
* A path that is empty, Windows-separated, absolute, or carries `.` / `..` /
|
|
5
|
+
* empty segments never reaches a filesystem call. Callers add their own
|
|
6
|
+
* containment rule on top of the normalized segments — comparing SEGMENTS, so
|
|
7
|
+
* `docs/specs-evil` never passes as `docs/specs`.
|
|
8
|
+
*/
|
|
9
|
+
export function checkSafeRelativePath(raw) {
|
|
10
|
+
const path = raw.trim();
|
|
11
|
+
if (path.length === 0)
|
|
12
|
+
return { ok: false, why: "está vacío" };
|
|
13
|
+
if (path.includes("\\"))
|
|
14
|
+
return { ok: false, why: "usa separador de Windows" };
|
|
15
|
+
if (path.startsWith("/") || /^[A-Za-z]:/.test(path))
|
|
16
|
+
return { ok: false, why: "es absoluto" };
|
|
17
|
+
const segments = path.split("/");
|
|
18
|
+
if (segments.some((s) => s === ".." || s === "." || s.length === 0)) {
|
|
19
|
+
return { ok: false, why: "contiene segmentos relativos o vacíos" };
|
|
20
|
+
}
|
|
21
|
+
return { ok: true, path, segments };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=safe-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-path.js","sourceRoot":"","sources":["../../src/domain/safe-path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,0BAA0B,EAAE,CAAC;IAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAE9F,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,uCAAuC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
|