@helix3/helix-cli 0.1.7-helix3.44 → 0.1.7-helix3.46

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/dist/ability.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { INSTALLED_INDEX, MODULES_DIR } from './paths';
1
2
  export type ManifestIssue = {
2
3
  path: string;
3
4
  message: string;
@@ -54,8 +55,7 @@ export type AbilityBundleCheck = {
54
55
  export declare function bundlesThree(entrySource: string): boolean;
55
56
  /** Validates an ability bundle directory: ability.json against the frozen contract + referenced files exist. */
56
57
  export declare function checkAbilityBundle(root: string, validator: AbilityValidator): AbilityBundleCheck;
57
- export declare const MODULES_DIR = "helix_modules";
58
- export declare const INSTALLED_INDEX = "installed.json";
58
+ export { MODULES_DIR, INSTALLED_INDEX };
59
59
  export type InstallResult = {
60
60
  id: string;
61
61
  version: string;
package/dist/ability.js CHANGED
@@ -9,6 +9,9 @@ exports.installLocalAbility = installLocalAbility;
9
9
  const node_fs_1 = require("node:fs");
10
10
  const node_path_1 = require("node:path");
11
11
  const node_url_1 = require("node:url");
12
+ const paths_1 = require("./paths");
13
+ Object.defineProperty(exports, "INSTALLED_INDEX", { enumerable: true, get: function () { return paths_1.INSTALLED_INDEX; } });
14
+ Object.defineProperty(exports, "MODULES_DIR", { enumerable: true, get: function () { return paths_1.MODULES_DIR; } });
12
15
  // The vendor file is ESM; this package compiles to CommonJS, where tsc downlevels `import()` to
13
16
  // `require()` — which cannot load ESM. The Function indirection keeps the native dynamic import.
14
17
  const dynamicImport = new Function('specifier', 'return import(specifier)');
@@ -82,8 +85,6 @@ function checkAbilityBundle(root, validator) {
82
85
  }
83
86
  return { manifest: errors.length ? null : manifest, errors };
84
87
  }
85
- exports.MODULES_DIR = 'helix_modules';
86
- exports.INSTALLED_INDEX = 'installed.json';
87
88
  /**
88
89
  * `helix install <bundle> --first-party` (a.k.a. `--local`): the FIRST-PARTY whole-bundle copy —
89
90
  * validates, copies the bundle (code AND clips) into `<worldDir>/helix_modules/<id>/`, and upserts a
@@ -96,14 +97,14 @@ function installLocalAbility(bundleDir, worldDir, validator, indexValidator) {
96
97
  throw new Error(`bundle refused:\n${check.errors.map((e) => ` - ${e}`).join('\n')}`);
97
98
  }
98
99
  const { id, version } = check.manifest;
99
- const modulesDir = (0, node_path_1.join)(worldDir, exports.MODULES_DIR);
100
- const indexPath = (0, node_path_1.join)(modulesDir, exports.INSTALLED_INDEX);
100
+ const modulesDir = (0, node_path_1.join)(worldDir, paths_1.MODULES_DIR);
101
+ const indexPath = (0, node_path_1.join)(modulesDir, paths_1.INSTALLED_INDEX);
101
102
  let index = [];
102
103
  if ((0, node_fs_1.existsSync)(indexPath)) {
103
104
  const parsed = JSON.parse((0, node_fs_1.readFileSync)(indexPath, 'utf8'));
104
105
  const issues = indexValidator.validateInstalledIndex(parsed);
105
106
  if (issues.length) {
106
- throw new Error(`existing ${exports.INSTALLED_INDEX} is invalid (delete it to regenerate):\n${issues.map((i) => ` ${i.path}: ${i.message}`).join('\n')}`);
107
+ throw new Error(`existing ${paths_1.INSTALLED_INDEX} is invalid (delete it to regenerate):\n${issues.map((i) => ` ${i.path}: ${i.message}`).join('\n')}`);
107
108
  }
108
109
  index = parsed;
109
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ability.js","sourceRoot":"","sources":["../src/ability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ability.js","sourceRoot":"","sources":["../src/ability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Mirrors the engine's exported `BoneAxisReference` — a structural type for what we read, not a second copy. */
2
+ export interface BoneAxisReference {
3
+ bones: RegExp;
4
+ /** Human-terms meaning of each axis (what a POSITIVE value does; negative is the opposite). */
5
+ axes: {
6
+ x: string;
7
+ y: string;
8
+ z: string;
9
+ };
10
+ /** Suggested natural range [min, max] per axis, degrees. Outside → compile warning, not error. */
11
+ natural: {
12
+ x: [number, number];
13
+ y: [number, number];
14
+ z: [number, number];
15
+ };
16
+ }
17
+ export declare function axisReferenceFor(table: readonly BoneAxisReference[], bone: string): BoneAxisReference | undefined;
18
+ /** `/^upperarm_(l|r)$/` → `upperarm_l/r` — the regex is the matcher; this is what a human reads. */
19
+ export declare function boneLabel(pattern: RegExp): string;
20
+ /** Markdown table — what `helix gesture axes` prints and the MCP curriculum points at. */
21
+ export declare function renderAxisTableMarkdown(table: readonly BoneAxisReference[]): string;
22
+ export declare function renderAxisTableJson(table: readonly BoneAxisReference[]): unknown;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ // Renderers for the bone axis table. There is NO copy of the table here: it is read at runtime from the
3
+ // world's installed humanoid-character system, the same module this command already loads compileGesture
4
+ // and GesturePlayer from. One authored home (the engine's src/animation/gestures/poseDsl.ts), and what
5
+ // you see is the table the version YOU pinned actually lints against.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.axisReferenceFor = axisReferenceFor;
8
+ exports.boneLabel = boneLabel;
9
+ exports.renderAxisTableMarkdown = renderAxisTableMarkdown;
10
+ exports.renderAxisTableJson = renderAxisTableJson;
11
+ function axisReferenceFor(table, bone) {
12
+ return table.find((entry) => entry.bones.test(bone));
13
+ }
14
+ /** `/^upperarm_(l|r)$/` → `upperarm_l/r` — the regex is the matcher; this is what a human reads. */
15
+ function boneLabel(pattern) {
16
+ return pattern.source.replace(/^\^/, '').replace(/\$$/, '').replace(/\((l\|r)\)/g, 'l/r').replace(/\\d\\d/g, 'NN');
17
+ }
18
+ const fmtRange = ([min, max]) => (min === -max ? `±${max}` : `${min}…${max}`);
19
+ /** Markdown table — what `helix gesture axes` prints and the MCP curriculum points at. */
20
+ function renderAxisTableMarkdown(table) {
21
+ const rows = table.map((e) => {
22
+ const nat = `${fmtRange(e.natural.x)} / ${fmtRange(e.natural.y)} / ${fmtRange(e.natural.z)}`;
23
+ return `| \`${boneLabel(e.bones)}\` | ${e.axes.x} | ${e.axes.y} | ${e.axes.z} | ${nat} |`;
24
+ });
25
+ return ['| Bone | X (+) | Y (+) | Z (+) | natural X / Y / Z |', '|---|---|---|---|---|', ...rows].join('\n');
26
+ }
27
+ function renderAxisTableJson(table) {
28
+ return {
29
+ groups: table.map((e) => ({ bones: boneLabel(e.bones), pattern: e.bones.source, axes: e.axes, natural: e.natural })),
30
+ };
31
+ }
32
+ //# sourceMappingURL=axisReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axisReference.js","sourceRoot":"","sources":["../../src/gesture/axisReference.ts"],"names":[],"mappings":";AAAA,wGAAwG;AACxG,yGAAyG;AACzG,uGAAuG;AACvG,sEAAsE;;AAWtE,4CAEC;AAGD,8BAEC;AAKD,0DAMC;AAED,kDAIC;AAxBD,SAAgB,gBAAgB,CAAC,KAAmC,EAAE,IAAY;IAChF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,oGAAoG;AACpG,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAmB,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;AAExG,0FAA0F;AAC1F,SAAgB,uBAAuB,CAAC,KAAmC;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,OAAO,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,sDAAsD,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/G,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAmC;IACrE,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KACrH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { type BrowserKey } from '../screenshot/captureScreenshots';
2
+ import { type HarnessConfig } from './harnessPage';
3
+ export declare const VIEW_NAMES: readonly ["front", "back", "right", "left", "three-quarter"];
4
+ export type ViewName = typeof VIEW_NAMES[number];
5
+ export declare const MAX_VIEWS = 2;
6
+ /**
7
+ * Camera azimuth around Y, 0 = front. left/right are the CHARACTER's own, matching the readback's
8
+ * character-left / character-right — a viewer-relative reading would invert them, which is the trap to avoid.
9
+ * `three-quarter` follows the clip's ACTIVE side: from the wrong side it occludes as badly as a lateral view.
10
+ */
11
+ export declare function viewAzimuth(view: ViewName, side: 'left' | 'right'): number;
12
+ export declare function viewLabel(view: ViewName, side: 'left' | 'right'): string;
13
+ export type CaptureGestureOptions = {
14
+ worldDir: string;
15
+ clip: string;
16
+ out: string;
17
+ frames?: number;
18
+ /** Up to two of front | back | left | right. Omitted, the side is derived from which side the clip keys. */
19
+ views?: ViewName[];
20
+ /** One moment instead of a sequence: seconds, or a percentage of duration like '60%'. Views go side by
21
+ * side at roughly 1.8x the cell size, for inspecting a specific detail rather than comparing over time. */
22
+ at?: number | string;
23
+ cellHeight?: number;
24
+ timeoutMs?: number;
25
+ browser?: BrowserKey;
26
+ onProgress?: (message: string) => void;
27
+ };
28
+ export type CaptureGestureResult = {
29
+ file: string;
30
+ clip: string;
31
+ duration: number;
32
+ times: number[];
33
+ views: ViewName[];
34
+ /** True when a single moment was captured, so views are columns rather than rows. */
35
+ moment: boolean;
36
+ /** True when both views look down the same axis, so neither reveals depth — worth telling the caller. */
37
+ sharedAxis: boolean;
38
+ warnings: string[];
39
+ };
40
+ export declare function captureGesture(opts: CaptureGestureOptions): Promise<CaptureGestureResult>;
41
+ type ClipShape = {
42
+ duration?: unknown;
43
+ mask?: unknown;
44
+ overrideMask?: unknown;
45
+ keys?: unknown;
46
+ };
47
+ /**
48
+ * A sequence reads best with time across and views stacked; a single moment reads best with the views SIDE BY
49
+ * SIDE, so the two renders of the same instant sit next to each other for comparison.
50
+ */
51
+ export declare function arrangeGrid(times: number[], views: ViewName[], moment: boolean, side: 'left' | 'right'): Omit<HarnessConfig, 'cellW' | 'cellH'>;
52
+ /** `--at` takes seconds or a percentage of duration, matching `inspect --t`. */
53
+ export declare function parseMoment(at: number | string, duration: number): number;
54
+ /**
55
+ * Which side of the body a clip actually works on, so a left-handed gesture is never rendered from the side
56
+ * its own torso hides. The clip already declares this, so it is derived rather than asked for.
57
+ *
58
+ * KEYED BONES ARE THE GROUND TRUTH — most masks say nothing about sidedness. Of the authorable set
59
+ * (upperBody, lowerBody, leftArm, rightArm, spine, armsHead) only two are one-sided; the rest are bilateral,
60
+ * so a left-handed clip masked `upperBody` is identified by its bones, not its mask. The mask is consulted
61
+ * only as a tiebreaker, and by PATTERN rather than an exact name, so a future one-sided mask works untouched.
62
+ */
63
+ export declare function clipSide(source: ClipShape): 'left' | 'right';
64
+ /**
65
+ * Defaults differ by MODE, because the modes answer different questions. A sequence is compared over time, so
66
+ * it wants the ORTHOGONAL pair — front plus a lateral — which is what makes "moves side-to-side, not
67
+ * front-to-back" readable; a 3/4 there would conflate the two axes it exists to separate. A single moment is
68
+ * being disambiguated, so it wants the 3/4, which lifts a limb clear of the torso instead of hiding it behind
69
+ * it. Every view stays legal in both modes: a mode-dependent enum would be a footgun to document, and neither
70
+ * pairing is actually invalid.
71
+ */
72
+ export declare function resolveViews(requested: ViewName[] | undefined, source: ClipShape, moment?: boolean): ViewName[];
73
+ /** front+back and left+right are each a single axis seen twice: both are frontal projections of the same plane. */
74
+ export declare function sharesAxis(views: ViewName[]): boolean;
75
+ export {};
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MAX_VIEWS = exports.VIEW_NAMES = void 0;
37
+ exports.viewAzimuth = viewAzimuth;
38
+ exports.viewLabel = viewLabel;
39
+ exports.captureGesture = captureGesture;
40
+ exports.arrangeGrid = arrangeGrid;
41
+ exports.parseMoment = parseMoment;
42
+ exports.clipSide = clipSide;
43
+ exports.resolveViews = resolveViews;
44
+ exports.sharesAxis = sharesAxis;
45
+ // Renders a gesture clip as a contact sheet — front and side, several times across the clip — so an agent
46
+ // with no browser can still LOOK at a pose before handing it to a human. Measurement (./inspect) says where
47
+ // the bones are; this says how it reads, which is the one thing numbers cannot.
48
+ //
49
+ // Always the DEFAULT character: a clip replicates by name and plays on whatever body each player has, so a
50
+ // pose is authored against the canonical body every custom character is conformed to. That is why the render
51
+ // assets are vendored (see vendor/README.md) and this needs no asset download.
52
+ const node_fs_1 = require("node:fs");
53
+ const node_os_1 = require("node:os");
54
+ const node_path_1 = require("node:path");
55
+ const captureScreenshots_1 = require("../screenshot/captureScreenshots");
56
+ const staticServe_1 = require("../screenshot/staticServe");
57
+ const harnessPage_1 = require("./harnessPage");
58
+ const worldRuntime_1 = require("./worldRuntime");
59
+ const paths_1 = require("../paths");
60
+ /** 0/25/50/75/100 % of the clip — enough to read a gesture's arc without a sheet per frame. */
61
+ const DEFAULT_FRAMES = 5;
62
+ exports.VIEW_NAMES = ['front', 'back', 'right', 'left', 'three-quarter'];
63
+ exports.MAX_VIEWS = 2;
64
+ /** Far enough off-axis to lift a limb clear of the torso silhouette, near enough to still read as a front view. */
65
+ const THREE_QUARTER_DEG = 40;
66
+ /**
67
+ * Camera azimuth around Y, 0 = front. left/right are the CHARACTER's own, matching the readback's
68
+ * character-left / character-right — a viewer-relative reading would invert them, which is the trap to avoid.
69
+ * `three-quarter` follows the clip's ACTIVE side: from the wrong side it occludes as badly as a lateral view.
70
+ */
71
+ function viewAzimuth(view, side) {
72
+ switch (view) {
73
+ case 'front': return 0;
74
+ case 'back': return 180;
75
+ case 'right': return -90;
76
+ case 'left': return 90;
77
+ case 'three-quarter': return side === 'left' ? THREE_QUARTER_DEG : -THREE_QUARTER_DEG;
78
+ }
79
+ }
80
+ function viewLabel(view, side) {
81
+ if (view === 'three-quarter')
82
+ return `3/4 ${side}`;
83
+ return view === 'left' || view === 'right' ? `${view} side` : view;
84
+ }
85
+ // Portrait, because a standing figure is tall and narrow — a square cell spends ~40% of its pixels on background.
86
+ const DEFAULT_CELL_H = 420;
87
+ const CELL_ASPECT = 0.52;
88
+ // A single moment gets the whole image budget instead of a fifth of it: with only two cells there is room to
89
+ // see a hand's orientation, which is what a "fix this specific thing" question actually turns on.
90
+ const MOMENT_CELL_H = 760;
91
+ const MOMENT_ASPECT = 0.62;
92
+ /** vendor/ ships beside dist/ in the published package and sits one level up from it in the repo. */
93
+ function vendorDir() {
94
+ return (0, node_path_1.resolve)(__dirname, '..', '..', 'vendor');
95
+ }
96
+ async function captureGesture(opts) {
97
+ const onProgress = opts.onProgress ?? (() => undefined);
98
+ const frames = Math.max(2, opts.frames ?? DEFAULT_FRAMES);
99
+ const moment = opts.at !== undefined;
100
+ const cellH = opts.cellHeight ?? (moment ? MOMENT_CELL_H : DEFAULT_CELL_H);
101
+ const cellW = Math.round(cellH * (moment ? MOMENT_ASPECT : CELL_ASPECT));
102
+ const timeoutMs = opts.timeoutMs ?? 60000;
103
+ const systemDir = (0, node_path_1.join)(opts.worldDir, 'public', paths_1.MODULES_DIR, worldRuntime_1.SYSTEM_SLUG);
104
+ const threeDir = (0, worldRuntime_1.threeRoot)(opts.worldDir); // the same walk inspect uses — hoisted layouts, friendly npm-install error
105
+ const stage = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'helix-gesture-shot-'));
106
+ let browser;
107
+ let server;
108
+ try {
109
+ // Linked, not copied: three's addons tree is large, and the static server's traversal guard compares
110
+ // path STRINGS against the root, so a link resolving outside it still serves.
111
+ (0, node_fs_1.symlinkSync)(threeDir, (0, node_path_1.join)(stage, 'three'), 'junction');
112
+ (0, node_fs_1.symlinkSync)((0, node_path_1.dirname)(systemDir), (0, node_path_1.join)(stage, paths_1.MODULES_DIR), 'junction');
113
+ (0, node_fs_1.copyFileSync)((0, node_path_1.join)(vendorDir(), 'capture-body.glb'), (0, node_path_1.join)(stage, 'capture-body.glb'));
114
+ (0, node_fs_1.copyFileSync)((0, node_path_1.join)(vendorDir(), 'capture-face.glb'), (0, node_path_1.join)(stage, 'capture-face.glb'));
115
+ (0, node_fs_1.copyFileSync)(opts.clip, (0, node_path_1.join)(stage, 'clip.json'));
116
+ // The page needs concrete seconds, not fractions, so the clip is parsed here rather than in-page.
117
+ const source = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(stage, 'clip.json'), 'utf8'));
118
+ const duration = readDuration(source, opts.clip);
119
+ const side = clipSide(source);
120
+ const chosen = resolveViews(opts.views, source, moment);
121
+ const times = moment
122
+ ? [parseMoment(opts.at, duration)]
123
+ : Array.from({ length: frames }, (_, i) => Math.round((i / (frames - 1)) * duration * 1000) / 1000);
124
+ const config = { ...arrangeGrid(times, chosen, moment, side), cellW, cellH };
125
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(stage, 'index.html'), (0, harnessPage_1.harnessPage)(config));
126
+ const playwright = await Promise.resolve().then(() => __importStar(require('playwright')));
127
+ server = await (0, staticServe_1.startStaticServer)(stage);
128
+ const attempts = [];
129
+ for (const candidate of (0, captureScreenshots_1.selectBrowserCandidates)(opts.browser)) {
130
+ try {
131
+ browser = await playwright.chromium.launch(candidate.launchOptions);
132
+ onProgress(`using ${candidate.label}`);
133
+ break;
134
+ }
135
+ catch (err) {
136
+ attempts.push({ key: candidate.key, label: candidate.label, message: err instanceof Error ? err.message : String(err) });
137
+ }
138
+ }
139
+ if (!browser)
140
+ throw new Error((0, captureScreenshots_1.composeLaunchFailure)(attempts));
141
+ const page = await browser.newPage({
142
+ viewport: { width: config.colLabels.length * cellW + 32, height: config.rowLabels.length * cellH + 32 },
143
+ deviceScaleFactor: 1,
144
+ });
145
+ const pageErrors = [];
146
+ page.on('pageerror', (err) => pageErrors.push(err.message));
147
+ page.on('console', (msg) => { if (msg.type() === 'error')
148
+ pageErrors.push(msg.text()); });
149
+ await page.goto(`http://127.0.0.1:${server.port}/`);
150
+ try {
151
+ await page.waitForFunction(`window.${harnessPage_1.READY_FLAG} !== undefined`, undefined, { timeout: timeoutMs });
152
+ }
153
+ catch {
154
+ throw new Error(`the capture page never finished after ${timeoutMs}ms.${pageErrors.length ? `\n page errors:\n ${pageErrors.join('\n ')}` : ''}`);
155
+ }
156
+ const state = await page.evaluate(`window.${harnessPage_1.READY_FLAG}`);
157
+ if (!state.ready)
158
+ throw new Error(`the capture page failed to render:\n ${state.error ?? 'unknown error'}`);
159
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(opts.out), { recursive: true });
160
+ await page.locator('#sheet').screenshot({ path: opts.out });
161
+ return {
162
+ file: opts.out,
163
+ clip: state.clip ?? 'gesture',
164
+ duration: state.duration ?? duration,
165
+ times,
166
+ views: chosen,
167
+ moment,
168
+ sharedAxis: sharesAxis(chosen),
169
+ warnings: state.warnings ?? [],
170
+ };
171
+ }
172
+ finally {
173
+ if (browser)
174
+ await browser.close();
175
+ if (server)
176
+ await server.close();
177
+ (0, node_fs_1.rmSync)(stage, { recursive: true, force: true });
178
+ }
179
+ }
180
+ const timeLabel = (t) => `t=${t.toFixed(2)}s`;
181
+ /**
182
+ * A sequence reads best with time across and views stacked; a single moment reads best with the views SIDE BY
183
+ * SIDE, so the two renders of the same instant sit next to each other for comparison.
184
+ */
185
+ function arrangeGrid(times, views, moment, side) {
186
+ const cells = [];
187
+ const az = (v) => viewAzimuth(v, side);
188
+ if (moment) {
189
+ views.forEach((v, col) => times.forEach((t, row) => cells.push({ t, azimuth: az(v), col, row })));
190
+ return { cells, colLabels: views.map((v) => viewLabel(v, side)), rowLabels: times.map(timeLabel) };
191
+ }
192
+ views.forEach((v, row) => times.forEach((t, col) => cells.push({ t, azimuth: az(v), col, row })));
193
+ return { cells, colLabels: times.map(timeLabel), rowLabels: views.map((v) => viewLabel(v, side)) };
194
+ }
195
+ /** `--at` takes seconds or a percentage of duration, matching `inspect --t`. */
196
+ function parseMoment(at, duration) {
197
+ const raw = typeof at === 'number' ? at : at.trim();
198
+ const seconds = typeof raw === 'number'
199
+ ? raw
200
+ : raw.endsWith('%') ? (parseFloat(raw) / 100) * duration : parseFloat(raw);
201
+ if (!Number.isFinite(seconds))
202
+ throw new Error(`--at: '${at}' is not a number of seconds or a percentage`);
203
+ if (seconds < 0 || seconds > duration)
204
+ throw new Error(`--at: ${seconds}s is outside the clip (0..${duration}s)`);
205
+ return Math.round(seconds * 1000) / 1000;
206
+ }
207
+ function readDuration(source, clipPath) {
208
+ const duration = typeof source.duration === 'number' ? source.duration : NaN;
209
+ if (!Number.isFinite(duration) || duration <= 0)
210
+ throw new Error(`${clipPath}: "duration" must be a positive number`);
211
+ return duration;
212
+ }
213
+ /**
214
+ * Which side of the body a clip actually works on, so a left-handed gesture is never rendered from the side
215
+ * its own torso hides. The clip already declares this, so it is derived rather than asked for.
216
+ *
217
+ * KEYED BONES ARE THE GROUND TRUTH — most masks say nothing about sidedness. Of the authorable set
218
+ * (upperBody, lowerBody, leftArm, rightArm, spine, armsHead) only two are one-sided; the rest are bilateral,
219
+ * so a left-handed clip masked `upperBody` is identified by its bones, not its mask. The mask is consulted
220
+ * only as a tiebreaker, and by PATTERN rather than an exact name, so a future one-sided mask works untouched.
221
+ */
222
+ function clipSide(source) {
223
+ const bones = new Set();
224
+ for (const key of Array.isArray(source.keys) ? source.keys : []) {
225
+ const at = key.bones;
226
+ if (at !== null && typeof at === 'object')
227
+ for (const bone of Object.keys(at))
228
+ bones.add(bone);
229
+ }
230
+ let left = 0, right = 0;
231
+ for (const bone of bones) {
232
+ if (bone.endsWith('_l'))
233
+ left++;
234
+ else if (bone.endsWith('_r'))
235
+ right++;
236
+ }
237
+ if (left !== right)
238
+ return left > right ? 'left' : 'right';
239
+ const masks = `${typeof source.mask === 'string' ? source.mask : ''} ${typeof source.overrideMask === 'string' ? source.overrideMask : ''}`;
240
+ if (/left/i.test(masks))
241
+ return 'left';
242
+ if (/right/i.test(masks))
243
+ return 'right';
244
+ // Genuinely two-sided or unsided (a bow, a nod): either flank shows it, so take the one the standard
245
+ // action set is built around.
246
+ return 'right';
247
+ }
248
+ /**
249
+ * Defaults differ by MODE, because the modes answer different questions. A sequence is compared over time, so
250
+ * it wants the ORTHOGONAL pair — front plus a lateral — which is what makes "moves side-to-side, not
251
+ * front-to-back" readable; a 3/4 there would conflate the two axes it exists to separate. A single moment is
252
+ * being disambiguated, so it wants the 3/4, which lifts a limb clear of the torso instead of hiding it behind
253
+ * it. Every view stays legal in both modes: a mode-dependent enum would be a footgun to document, and neither
254
+ * pairing is actually invalid.
255
+ */
256
+ function resolveViews(requested, source, moment = false) {
257
+ if (requested !== undefined && requested.length > 0) {
258
+ const unique = [...new Set(requested)];
259
+ if (unique.length > exports.MAX_VIEWS)
260
+ throw new Error(`--views takes at most ${exports.MAX_VIEWS} (got ${unique.length}) — more rows shrink every cell past useful`);
261
+ return unique;
262
+ }
263
+ return moment ? ['front', 'three-quarter'] : ['front', clipSide(source)];
264
+ }
265
+ /** front+back and left+right are each a single axis seen twice: both are frontal projections of the same plane. */
266
+ function sharesAxis(views) {
267
+ if (views.length < 2)
268
+ return false;
269
+ // A 3/4 mixes both axes, so it never leaves a pairing depth-blind.
270
+ const axis = (v) => v === 'three-quarter' ? 'mixed' : v === 'front' || v === 'back' ? 'depth' : 'lateral';
271
+ const axes = views.map(axis);
272
+ return !axes.includes('mixed') && new Set(axes).size === 1;
273
+ }
274
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/gesture/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface HarnessCell {
2
+ /** Sample time in seconds. */
3
+ t: number;
4
+ /** Camera azimuth in degrees around Y; 0 = front. */
5
+ azimuth: number;
6
+ col: number;
7
+ row: number;
8
+ }
9
+ export interface HarnessConfig {
10
+ cells: HarnessCell[];
11
+ colLabels: string[];
12
+ rowLabels: string[];
13
+ cellW: number;
14
+ cellH: number;
15
+ }
16
+ export declare const READY_FLAG = "__helixGestureCapture";
17
+ export declare function harnessPage(config: HarnessConfig): string;