@nodetool-ai/execution 0.8.1 → 0.8.3
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 +23 -127
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/app-debug/app-spec.d.ts.map +1 -1
- package/dist/app-debug/app-spec.js +3 -0
- package/dist/app-debug/app-spec.js.map +1 -1
- package/dist/app-debug/application-target.d.ts +1 -1
- package/dist/app-debug/application-target.d.ts.map +1 -1
- package/dist/app-debug/application-target.js +5 -3
- package/dist/app-debug/application-target.js.map +1 -1
- package/dist/app-debug/index.d.ts +4 -2
- package/dist/app-debug/index.d.ts.map +1 -1
- package/dist/app-debug/index.js +3 -2
- package/dist/app-debug/index.js.map +1 -1
- package/dist/app-debug/run-recording.d.ts +20 -0
- package/dist/app-debug/run-recording.d.ts.map +1 -0
- package/dist/app-debug/run-recording.js +105 -0
- package/dist/app-debug/run-recording.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +2 -0
- package/dist/app-debug/runtime.d.ts.map +1 -1
- package/dist/app-debug/runtime.js +19 -4
- package/dist/app-debug/runtime.js.map +1 -1
- package/dist/app-debug/simulate.d.ts +10 -1
- package/dist/app-debug/simulate.d.ts.map +1 -1
- package/dist/app-debug/simulate.js +67 -27
- package/dist/app-debug/simulate.js.map +1 -1
- package/dist/app-debug/summarize.d.ts +1 -0
- package/dist/app-debug/summarize.d.ts.map +1 -1
- package/dist/app-debug/summarize.js +1 -0
- package/dist/app-debug/summarize.js.map +1 -1
- package/dist/app-debug/types.d.ts +6 -4
- package/dist/app-debug/types.d.ts.map +1 -1
- package/dist/app-run-generation.d.ts +8 -0
- package/dist/app-run-generation.d.ts.map +1 -0
- package/dist/app-run-generation.js +61 -0
- package/dist/app-run-generation.js.map +1 -0
- package/dist/browser-app-run.d.ts +10 -0
- package/dist/browser-app-run.d.ts.map +1 -0
- package/dist/browser-app-run.js +108 -0
- package/dist/browser-app-run.js.map +1 -0
- package/dist/browser-run-spans.d.ts +4 -0
- package/dist/browser-run-spans.d.ts.map +1 -0
- package/dist/browser-run-spans.js +115 -0
- package/dist/browser-run-spans.js.map +1 -0
- package/dist/browser-trace-policy.d.ts +12 -0
- package/dist/browser-trace-policy.d.ts.map +1 -0
- package/dist/browser-trace-policy.js +40 -0
- package/dist/browser-trace-policy.js.map +1 -0
- package/dist/cost-ledger.d.ts +3 -0
- package/dist/cost-ledger.d.ts.map +1 -1
- package/dist/cost-ledger.js +23 -2
- package/dist/cost-ledger.js.map +1 -1
- package/dist/debug/types.d.ts +1 -0
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/verdict.d.ts +26 -1
- package/dist/debug/verdict.d.ts.map +1 -1
- package/dist/debug/verdict.js +36 -0
- package/dist/debug/verdict.js.map +1 -1
- package/dist/generation-lifecycle.d.ts +5 -4
- package/dist/generation-lifecycle.d.ts.map +1 -1
- package/dist/generation-lifecycle.js +71 -10
- package/dist/generation-lifecycle.js.map +1 -1
- package/dist/generation-recovery-worker.d.ts.map +1 -1
- package/dist/generation-recovery-worker.js +2 -0
- package/dist/generation-recovery-worker.js.map +1 -1
- package/dist/generation-tracker.d.ts +2 -15
- package/dist/generation-tracker.d.ts.map +1 -1
- package/dist/generation-tracker.js +92 -6
- package/dist/generation-tracker.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/js-script-debug/index.d.ts +1 -0
- package/dist/js-script-debug/index.d.ts.map +1 -1
- package/dist/js-script-debug/index.js +1 -0
- package/dist/js-script-debug/index.js.map +1 -1
- package/dist/js-script-debug/report.d.ts.map +1 -1
- package/dist/js-script-debug/report.js +9 -24
- package/dist/js-script-debug/report.js.map +1 -1
- package/dist/js-script-debug/type-check.d.ts +16 -0
- package/dist/js-script-debug/type-check.d.ts.map +1 -0
- package/dist/js-script-debug/type-check.js +150 -0
- package/dist/js-script-debug/type-check.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +8 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -1
- package/dist/js-script-debug/validate.js +4 -0
- package/dist/js-script-debug/validate.js.map +1 -1
- package/dist/message-stream.d.ts +1 -32
- package/dist/message-stream.d.ts.map +1 -1
- package/dist/message-stream.js +1 -57
- package/dist/message-stream.js.map +1 -1
- package/dist/partial-run.d.ts +65 -0
- package/dist/partial-run.d.ts.map +1 -0
- package/dist/partial-run.js +300 -0
- package/dist/partial-run.js.map +1 -0
- package/dist/preflight.d.ts +43 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +78 -4
- package/dist/preflight.js.map +1 -1
- package/dist/run-trace-store.d.ts +9 -0
- package/dist/run-trace-store.d.ts.map +1 -0
- package/dist/run-trace-store.js +57 -0
- package/dist/run-trace-store.js.map +1 -0
- package/dist/runs.d.ts +16 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +431 -0
- package/dist/runs.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +4 -2
- package/dist/service/app-debug-service.d.ts.map +1 -1
- package/dist/service/app-debug-service.js +73 -31
- package/dist/service/app-debug-service.js.map +1 -1
- package/dist/service/app-operation.d.ts +39 -0
- package/dist/service/app-operation.d.ts.map +1 -0
- package/dist/service/app-operation.js +271 -0
- package/dist/service/app-operation.js.map +1 -0
- package/dist/service/app-run-server.d.ts +3 -1
- package/dist/service/app-run-server.d.ts.map +1 -1
- package/dist/service/app-run-server.js +22 -14
- package/dist/service/app-run-server.js.map +1 -1
- package/dist/service/index.d.ts +5 -1
- package/dist/service/index.d.ts.map +1 -1
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -1
- package/dist/service/run-trace-lifecycle.d.ts +34 -0
- package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
- package/dist/service/run-trace-lifecycle.js +135 -0
- package/dist/service/run-trace-lifecycle.js.map +1 -0
- package/dist/service/workflow-run.d.ts +47 -16
- package/dist/service/workflow-run.d.ts.map +1 -1
- package/dist/service/workflow-run.js +210 -78
- package/dist/service/workflow-run.js.map +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +109 -100
- package/dist/session.js.map +1 -1
- package/dist/sketch-debug/markdown.d.ts.map +1 -1
- package/dist/sketch-debug/markdown.js +1 -0
- package/dist/sketch-debug/markdown.js.map +1 -1
- package/dist/sketch-debug/report.d.ts.map +1 -1
- package/dist/sketch-debug/report.js +19 -28
- package/dist/sketch-debug/report.js.map +1 -1
- package/dist/sketch-debug/types.d.ts +2 -0
- package/dist/sketch-debug/types.d.ts.map +1 -1
- package/dist/timeline-debug/frame-geometry.d.ts +120 -0
- package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
- package/dist/timeline-debug/frame-geometry.js +238 -0
- package/dist/timeline-debug/frame-geometry.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +1 -0
- package/dist/timeline-debug/index.d.ts.map +1 -1
- package/dist/timeline-debug/index.js +1 -0
- package/dist/timeline-debug/index.js.map +1 -1
- package/dist/timeline-debug/legibility.d.ts +8 -4
- package/dist/timeline-debug/legibility.d.ts.map +1 -1
- package/dist/timeline-debug/legibility.js +47 -18
- package/dist/timeline-debug/legibility.js.map +1 -1
- package/dist/timeline-debug/report.d.ts.map +1 -1
- package/dist/timeline-debug/report.js +16 -25
- package/dist/timeline-debug/report.js.map +1 -1
- package/dist/timeline-debug/score.d.ts +110 -0
- package/dist/timeline-debug/score.d.ts.map +1 -0
- package/dist/timeline-debug/score.js +231 -0
- package/dist/timeline-debug/score.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +12 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -1
- package/dist/timeline-debug/showcase.js +669 -13
- package/dist/timeline-debug/showcase.js.map +1 -1
- package/dist/timeline-debug/validate.d.ts.map +1 -1
- package/dist/timeline-debug/validate.js +121 -2
- package/dist/timeline-debug/validate.js.map +1 -1
- package/dist/types.d.ts +18 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic craft scorecard for a timeline document.
|
|
3
|
+
*
|
|
4
|
+
* `timeline validate` answers "is this document sound." This answers a
|
|
5
|
+
* different question — "does this document approach the density and polish
|
|
6
|
+
* of the shipped showcase examples" — without an LLM judge, so an agent
|
|
7
|
+
* harness change can be measured against a fixed baseline run after run.
|
|
8
|
+
*
|
|
9
|
+
* The metric set mirrors what a human reviewer counted by hand: motion
|
|
10
|
+
* density (animations/keyframes per visible second), the breadth of what is
|
|
11
|
+
* animated (distinct properties, effect types, showcase-only feature flags),
|
|
12
|
+
* and structural craft (style tracks, text animators, authored transitions,
|
|
13
|
+
* scene count — the number of distinct cut points on the timeline). Each
|
|
14
|
+
* metric is compared against the **reference band**: the same metrics
|
|
15
|
+
* computed for the shipped showcase examples
|
|
16
|
+
* (`packages/base-nodes/nodetool/examples/timelines/*.timeline.json`,
|
|
17
|
+
* excluding `t-minus-30`, which is footage-based rather than motion
|
|
18
|
+
* graphics) via `@nodetool-ai/timeline/examples/node` — the same loader the
|
|
19
|
+
* product uses to install and preview them, so the band tracks the shipped
|
|
20
|
+
* set without a second copy of it.
|
|
21
|
+
*
|
|
22
|
+
* Score formula, kept simple and explainable rather than clever: each metric
|
|
23
|
+
* earns 0.4 credit outright, plus up to 0.6 more for reaching the reference
|
|
24
|
+
* median (capped at 1.0 credit — exceeding the median earns nothing further).
|
|
25
|
+
* The score is the mean credit across metrics, as a percentage, minus 5
|
|
26
|
+
* points per *distinct* showcase-tier warning code the document carries
|
|
27
|
+
* (`checkShowcase` in `showcase.ts`, run through
|
|
28
|
+
* `validateTimelineSequence(doc, { tier: "showcase" })` — new codes land here
|
|
29
|
+
* automatically). Distinct, not per instance: four `showcase_text_collision`
|
|
30
|
+
* findings on four different clip pairs are one craft gap, not four, and
|
|
31
|
+
* penalizing by instance count lets one noisy, high-cardinality check
|
|
32
|
+
* dominate the score. `showcaseWarnings` still lists every instance (with
|
|
33
|
+
* its clip and message) and `showcaseWarningCodeCounts` breaks that list down
|
|
34
|
+
* by code, so nothing about volume is hidden — only the penalty is capped to
|
|
35
|
+
* "how many distinct things are wrong," not "how many places." The floor
|
|
36
|
+
* keeps one missing technique from cratering an otherwise dense, polished
|
|
37
|
+
* document; the median cap keeps a pathologically bloated document from
|
|
38
|
+
* buying an unbounded score by piling on one metric.
|
|
39
|
+
*/
|
|
40
|
+
import { type TimelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
|
|
41
|
+
import type { TimelineDebugIssue, TimelineValidation } from "./types.js";
|
|
42
|
+
/** The metrics scored, in the order they are reported. */
|
|
43
|
+
export declare const TIMELINE_CRAFT_METRIC_KEYS: readonly ["animationsPerSecond", "keyframesPerSecond", "distinctAnimatedProperties", "distinctEffectTypes", "featureFlagsUsed", "styleTracks", "textAnimators", "authoredTransitions", "sceneCount"];
|
|
44
|
+
export type TimelineCraftMetricKey = (typeof TIMELINE_CRAFT_METRIC_KEYS)[number];
|
|
45
|
+
export interface TimelineCraftMetrics extends Record<TimelineCraftMetricKey, number> {
|
|
46
|
+
/** Context, not scored: raw clip count. */
|
|
47
|
+
clipCount: number;
|
|
48
|
+
/** Context, not scored: seconds from 0 to the latest clip's end, floored at 1s. */
|
|
49
|
+
visibleSeconds: number;
|
|
50
|
+
}
|
|
51
|
+
/** Compute the craft metric set for a parsed timeline document. */
|
|
52
|
+
export declare function computeTimelineCraftMetrics(document: TimelineDocument): TimelineCraftMetrics;
|
|
53
|
+
export interface TimelineCraftReferenceEntry {
|
|
54
|
+
slug: string;
|
|
55
|
+
metrics: TimelineCraftMetrics;
|
|
56
|
+
}
|
|
57
|
+
export interface TimelineCraftReferenceBand {
|
|
58
|
+
entries: TimelineCraftReferenceEntry[];
|
|
59
|
+
/** Median of each metric across `entries`. 0 when there are no entries. */
|
|
60
|
+
median: Record<TimelineCraftMetricKey, number>;
|
|
61
|
+
}
|
|
62
|
+
/** Reduce a set of reference entries to the per-metric median a score compares against. */
|
|
63
|
+
export declare function summarizeTimelineCraftReferenceBand(entries: readonly TimelineCraftReferenceEntry[]): TimelineCraftReferenceBand;
|
|
64
|
+
/**
|
|
65
|
+
* The reference band, computed at runtime from the shipped examples — the
|
|
66
|
+
* same files and the same loader (`@nodetool-ai/timeline/examples/node`) the
|
|
67
|
+
* product installs and previews them from, so this never drifts from a second
|
|
68
|
+
* copy of the set.
|
|
69
|
+
*/
|
|
70
|
+
export declare function loadTimelineCraftReferenceEntries(): Promise<TimelineCraftReferenceEntry[]>;
|
|
71
|
+
/** Each metric's reported value against the reference band, plus its credit. */
|
|
72
|
+
export interface TimelineCraftMetricScore {
|
|
73
|
+
metric: TimelineCraftMetricKey;
|
|
74
|
+
value: number;
|
|
75
|
+
referenceMedian: number;
|
|
76
|
+
/** `value / referenceMedian`, uncapped — for display, not part of the score math. */
|
|
77
|
+
ratio: number;
|
|
78
|
+
/** 0..1 contribution to the score: the floor, plus a ramp to the median, capped at 1. */
|
|
79
|
+
credit: number;
|
|
80
|
+
}
|
|
81
|
+
export interface TimelineCraftScoreResult {
|
|
82
|
+
/** 0-100, clamped: `rawScore` minus the showcase-warning penalty. */
|
|
83
|
+
score: number;
|
|
84
|
+
/** 0-100 before the penalty: the mean metric credit. */
|
|
85
|
+
rawScore: number;
|
|
86
|
+
/** `PENALTY_PER_SHOWCASE_WARNING_CODE` × the number of distinct codes in `showcaseWarnings`. */
|
|
87
|
+
penalty: number;
|
|
88
|
+
metrics: TimelineCraftMetrics;
|
|
89
|
+
metricScores: TimelineCraftMetricScore[];
|
|
90
|
+
reference: TimelineCraftReferenceBand;
|
|
91
|
+
/** Every showcase-tier warning instance — one row per finding, not deduplicated. */
|
|
92
|
+
showcaseWarnings: TimelineDebugIssue[];
|
|
93
|
+
/** `showcaseWarnings` grouped by code, e.g. `{ showcase_text_collision: 4 }` — instance volume, kept visible even though the penalty is per code. */
|
|
94
|
+
showcaseWarningCodeCounts: Record<string, number>;
|
|
95
|
+
validation: TimelineValidation;
|
|
96
|
+
}
|
|
97
|
+
export interface ScoreTimelineCraftOptions {
|
|
98
|
+
fps?: number;
|
|
99
|
+
width?: number;
|
|
100
|
+
height?: number;
|
|
101
|
+
/** Defaults to `loadTimelineCraftReferenceEntries`. Tests inject a fixed band. */
|
|
102
|
+
referenceEntries?: readonly TimelineCraftReferenceEntry[];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Score a timeline document's craft against the shipped showcase examples.
|
|
106
|
+
* Never throws on a malformed document — an unparseable document scores 0 on
|
|
107
|
+
* every metric, and `validation.ok` says why.
|
|
108
|
+
*/
|
|
109
|
+
export declare function scoreTimelineCraft(raw: unknown, options?: ScoreTimelineCraftOptions): Promise<TimelineCraftScoreResult>;
|
|
110
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAazE,0DAA0D;AAC1D,eAAO,MAAM,0BAA0B,YACrC,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,YAAY,CACJ,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,oBACf,SAAQ,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,mEAAmE;AACnE,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,gBAAgB,GACzB,oBAAoB,CA0DtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACvC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;CAChD;AAWD,2FAA2F;AAC3F,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,SAAS,2BAA2B,EAAE,GAC9C,0BAA0B,CAQ5B;AAOD;;;;;GAKG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAChE,2BAA2B,EAAE,CAC9B,CAqBA;AAED,gFAAgF;AAChF,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,EAAE,CAAC;IACzC,SAAS,EAAE,0BAA0B,CAAC;IACtC,oFAAoF;IACpF,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,qJAAqJ;IACrJ,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAOD,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC3D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA0DnC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic craft scorecard for a timeline document.
|
|
3
|
+
*
|
|
4
|
+
* `timeline validate` answers "is this document sound." This answers a
|
|
5
|
+
* different question — "does this document approach the density and polish
|
|
6
|
+
* of the shipped showcase examples" — without an LLM judge, so an agent
|
|
7
|
+
* harness change can be measured against a fixed baseline run after run.
|
|
8
|
+
*
|
|
9
|
+
* The metric set mirrors what a human reviewer counted by hand: motion
|
|
10
|
+
* density (animations/keyframes per visible second), the breadth of what is
|
|
11
|
+
* animated (distinct properties, effect types, showcase-only feature flags),
|
|
12
|
+
* and structural craft (style tracks, text animators, authored transitions,
|
|
13
|
+
* scene count — the number of distinct cut points on the timeline). Each
|
|
14
|
+
* metric is compared against the **reference band**: the same metrics
|
|
15
|
+
* computed for the shipped showcase examples
|
|
16
|
+
* (`packages/base-nodes/nodetool/examples/timelines/*.timeline.json`,
|
|
17
|
+
* excluding `t-minus-30`, which is footage-based rather than motion
|
|
18
|
+
* graphics) via `@nodetool-ai/timeline/examples/node` — the same loader the
|
|
19
|
+
* product uses to install and preview them, so the band tracks the shipped
|
|
20
|
+
* set without a second copy of it.
|
|
21
|
+
*
|
|
22
|
+
* Score formula, kept simple and explainable rather than clever: each metric
|
|
23
|
+
* earns 0.4 credit outright, plus up to 0.6 more for reaching the reference
|
|
24
|
+
* median (capped at 1.0 credit — exceeding the median earns nothing further).
|
|
25
|
+
* The score is the mean credit across metrics, as a percentage, minus 5
|
|
26
|
+
* points per *distinct* showcase-tier warning code the document carries
|
|
27
|
+
* (`checkShowcase` in `showcase.ts`, run through
|
|
28
|
+
* `validateTimelineSequence(doc, { tier: "showcase" })` — new codes land here
|
|
29
|
+
* automatically). Distinct, not per instance: four `showcase_text_collision`
|
|
30
|
+
* findings on four different clip pairs are one craft gap, not four, and
|
|
31
|
+
* penalizing by instance count lets one noisy, high-cardinality check
|
|
32
|
+
* dominate the score. `showcaseWarnings` still lists every instance (with
|
|
33
|
+
* its clip and message) and `showcaseWarningCodeCounts` breaks that list down
|
|
34
|
+
* by code, so nothing about volume is hidden — only the penalty is capped to
|
|
35
|
+
* "how many distinct things are wrong," not "how many places." The floor
|
|
36
|
+
* keeps one missing technique from cratering an otherwise dense, polished
|
|
37
|
+
* document; the median cap keeps a pathologically bloated document from
|
|
38
|
+
* buying an unbounded score by piling on one metric.
|
|
39
|
+
*/
|
|
40
|
+
import { timelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
|
|
41
|
+
import { validateTimelineSequence } from "./validate.js";
|
|
42
|
+
/** Clip-level boolean/object flags that mark showcase-grade technique. */
|
|
43
|
+
const FEATURE_FLAGS = [
|
|
44
|
+
"repeater",
|
|
45
|
+
"motionBlur",
|
|
46
|
+
"layout",
|
|
47
|
+
"blendMode",
|
|
48
|
+
"mask",
|
|
49
|
+
"animationLinks",
|
|
50
|
+
"temporalEcho"
|
|
51
|
+
];
|
|
52
|
+
/** The metrics scored, in the order they are reported. */
|
|
53
|
+
export const TIMELINE_CRAFT_METRIC_KEYS = [
|
|
54
|
+
"animationsPerSecond",
|
|
55
|
+
"keyframesPerSecond",
|
|
56
|
+
"distinctAnimatedProperties",
|
|
57
|
+
"distinctEffectTypes",
|
|
58
|
+
"featureFlagsUsed",
|
|
59
|
+
"styleTracks",
|
|
60
|
+
"textAnimators",
|
|
61
|
+
"authoredTransitions",
|
|
62
|
+
"sceneCount"
|
|
63
|
+
];
|
|
64
|
+
const MIN_VISIBLE_SECONDS = 1;
|
|
65
|
+
/** Compute the craft metric set for a parsed timeline document. */
|
|
66
|
+
export function computeTimelineCraftMetrics(document) {
|
|
67
|
+
const clips = document.clips;
|
|
68
|
+
const clipCount = clips.length;
|
|
69
|
+
const durationMs = clips.reduce((end, clip) => Math.max(end, clip.startMs + clip.durationMs), 0);
|
|
70
|
+
const visibleSeconds = Math.max(MIN_VISIBLE_SECONDS, durationMs / 1000);
|
|
71
|
+
let animations = 0;
|
|
72
|
+
let keyframes = 0;
|
|
73
|
+
let styleTracks = 0;
|
|
74
|
+
let textAnimators = 0;
|
|
75
|
+
let authoredTransitions = 0;
|
|
76
|
+
const properties = new Set();
|
|
77
|
+
const effectTypes = new Set();
|
|
78
|
+
const sceneBoundaries = new Set();
|
|
79
|
+
for (const clip of clips) {
|
|
80
|
+
sceneBoundaries.add(Math.round(clip.startMs));
|
|
81
|
+
if (clip.transitionIn)
|
|
82
|
+
authoredTransitions += 1;
|
|
83
|
+
for (const effect of clip.effects ?? []) {
|
|
84
|
+
effectTypes.add(effect.type);
|
|
85
|
+
}
|
|
86
|
+
for (const animation of clip.animations ?? []) {
|
|
87
|
+
animations += 1;
|
|
88
|
+
for (const curve of animation.custom?.curves ?? []) {
|
|
89
|
+
properties.add(curve.property);
|
|
90
|
+
keyframes += curve.keyframes.length;
|
|
91
|
+
}
|
|
92
|
+
styleTracks += (animation.styleTracks ?? []).length;
|
|
93
|
+
if (animation.textAnimator)
|
|
94
|
+
textAnimators += 1;
|
|
95
|
+
// A named preset animates a property too, even without a baked curve —
|
|
96
|
+
// "spin" or "kenBurns" is as much an animated property as a custom
|
|
97
|
+
// curve on `rotation` is.
|
|
98
|
+
if (animation.preset && animation.preset !== "custom") {
|
|
99
|
+
properties.add(`preset:${animation.preset}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const featureFlagsUsed = FEATURE_FLAGS.filter((flag) => clips.some((clip) => Boolean(clip[flag]))).length;
|
|
104
|
+
return {
|
|
105
|
+
clipCount,
|
|
106
|
+
visibleSeconds,
|
|
107
|
+
animationsPerSecond: animations / visibleSeconds,
|
|
108
|
+
keyframesPerSecond: keyframes / visibleSeconds,
|
|
109
|
+
distinctAnimatedProperties: properties.size,
|
|
110
|
+
distinctEffectTypes: effectTypes.size,
|
|
111
|
+
featureFlagsUsed,
|
|
112
|
+
styleTracks,
|
|
113
|
+
textAnimators,
|
|
114
|
+
authoredTransitions,
|
|
115
|
+
sceneCount: sceneBoundaries.size
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function medianOf(values) {
|
|
119
|
+
if (values.length === 0)
|
|
120
|
+
return 0;
|
|
121
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
122
|
+
const mid = Math.floor(sorted.length / 2);
|
|
123
|
+
return sorted.length % 2 === 1
|
|
124
|
+
? sorted[mid]
|
|
125
|
+
: (sorted[mid - 1] + sorted[mid]) / 2;
|
|
126
|
+
}
|
|
127
|
+
/** Reduce a set of reference entries to the per-metric median a score compares against. */
|
|
128
|
+
export function summarizeTimelineCraftReferenceBand(entries) {
|
|
129
|
+
const median = Object.fromEntries(TIMELINE_CRAFT_METRIC_KEYS.map((key) => [
|
|
130
|
+
key,
|
|
131
|
+
medianOf(entries.map((entry) => entry.metrics[key]))
|
|
132
|
+
]));
|
|
133
|
+
return { entries: [...entries], median };
|
|
134
|
+
}
|
|
135
|
+
/** File suffix the shipped example bundles are named with. */
|
|
136
|
+
const EXAMPLE_SUFFIX = ".timeline.json";
|
|
137
|
+
/** Footage-based, not motion graphics — excluded from the reference band. */
|
|
138
|
+
const EXCLUDED_EXAMPLE_SLUGS = new Set(["t-minus-30"]);
|
|
139
|
+
/**
|
|
140
|
+
* The reference band, computed at runtime from the shipped examples — the
|
|
141
|
+
* same files and the same loader (`@nodetool-ai/timeline/examples/node`) the
|
|
142
|
+
* product installs and previews them from, so this never drifts from a second
|
|
143
|
+
* copy of the set.
|
|
144
|
+
*/
|
|
145
|
+
export async function loadTimelineCraftReferenceEntries() {
|
|
146
|
+
const { resolveExampleTimelinesDir, getExampleTimelineBundle } = await import("@nodetool-ai/timeline/examples/node");
|
|
147
|
+
const dir = resolveExampleTimelinesDir();
|
|
148
|
+
if (!dir)
|
|
149
|
+
return [];
|
|
150
|
+
const { readdirSync } = await import("node:fs");
|
|
151
|
+
const slugs = readdirSync(dir)
|
|
152
|
+
.filter((file) => file.endsWith(EXAMPLE_SUFFIX))
|
|
153
|
+
.map((file) => file.slice(0, -EXAMPLE_SUFFIX.length))
|
|
154
|
+
.filter((slug) => !EXCLUDED_EXAMPLE_SLUGS.has(slug))
|
|
155
|
+
.sort();
|
|
156
|
+
const entries = [];
|
|
157
|
+
for (const slug of slugs) {
|
|
158
|
+
const bundle = getExampleTimelineBundle({}, slug);
|
|
159
|
+
if (!bundle)
|
|
160
|
+
continue;
|
|
161
|
+
entries.push({
|
|
162
|
+
slug,
|
|
163
|
+
metrics: computeTimelineCraftMetrics(bundle.document)
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return entries;
|
|
167
|
+
}
|
|
168
|
+
/** Every metric earns this much credit outright, even at zero. */
|
|
169
|
+
const CREDIT_FLOOR = 0.4;
|
|
170
|
+
/** Points subtracted per distinct showcase-tier warning code the document carries. */
|
|
171
|
+
const PENALTY_PER_SHOWCASE_WARNING_CODE = 5;
|
|
172
|
+
function creditFor(value, median) {
|
|
173
|
+
if (median <= 0)
|
|
174
|
+
return value > 0 ? 1 : CREDIT_FLOOR;
|
|
175
|
+
return Math.min(1, CREDIT_FLOOR + (1 - CREDIT_FLOOR) * (value / median));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Score a timeline document's craft against the shipped showcase examples.
|
|
179
|
+
* Never throws on a malformed document — an unparseable document scores 0 on
|
|
180
|
+
* every metric, and `validation.ok` says why.
|
|
181
|
+
*/
|
|
182
|
+
export async function scoreTimelineCraft(raw, options = {}) {
|
|
183
|
+
const validation = validateTimelineSequence(raw, {
|
|
184
|
+
tier: "showcase",
|
|
185
|
+
fps: options.fps,
|
|
186
|
+
width: options.width,
|
|
187
|
+
height: options.height
|
|
188
|
+
});
|
|
189
|
+
const parsed = timelineDocument.safeParse(raw);
|
|
190
|
+
const document = parsed.success
|
|
191
|
+
? parsed.data
|
|
192
|
+
: { tracks: [], clips: [], markers: [] };
|
|
193
|
+
const metrics = computeTimelineCraftMetrics(document);
|
|
194
|
+
const entries = options.referenceEntries ?? (await loadTimelineCraftReferenceEntries());
|
|
195
|
+
const reference = summarizeTimelineCraftReferenceBand(entries);
|
|
196
|
+
const showcaseWarnings = validation.warnings.filter((warning) => warning.code.startsWith("showcase_"));
|
|
197
|
+
const metricScores = TIMELINE_CRAFT_METRIC_KEYS.map((metric) => {
|
|
198
|
+
const value = metrics[metric];
|
|
199
|
+
const referenceMedian = reference.median[metric];
|
|
200
|
+
return {
|
|
201
|
+
metric,
|
|
202
|
+
value,
|
|
203
|
+
referenceMedian,
|
|
204
|
+
ratio: referenceMedian > 0 ? value / referenceMedian : value > 0 ? 1 : 0,
|
|
205
|
+
credit: creditFor(value, referenceMedian)
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
const rawScore = (metricScores.reduce((sum, entry) => sum + entry.credit, 0) /
|
|
209
|
+
metricScores.length) *
|
|
210
|
+
100;
|
|
211
|
+
const showcaseWarningCodeCounts = {};
|
|
212
|
+
for (const warning of showcaseWarnings) {
|
|
213
|
+
showcaseWarningCodeCounts[warning.code] =
|
|
214
|
+
(showcaseWarningCodeCounts[warning.code] ?? 0) + 1;
|
|
215
|
+
}
|
|
216
|
+
const distinctShowcaseCodes = Object.keys(showcaseWarningCodeCounts).length;
|
|
217
|
+
const penalty = distinctShowcaseCodes * PENALTY_PER_SHOWCASE_WARNING_CODE;
|
|
218
|
+
const score = Math.max(0, Math.min(100, rawScore - penalty));
|
|
219
|
+
return {
|
|
220
|
+
score,
|
|
221
|
+
rawScore,
|
|
222
|
+
penalty,
|
|
223
|
+
metrics,
|
|
224
|
+
metricScores,
|
|
225
|
+
reference,
|
|
226
|
+
showcaseWarnings,
|
|
227
|
+
showcaseWarningCodeCounts,
|
|
228
|
+
validation
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/timeline-debug/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import type { TimelineDocument } from "@nodetool-ai/protocol/api-schemas/timeline.js";
|
|
2
2
|
import type { TimelineDebugIssue } from "./types.js";
|
|
3
|
+
export declare const SHOWCASE_FLOOR: {
|
|
4
|
+
groups: number;
|
|
5
|
+
customPerSecond: number;
|
|
6
|
+
effects: number;
|
|
7
|
+
clipsPerSecond: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const SHOWCASE_TARGET: {
|
|
10
|
+
groups: number;
|
|
11
|
+
customPerSecond: number;
|
|
12
|
+
effects: number;
|
|
13
|
+
clipsPerSecond: number;
|
|
14
|
+
};
|
|
3
15
|
export declare function checkShowcase(doc: TimelineDocument, canvas: {
|
|
4
16
|
width: number;
|
|
5
17
|
height: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/showcase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/timeline-debug/showcase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AAuBvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAmBrD,eAAO,MAAM,cAAc;IACzB,MAAM;IACN,eAAe;IACf,OAAO;IACP,cAAc;CACf,CAAC;AACF,eAAO,MAAM,eAAe;IAC1B,MAAM;IACN,eAAe;IACf,OAAO;IACP,cAAc;CACf,CAAC;AAi3BF,wBAAgB,aAAa,CAC3B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,kBAAkB,EAAE,CA4QtB"}
|