@horizon36596/zenith-core 0.1.1
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/LICENSE +21 -0
- package/NOTICE +18 -0
- package/README.md +16 -0
- package/dist/canonicalize.d.ts +25 -0
- package/dist/canonicalize.d.ts.map +1 -0
- package/dist/canonicalize.js +199 -0
- package/dist/canonicalize.js.map +1 -0
- package/dist/check.d.ts +26 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +231 -0
- package/dist/check.js.map +1 -0
- package/dist/checks/heading.d.ts +17 -0
- package/dist/checks/heading.d.ts.map +1 -0
- package/dist/checks/heading.js +78 -0
- package/dist/checks/heading.js.map +1 -0
- package/dist/checks/intake.d.ts +28 -0
- package/dist/checks/intake.d.ts.map +1 -0
- package/dist/checks/intake.js +131 -0
- package/dist/checks/intake.js.map +1 -0
- package/dist/checks/motion.d.ts +28 -0
- package/dist/checks/motion.d.ts.map +1 -0
- package/dist/checks/motion.js +252 -0
- package/dist/checks/motion.js.map +1 -0
- package/dist/checks/schedule.d.ts +29 -0
- package/dist/checks/schedule.d.ts.map +1 -0
- package/dist/checks/schedule.js +166 -0
- package/dist/checks/schedule.js.map +1 -0
- package/dist/checks/season.d.ts +6 -0
- package/dist/checks/season.d.ts.map +1 -0
- package/dist/checks/season.js +126 -0
- package/dist/checks/season.js.map +1 -0
- package/dist/continuity.d.ts +38 -0
- package/dist/continuity.d.ts.map +1 -0
- package/dist/continuity.js +69 -0
- package/dist/continuity.js.map +1 -0
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +258 -0
- package/dist/diff.js.map +1 -0
- package/dist/edit/command.d.ts +4 -0
- package/dist/edit/command.d.ts.map +1 -0
- package/dist/edit/command.js +16 -0
- package/dist/edit/command.js.map +1 -0
- package/dist/edit/errors.d.ts +9 -0
- package/dist/edit/errors.d.ts.map +1 -0
- package/dist/edit/errors.js +12 -0
- package/dist/edit/errors.js.map +1 -0
- package/dist/edit/fields.d.ts +40 -0
- package/dist/edit/fields.d.ts.map +1 -0
- package/dist/edit/fields.js +150 -0
- package/dist/edit/fields.js.map +1 -0
- package/dist/edit/finish.d.ts +15 -0
- package/dist/edit/finish.d.ts.map +1 -0
- package/dist/edit/finish.js +36 -0
- package/dist/edit/finish.js.map +1 -0
- package/dist/edit/groups.d.ts +66 -0
- package/dist/edit/groups.d.ts.map +1 -0
- package/dist/edit/groups.js +277 -0
- package/dist/edit/groups.js.map +1 -0
- package/dist/edit/ids.d.ts +39 -0
- package/dist/edit/ids.d.ts.map +1 -0
- package/dist/edit/ids.js +76 -0
- package/dist/edit/ids.js.map +1 -0
- package/dist/edit/index.d.ts +22 -0
- package/dist/edit/index.d.ts.map +1 -0
- package/dist/edit/index.js +22 -0
- package/dist/edit/index.js.map +1 -0
- package/dist/edit/meta.d.ts +15 -0
- package/dist/edit/meta.d.ts.map +1 -0
- package/dist/edit/meta.js +13 -0
- package/dist/edit/meta.js.map +1 -0
- package/dist/edit/path.d.ts +36 -0
- package/dist/edit/path.d.ts.map +1 -0
- package/dist/edit/path.js +135 -0
- package/dist/edit/path.js.map +1 -0
- package/dist/edit/steps.d.ts +53 -0
- package/dist/edit/steps.d.ts.map +1 -0
- package/dist/edit/steps.js +0 -0
- package/dist/edit/steps.js.map +1 -0
- package/dist/edit/template.d.ts +18 -0
- package/dist/edit/template.d.ts.map +1 -0
- package/dist/edit/template.js +30 -0
- package/dist/edit/template.js.map +1 -0
- package/dist/edit/timing.d.ts +11 -0
- package/dist/edit/timing.d.ts.map +1 -0
- package/dist/edit/timing.js +23 -0
- package/dist/edit/timing.js.map +1 -0
- package/dist/edit/tree.d.ts +32 -0
- package/dist/edit/tree.d.ts.map +1 -0
- package/dist/edit/tree.js +90 -0
- package/dist/edit/tree.js.map +1 -0
- package/dist/estimate.d.ts +48 -0
- package/dist/estimate.d.ts.map +1 -0
- package/dist/estimate.js +443 -0
- package/dist/estimate.js.map +1 -0
- package/dist/findingHelp.d.ts +18 -0
- package/dist/findingHelp.d.ts.map +1 -0
- package/dist/findingHelp.js +114 -0
- package/dist/findingHelp.js.map +1 -0
- package/dist/fix.d.ts +21 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +180 -0
- package/dist/fix.js.map +1 -0
- package/dist/footprint.d.ts +33 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +71 -0
- package/dist/footprint.js.map +1 -0
- package/dist/geometry/angle.d.ts +13 -0
- package/dist/geometry/angle.d.ts.map +1 -0
- package/dist/geometry/angle.js +21 -0
- package/dist/geometry/angle.js.map +1 -0
- package/dist/geometry/curve.d.ts +24 -0
- package/dist/geometry/curve.d.ts.map +1 -0
- package/dist/geometry/curve.js +78 -0
- package/dist/geometry/curve.js.map +1 -0
- package/dist/geometry/path.d.ts +29 -0
- package/dist/geometry/path.d.ts.map +1 -0
- package/dist/geometry/path.js +61 -0
- package/dist/geometry/path.js.map +1 -0
- package/dist/geometry/quadrature.d.ts +13 -0
- package/dist/geometry/quadrature.d.ts.map +1 -0
- package/dist/geometry/quadrature.js +57 -0
- package/dist/geometry/quadrature.js.map +1 -0
- package/dist/geometry/sat.d.ts +40 -0
- package/dist/geometry/sat.d.ts.map +1 -0
- package/dist/geometry/sat.js +86 -0
- package/dist/geometry/sat.js.map +1 -0
- package/dist/geometry/vec.d.ts +27 -0
- package/dist/geometry/vec.d.ts.map +1 -0
- package/dist/geometry/vec.js +30 -0
- package/dist/geometry/vec.js.map +1 -0
- package/dist/heading.d.ts +77 -0
- package/dist/heading.d.ts.map +1 -0
- package/dist/heading.js +164 -0
- package/dist/heading.js.map +1 -0
- package/dist/headingRanges.d.ts +48 -0
- package/dist/headingRanges.d.ts.map +1 -0
- package/dist/headingRanges.js +132 -0
- package/dist/headingRanges.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/kinematics.d.ts +63 -0
- package/dist/kinematics.d.ts.map +1 -0
- package/dist/kinematics.js +71 -0
- package/dist/kinematics.js.map +1 -0
- package/dist/ledger.d.ts +49 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +136 -0
- package/dist/ledger.js.map +1 -0
- package/dist/load.d.ts +12 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +12 -0
- package/dist/load.js.map +1 -0
- package/dist/mirror.d.ts +81 -0
- package/dist/mirror.d.ts.map +1 -0
- package/dist/mirror.js +282 -0
- package/dist/mirror.js.map +1 -0
- package/dist/plan.d.ts +29 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +159 -0
- package/dist/plan.js.map +1 -0
- package/dist/prBody.d.ts +24 -0
- package/dist/prBody.d.ts.map +1 -0
- package/dist/prBody.js +112 -0
- package/dist/prBody.js.map +1 -0
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +46 -0
- package/dist/provenance.js.map +1 -0
- package/dist/render.d.ts +18 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +464 -0
- package/dist/render.js.map +1 -0
- package/dist/resolve.d.ts +39 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +172 -0
- package/dist/resolve.js.map +1 -0
- package/dist/season.d.ts +65 -0
- package/dist/season.d.ts.map +1 -0
- package/dist/season.js +16 -0
- package/dist/season.js.map +1 -0
- package/dist/sim/commands.d.ts +97 -0
- package/dist/sim/commands.d.ts.map +1 -0
- package/dist/sim/commands.js +185 -0
- package/dist/sim/commands.js.map +1 -0
- package/dist/sim/curves.d.ts +37 -0
- package/dist/sim/curves.d.ts.map +1 -0
- package/dist/sim/curves.js +187 -0
- package/dist/sim/curves.js.map +1 -0
- package/dist/sim/follower.d.ts +124 -0
- package/dist/sim/follower.d.ts.map +1 -0
- package/dist/sim/follower.js +472 -0
- package/dist/sim/follower.js.map +1 -0
- package/dist/sim/ideal.d.ts +103 -0
- package/dist/sim/ideal.d.ts.map +1 -0
- package/dist/sim/ideal.js +393 -0
- package/dist/sim/ideal.js.map +1 -0
- package/dist/sim/index.d.ts +11 -0
- package/dist/sim/index.d.ts.map +1 -0
- package/dist/sim/index.js +10 -0
- package/dist/sim/index.js.map +1 -0
- package/dist/sim/params.d.ts +91 -0
- package/dist/sim/params.d.ts.map +1 -0
- package/dist/sim/params.js +195 -0
- package/dist/sim/params.js.map +1 -0
- package/dist/sim/pedroPath.d.ts +41 -0
- package/dist/sim/pedroPath.d.ts.map +1 -0
- package/dist/sim/pedroPath.js +191 -0
- package/dist/sim/pedroPath.js.map +1 -0
- package/dist/sim/plant.d.ts +59 -0
- package/dist/sim/plant.d.ts.map +1 -0
- package/dist/sim/plant.js +128 -0
- package/dist/sim/plant.js.map +1 -0
- package/dist/sim/residuals.d.ts +36 -0
- package/dist/sim/residuals.d.ts.map +1 -0
- package/dist/sim/residuals.js +86 -0
- package/dist/sim/residuals.js.map +1 -0
- package/dist/sim/simulate.d.ts +27 -0
- package/dist/sim/simulate.d.ts.map +1 -0
- package/dist/sim/simulate.js +924 -0
- package/dist/sim/simulate.js.map +1 -0
- package/dist/sim/types.d.ts +209 -0
- package/dist/sim/types.d.ts.map +1 -0
- package/dist/sim/types.js +2 -0
- package/dist/sim/types.js.map +1 -0
- package/dist/tokens.d.ts +93 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +93 -0
- package/dist/tokens.js.map +1 -0
- package/dist/trace.d.ts +89 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +187 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/unimplemented.d.ts +8 -0
- package/dist/unimplemented.d.ts.map +1 -0
- package/dist/unimplemented.js +11 -0
- package/dist/unimplemented.js.map +1 -0
- package/package.json +59 -0
package/dist/prBody.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { walkSteps } from "./diff.js";
|
|
2
|
+
/**
|
|
3
|
+
* The pull request body of site/docs/github.md: the name, what the
|
|
4
|
+
* routine does, the committed render, a table of steps with their estimates and strafe, the totals
|
|
5
|
+
* against the autonomous period, the ledger at the end and whether the simulator was run.
|
|
6
|
+
*
|
|
7
|
+
* It is built in core rather than in the CLI or the GitHub client so that `zenith propose`, the
|
|
8
|
+
* editor's Propose button and the review bot all write the same body, and so that the body can be
|
|
9
|
+
* tested without a network.
|
|
10
|
+
*/
|
|
11
|
+
/** The FTC autonomous period, used when the caller does not pass the field's own number. */
|
|
12
|
+
export const DEFAULT_PERIOD_S = 30;
|
|
13
|
+
const EN_DASH = "–";
|
|
14
|
+
const MIDDLE_DOT = "·";
|
|
15
|
+
/** A markdown table cell: a pipe in a step's detail would otherwise end the column. */
|
|
16
|
+
const cell = (text) => text.split("|").join("\\|");
|
|
17
|
+
const oneDecimal = (value) => value.toFixed(1);
|
|
18
|
+
/** `2.5 (2.0–3.0)`, or `2.5` when the band is the whole estimate's and adds nothing here. */
|
|
19
|
+
function estimateCell(step, until) {
|
|
20
|
+
if (step === undefined || step.nominalS === null) {
|
|
21
|
+
return until === null ? "unknown" : `unknown (until ${until})`;
|
|
22
|
+
}
|
|
23
|
+
const band = step.lowS === null || step.highS === null
|
|
24
|
+
? ""
|
|
25
|
+
: ` (${oneDecimal(step.lowS)}${EN_DASH}${oneDecimal(step.highS)})`;
|
|
26
|
+
const tail = until === null ? "" : ` (until ${until})`;
|
|
27
|
+
return `${oneDecimal(step.nominalS)}${band}${tail}`;
|
|
28
|
+
}
|
|
29
|
+
/** Strafe is only a question on a path step; everything else gets a dash. */
|
|
30
|
+
const strafeCell = (step) => step === undefined || step.kind !== "path" || step.strafeFraction === null
|
|
31
|
+
? EN_DASH
|
|
32
|
+
: `${String(Math.round(step.strafeFraction * 100))} %`;
|
|
33
|
+
/** The condition a step runs until, which is why it has no estimate. */
|
|
34
|
+
function until(step) {
|
|
35
|
+
if (step.kind === "wait")
|
|
36
|
+
return step.until ?? null;
|
|
37
|
+
if (step.kind === "path")
|
|
38
|
+
return step.endCondition?.condition ?? null;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const plural = (count, noun) => `${String(count)} ${noun}${count === 1 ? "" : "s"}`;
|
|
42
|
+
/** `1 error, 2 warnings`, leaving out the kinds there are none of; empty when the step is clean. */
|
|
43
|
+
function findingsCell(findings) {
|
|
44
|
+
const codes = findings
|
|
45
|
+
.filter((finding) => finding.severity !== "info")
|
|
46
|
+
.map((finding) => `${finding.severity}: ${finding.code}`);
|
|
47
|
+
return [...new Set(codes)].join(", ");
|
|
48
|
+
}
|
|
49
|
+
function countsLine(findings) {
|
|
50
|
+
const of = (severity) => findings.filter((finding) => finding.severity === severity).length;
|
|
51
|
+
return `${plural(of("error"), "error")}, ${plural(of("warning"), "warning")}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The share of the driving that was sideways, weighted by how long each path step takes, because a
|
|
55
|
+
* long leg at 40 % matters more than a short one at 80 %.
|
|
56
|
+
*/
|
|
57
|
+
function overallStrafe(estimate) {
|
|
58
|
+
if (estimate === null)
|
|
59
|
+
return EN_DASH;
|
|
60
|
+
let weighted = 0;
|
|
61
|
+
let total = 0;
|
|
62
|
+
for (const step of estimate.steps) {
|
|
63
|
+
if (step.kind !== "path" || step.strafeFraction === null || step.nominalS === null)
|
|
64
|
+
continue;
|
|
65
|
+
weighted += step.strafeFraction * step.nominalS;
|
|
66
|
+
total += step.nominalS;
|
|
67
|
+
}
|
|
68
|
+
return total === 0 ? EN_DASH : `${String(Math.round((weighted / total) * 100))} %`;
|
|
69
|
+
}
|
|
70
|
+
/** The body of the pull request a proposal opens (`06` section 3). */
|
|
71
|
+
export function prBody(auto, estimate, findings, ledgerRows, options = {}) {
|
|
72
|
+
const periodS = options.periodS ?? DEFAULT_PERIOD_S;
|
|
73
|
+
const byStep = new Map();
|
|
74
|
+
for (const finding of findings) {
|
|
75
|
+
byStep.set(finding.stepId, [...(byStep.get(finding.stepId) ?? []), finding]);
|
|
76
|
+
}
|
|
77
|
+
const lines = [`## ${auto.name}`, ""];
|
|
78
|
+
const description = auto.description ?? auto.title;
|
|
79
|
+
if (description !== undefined && description !== "")
|
|
80
|
+
lines.push(description, "");
|
|
81
|
+
if (options.renderUrl !== undefined && options.renderUrl !== "") {
|
|
82
|
+
lines.push(``, "");
|
|
83
|
+
}
|
|
84
|
+
lines.push("| step | estimate (s) | strafe | findings |", "|---|---|---|---|");
|
|
85
|
+
// Only the top-level steps get a row: a parallel group's children are its own business, and the
|
|
86
|
+
// group's estimate already covers them.
|
|
87
|
+
for (const entry of walkSteps(auto.steps).filter((step) => step.list === "steps")) {
|
|
88
|
+
const step = estimate?.byStepId[entry.id];
|
|
89
|
+
lines.push(`| ${cell(entry.id)} | ${estimateCell(step, until(entry.step))} | ${strafeCell(step)} | ${cell(findingsCell(byStep.get(entry.id) ?? []))} |`);
|
|
90
|
+
}
|
|
91
|
+
const nominal = estimate?.nominalS ?? null;
|
|
92
|
+
const low = estimate?.lowS ?? null;
|
|
93
|
+
const high = estimate?.highS ?? null;
|
|
94
|
+
const band = low === null || high === null ? "" : ` (${oneDecimal(low)}${EN_DASH}${oneDecimal(high)})`;
|
|
95
|
+
// A routine with a step that has no estimate can only be given a floor, so the total says so
|
|
96
|
+
// rather than pretending the number is the whole of it.
|
|
97
|
+
const floor = estimate?.hasUnknown === true ? "at least " : "";
|
|
98
|
+
const total = nominal === null
|
|
99
|
+
? `unknown of ${String(periodS)}`
|
|
100
|
+
: `${floor}${oneDecimal(nominal)}${band} of ${String(periodS)}`;
|
|
101
|
+
lines.push(`| **total** | **${total}** | **${overallStrafe(estimate)}** | ${countsLine(findings)} |`, "");
|
|
102
|
+
const end = ledgerRows.filter((row) => row.stepId === "end");
|
|
103
|
+
if (end.length > 0) {
|
|
104
|
+
const detail = end
|
|
105
|
+
.map((row) => `${row.label}${row.detail === undefined ? "" : ` ${row.detail}`}`)
|
|
106
|
+
.join(` ${MIDDLE_DOT} `);
|
|
107
|
+
lines.push(`Ledger at end: ${detail}`);
|
|
108
|
+
}
|
|
109
|
+
lines.push(`Sim: ${options.simSummary ?? "not run"}`);
|
|
110
|
+
return `${lines.join("\n").trim()}\n`;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=prBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prBody.js","sourceRoot":"","sources":["../src/prBody.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The provenance vocabulary of CLAUDE.md rule 4, and the three tiers it collapses into: how
|
|
3
|
+
* strongly a number is claimed, not what colour anything is drawn. The editor's chips
|
|
4
|
+
* (apps/web/UI_GUIDE.md section 4), the renderer and a CLI report all rank the same string the
|
|
5
|
+
* same way, so a PLACEHOLDER is never quietly promoted between one view of a file and another.
|
|
6
|
+
*
|
|
7
|
+
* The label is always shown in full; the tier only sorts it.
|
|
8
|
+
*/
|
|
9
|
+
export type ProvenanceTier = "measured" | "derived" | "unverified";
|
|
10
|
+
/** What a number with no provenance at all is treated as: unmeasured (UI_GUIDE section 8.3). */
|
|
11
|
+
export declare const NO_PROVENANCE = "NEEDS MEASUREMENT";
|
|
12
|
+
/** The provenance the editor writes when a human drags or types a pose. */
|
|
13
|
+
export declare const EDITOR_PROVENANCE = "SET FROM EDITOR";
|
|
14
|
+
/**
|
|
15
|
+
* The tier a string belongs to. Unverified wins over derived and derived over measured, so a
|
|
16
|
+
* label like "SET FROM SIM; PLACEHOLDER until measured" reads as the weaker of the two claims.
|
|
17
|
+
*/
|
|
18
|
+
export declare function provenanceTier(provenance: string | undefined): ProvenanceTier;
|
|
19
|
+
/** Every provenance label the chip menu offers, in the order CLAUDE.md rule 4 lists them. */
|
|
20
|
+
export declare const PROVENANCE_LABELS: readonly ["MEASURED", "SET BY HAND", "SPEC", "NEEDS MEASUREMENT", "CARRIED OVER", "PLACEHOLDER", "APPROX", "SET FROM SIM", "SET FROM EDITOR", "CALIBRATED FROM SIM", "CALIBRATED FROM ROBOT"];
|
|
21
|
+
//# sourceMappingURL=provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAgBnE,gGAAgG;AAChG,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM7E;AAED,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,+LAYpB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const MEASURED = ["MEASURED", "SPEC", "CALIBRATED FROM ROBOT"];
|
|
2
|
+
const DERIVED = [
|
|
3
|
+
"SET BY HAND",
|
|
4
|
+
"SET FROM EDITOR",
|
|
5
|
+
"SET FROM SIM",
|
|
6
|
+
"CALIBRATED FROM SIM",
|
|
7
|
+
"CARRIED OVER",
|
|
8
|
+
// Deliberately a prefix, not a label: the vocabulary's two "SET FROM ..." labels are already
|
|
9
|
+
// above, and this catches a hand-written "SET FROM RobotConfig.java", naming the robot code a
|
|
10
|
+
// number was copied from, as derived rather than dropping it to the unverified default.
|
|
11
|
+
"SET FROM",
|
|
12
|
+
];
|
|
13
|
+
const UNVERIFIED = ["NEEDS MEASUREMENT", "PLACEHOLDER", "APPROX"];
|
|
14
|
+
/** What a number with no provenance at all is treated as: unmeasured (UI_GUIDE section 8.3). */
|
|
15
|
+
export const NO_PROVENANCE = "NEEDS MEASUREMENT";
|
|
16
|
+
/** The provenance the editor writes when a human drags or types a pose. */
|
|
17
|
+
export const EDITOR_PROVENANCE = "SET FROM EDITOR";
|
|
18
|
+
/**
|
|
19
|
+
* The tier a string belongs to. Unverified wins over derived and derived over measured, so a
|
|
20
|
+
* label like "SET FROM SIM; PLACEHOLDER until measured" reads as the weaker of the two claims.
|
|
21
|
+
*/
|
|
22
|
+
export function provenanceTier(provenance) {
|
|
23
|
+
const text = (provenance ?? NO_PROVENANCE).toUpperCase();
|
|
24
|
+
if (UNVERIFIED.some((label) => text.includes(label)))
|
|
25
|
+
return "unverified";
|
|
26
|
+
if (DERIVED.some((label) => text.includes(label)))
|
|
27
|
+
return "derived";
|
|
28
|
+
if (MEASURED.some((label) => text.includes(label)))
|
|
29
|
+
return "measured";
|
|
30
|
+
return "unverified";
|
|
31
|
+
}
|
|
32
|
+
/** Every provenance label the chip menu offers, in the order CLAUDE.md rule 4 lists them. */
|
|
33
|
+
export const PROVENANCE_LABELS = [
|
|
34
|
+
"MEASURED",
|
|
35
|
+
"SET BY HAND",
|
|
36
|
+
"SPEC",
|
|
37
|
+
"NEEDS MEASUREMENT",
|
|
38
|
+
"CARRIED OVER",
|
|
39
|
+
"PLACEHOLDER",
|
|
40
|
+
"APPROX",
|
|
41
|
+
"SET FROM SIM",
|
|
42
|
+
"SET FROM EDITOR",
|
|
43
|
+
"CALIBRATED FROM SIM",
|
|
44
|
+
"CALIBRATED FROM ROBOT",
|
|
45
|
+
];
|
|
46
|
+
//# sourceMappingURL=provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.js","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"AAUA,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG;IACd,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,qBAAqB;IACrB,cAAc;IACd,6FAA6F;IAC7F,8FAA8F;IAC9F,wFAAwF;IACxF,UAAU;CACX,CAAC;AACF,MAAM,UAAU,GAAG,CAAC,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAElE,gGAAgG;AAChG,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEjD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC1E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACtE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,UAAU;IACV,aAAa;IACb,MAAM;IACN,mBAAmB;IACnB,cAAc;IACd,aAAa;IACb,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,qBAAqB;IACrB,uBAAuB;CACf,CAAC"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Estimate, Finding, LedgerRow, Plan, RenderOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* `render`: one SVG string that the pull
|
|
4
|
+
* request, the CLI's `--png` and the editor's static layer all share.
|
|
5
|
+
*
|
|
6
|
+
* Frame: `field.json` says the audience is at the bottom and +Y runs away from them, so the
|
|
7
|
+
* drawing flips Y. Everything is in field inches until the last moment, where `at()` turns a point
|
|
8
|
+
* into pixels.
|
|
9
|
+
*
|
|
10
|
+
* Colours are the literal hex of `tokens.ts`, not CSS custom properties, because an SVG that is
|
|
11
|
+
* rasterised has no stylesheet to read them from.
|
|
12
|
+
*/
|
|
13
|
+
/** How far apart the footprint ghosts are in seconds of estimated time; density shows speed. */
|
|
14
|
+
export declare const GHOST_EVERY_S = 0.5;
|
|
15
|
+
/** How far apart they are in inches when there is no estimate to place them by. */
|
|
16
|
+
export declare const GHOST_EVERY_IN = 12;
|
|
17
|
+
export declare function render(plan: Plan, estimateResult: Estimate | null, findings: readonly Finding[], ledgerRows: readonly LedgerRow[], options?: RenderOptions): string;
|
|
18
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,EAGJ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;GAUG;AAEH,gGAAgG;AAChG,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,mFAAmF;AACnF,eAAO,MAAM,cAAc,KAAK,CAAC;AA+BjC,wBAAgB,MAAM,CACpB,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,QAAQ,GAAG,IAAI,EAC/B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,UAAU,EAAE,SAAS,SAAS,EAAE,EAChC,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAyDR"}
|