@metamesh/cli 0.0.0-stage → 0.14.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.
Files changed (99) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE +200 -0
  3. package/README.md +86 -2
  4. package/dist/authoring/artifacts.d.ts +15 -0
  5. package/dist/authoring/artifacts.d.ts.map +1 -0
  6. package/dist/authoring/artifacts.js +347 -0
  7. package/dist/authoring/artifacts.js.map +1 -0
  8. package/dist/authoring/capture/render-client.js +4222 -0
  9. package/dist/authoring/capture/render-client.js.LEGAL.txt +9 -0
  10. package/dist/authoring/capture/render-client.js.map +7 -0
  11. package/dist/authoring/check.d.ts +4 -0
  12. package/dist/authoring/check.d.ts.map +1 -0
  13. package/dist/authoring/check.js +118 -0
  14. package/dist/authoring/check.js.map +1 -0
  15. package/dist/authoring/environment.d.ts +29 -0
  16. package/dist/authoring/environment.d.ts.map +1 -0
  17. package/dist/authoring/environment.js +182 -0
  18. package/dist/authoring/environment.js.map +1 -0
  19. package/dist/authoring/errors.d.ts +13 -0
  20. package/dist/authoring/errors.d.ts.map +1 -0
  21. package/dist/authoring/errors.js +43 -0
  22. package/dist/authoring/errors.js.map +1 -0
  23. package/dist/authoring/render-client.d.ts +6 -0
  24. package/dist/authoring/render-client.d.ts.map +1 -0
  25. package/dist/authoring/render-client.js +55 -0
  26. package/dist/authoring/render-client.js.map +1 -0
  27. package/dist/authoring/render-scene.d.ts +22 -0
  28. package/dist/authoring/render-scene.d.ts.map +1 -0
  29. package/dist/authoring/render-scene.js +139 -0
  30. package/dist/authoring/render-scene.js.map +1 -0
  31. package/dist/authoring/render-types.d.ts +81 -0
  32. package/dist/authoring/render-types.d.ts.map +1 -0
  33. package/dist/authoring/render-types.js +2 -0
  34. package/dist/authoring/render-types.js.map +1 -0
  35. package/dist/authoring/render.d.ts +23 -0
  36. package/dist/authoring/render.d.ts.map +1 -0
  37. package/dist/authoring/render.js +243 -0
  38. package/dist/authoring/render.js.map +1 -0
  39. package/dist/authoring/run.d.ts +7 -0
  40. package/dist/authoring/run.d.ts.map +1 -0
  41. package/dist/authoring/run.js +308 -0
  42. package/dist/authoring/run.js.map +1 -0
  43. package/dist/authoring/types.d.ts +175 -0
  44. package/dist/authoring/types.d.ts.map +1 -0
  45. package/dist/authoring/types.js +3 -0
  46. package/dist/authoring/types.js.map +1 -0
  47. package/dist/authoring/worker.d.ts +15 -0
  48. package/dist/authoring/worker.d.ts.map +1 -0
  49. package/dist/authoring/worker.js +163 -0
  50. package/dist/authoring/worker.js.map +1 -0
  51. package/dist/authoring.d.ts +12 -0
  52. package/dist/authoring.d.ts.map +1 -0
  53. package/dist/authoring.js +9 -0
  54. package/dist/authoring.js.map +1 -0
  55. package/dist/docs/guides/agent-authoring.md +240 -0
  56. package/dist/docs/guides/package.md +87 -0
  57. package/dist/docs/manifest.json +554 -0
  58. package/dist/docs/reference/authoring/AUTHORING_PROTOCOL_VERSION.md +9 -0
  59. package/dist/docs/reference/authoring/AuthoringDiagnostic.md +22 -0
  60. package/dist/docs/reference/authoring/AuthoringEnvironment.md +15 -0
  61. package/dist/docs/reference/authoring/AuthoringError.md +16 -0
  62. package/dist/docs/reference/authoring/AuthoringFailure-type.md +18 -0
  63. package/dist/docs/reference/authoring/AuthoringKind.md +10 -0
  64. package/dist/docs/reference/authoring/AuthoringPhase.md +10 -0
  65. package/dist/docs/reference/authoring/CapturedBuffer.md +14 -0
  66. package/dist/docs/reference/authoring/CapturedGeometry.md +14 -0
  67. package/dist/docs/reference/authoring/CapturedPart.md +19 -0
  68. package/dist/docs/reference/authoring/CapturedResource.md +15 -0
  69. package/dist/docs/reference/authoring/CapturedRun.md +14 -0
  70. package/dist/docs/reference/authoring/CapturedRunManifest.md +40 -0
  71. package/dist/docs/reference/authoring/CheckOptions.md +18 -0
  72. package/dist/docs/reference/authoring/CheckSuccess.md +16 -0
  73. package/dist/docs/reference/authoring/DocumentationEntry.md +20 -0
  74. package/dist/docs/reference/authoring/DocumentationManifest.md +15 -0
  75. package/dist/docs/reference/authoring/DocumentationSearchResult.md +13 -0
  76. package/dist/docs/reference/authoring/InstalledAuthoringPackage.md +15 -0
  77. package/dist/docs/reference/authoring/RenderCamera.md +22 -0
  78. package/dist/docs/reference/authoring/RenderFormat.md +10 -0
  79. package/dist/docs/reference/authoring/RenderOptions.md +20 -0
  80. package/dist/docs/reference/authoring/RenderResult.md +15 -0
  81. package/dist/docs/reference/authoring/RenderView.md +10 -0
  82. package/dist/docs/reference/authoring/RenderedImage.md +23 -0
  83. package/dist/docs/reference/authoring/RunOptions.md +25 -0
  84. package/dist/docs/reference/authoring/RunSuccess.md +14 -0
  85. package/dist/docs/reference/authoring/authoringFailure-value.md +10 -0
  86. package/dist/docs/reference/authoring/checkAuthoringSource.md +10 -0
  87. package/dist/docs/reference/authoring/discoverAuthoringEnvironment.md +13 -0
  88. package/dist/docs/reference/authoring/inspectCapturedRun.md +15 -0
  89. package/dist/docs/reference/authoring/installAuthoringBrowser.md +13 -0
  90. package/dist/docs/reference/authoring/readCapturedRun.md +10 -0
  91. package/dist/docs/reference/authoring/renderCapturedRun.md +13 -0
  92. package/dist/docs/reference/authoring/runAuthoringSource.md +13 -0
  93. package/dist/docs/reference/authoring/searchAuthoringDocumentation.md +16 -0
  94. package/dist/docs/reference/authoring/showAuthoringDocumentation.md +12 -0
  95. package/dist/metamesh.d.ts +3 -0
  96. package/dist/metamesh.d.ts.map +1 -0
  97. package/dist/metamesh.js +183 -0
  98. package/dist/metamesh.js.map +1 -0
  99. package/package.json +63 -3
@@ -0,0 +1,4 @@
1
+ import type { AuthoringFailure, CheckOptions, CheckSuccess } from "./types.js";
2
+ /** Checks strict TypeScript and the selected entry-module contract without evaluating author source. */
3
+ export declare function checkAuthoringSource(options: CheckOptions): Promise<CheckSuccess | AuthoringFailure>;
4
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/authoring/check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAuB,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgBpG,wGAAwG;AACxG,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,GAAG,gBAAgB,CAAC,CA+G1C"}
@@ -0,0 +1,118 @@
1
+ import { access } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import ts from "typescript";
4
+ import { AuthoringError, authoringFailure } from "./errors.js";
5
+ function diagnostic(value) {
6
+ const location = value.file && value.start !== undefined
7
+ ? value.file.getLineAndCharacterOfPosition(value.start)
8
+ : undefined;
9
+ return {
10
+ code: `TS${value.code}`,
11
+ message: ts.flattenDiagnosticMessageText(value.messageText, "\n"),
12
+ severity: value.category === ts.DiagnosticCategory.Warning ? "warning" : "error",
13
+ ...(value.file === undefined ? {} : { file: value.file.fileName }),
14
+ ...(location === undefined ? {} : { line: location.line + 1, column: location.character + 1 }),
15
+ };
16
+ }
17
+ /** Checks strict TypeScript and the selected entry-module contract without evaluating author source. */
18
+ export async function checkAuthoringSource(options) {
19
+ try {
20
+ if (options.kind !== "model" && options.kind !== "generator")
21
+ throw new AuthoringError("invocation", "INVALID_KIND", "Select --kind model or --kind generator.");
22
+ const entry = resolve(options.project ?? process.cwd(), options.entry);
23
+ await access(entry).catch(() => {
24
+ throw new AuthoringError("invocation", "ENTRY_NOT_FOUND", `Entry does not exist: ${entry}`);
25
+ });
26
+ const tsconfig = options.tsconfig === undefined
27
+ ? ts.findConfigFile(dirname(entry), (file) => ts.sys.fileExists(file))
28
+ : resolve(options.project ?? process.cwd(), options.tsconfig);
29
+ let parsed;
30
+ if (tsconfig !== undefined) {
31
+ const loaded = ts.readConfigFile(tsconfig, (file) => ts.sys.readFile(file));
32
+ if (loaded.error)
33
+ return {
34
+ success: false,
35
+ phase: "check",
36
+ exitCode: 1,
37
+ diagnostics: [diagnostic(loaded.error)],
38
+ };
39
+ parsed = ts.parseJsonConfigFileContent(loaded.config, ts.sys, dirname(tsconfig));
40
+ }
41
+ const compilerOptions = {
42
+ target: ts.ScriptTarget.ES2023,
43
+ module: ts.ModuleKind.ESNext,
44
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
45
+ skipLibCheck: true,
46
+ ...parsed?.options,
47
+ strict: true,
48
+ noCheck: false,
49
+ noEmit: true,
50
+ noImplicitAny: true,
51
+ strictNullChecks: true,
52
+ strictFunctionTypes: true,
53
+ strictBindCallApply: true,
54
+ strictPropertyInitialization: true,
55
+ noImplicitThis: true,
56
+ useUnknownInCatchVariables: true,
57
+ alwaysStrict: true,
58
+ incremental: false,
59
+ composite: false,
60
+ declaration: false,
61
+ declarationMap: false,
62
+ emitDeclarationOnly: false,
63
+ };
64
+ const program = ts.createProgram({ rootNames: [entry], options: compilerOptions });
65
+ const source = program.getSourceFile(entry);
66
+ const diagnostics = [...(parsed?.errors ?? []), ...ts.getPreEmitDiagnostics(program)].map(diagnostic);
67
+ const checker = program.getTypeChecker();
68
+ const moduleSymbol = source === undefined ? undefined : checker.getSymbolAtLocation(source);
69
+ const exports = moduleSymbol === undefined ? [] : checker.getExportsOfModule(moduleSymbol);
70
+ if (!exports.some((symbol) => symbol.getName() === "default") ||
71
+ (options.kind === "generator" && !exports.some((symbol) => symbol.getName() === "definition")))
72
+ diagnostics.push({
73
+ code: "AUTHORING_EXPORTS",
74
+ message: options.kind === "generator"
75
+ ? "Generator entry must named-export definition and default-export its Generator module."
76
+ : "Model entry must default-export its ModelProgram.",
77
+ severity: "error",
78
+ file: entry,
79
+ });
80
+ const defaultSymbol = exports.find((symbol) => symbol.getName() === "default");
81
+ if (defaultSymbol !== undefined && source !== undefined) {
82
+ const exported = checker.getTypeOfSymbolAtLocation(defaultSymbol, source);
83
+ const property = (type, name) => {
84
+ const symbol = checker.getPropertyOfType(type, name);
85
+ return symbol === undefined ? undefined : checker.getTypeOfSymbolAtLocation(symbol, source);
86
+ };
87
+ const candidate = options.kind === "model" ? exported : property(exported, "generate");
88
+ const generator = candidate === undefined ? undefined : property(candidate, "generate");
89
+ const kind = candidate === undefined ? undefined : property(candidate, "kind");
90
+ if (candidate === undefined ||
91
+ generator === undefined ||
92
+ generator.getCallSignatures().length === 0 ||
93
+ kind === undefined ||
94
+ checker.typeToString(kind) !== '"metamesh-model"')
95
+ diagnostics.push({
96
+ code: "AUTHORING_PROGRAM_TYPE",
97
+ message: options.kind === "model"
98
+ ? "Default export must have the ModelProgram type returned by generate()."
99
+ : "Default export must be a Generator module whose generate property is a ModelProgram.",
100
+ severity: "error",
101
+ file: entry,
102
+ });
103
+ }
104
+ if (diagnostics.some(({ severity }) => severity === "error"))
105
+ return { success: false, phase: "check", exitCode: 1, diagnostics };
106
+ return {
107
+ success: true,
108
+ entry,
109
+ kind: options.kind,
110
+ ...(tsconfig === undefined ? {} : { tsconfig: resolve(tsconfig) }),
111
+ diagnostics,
112
+ };
113
+ }
114
+ catch (error) {
115
+ return authoringFailure(error, "check");
116
+ }
117
+ }
118
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/authoring/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type AuthoringEnvironment, type DocumentationEntry } from "./types.js";
2
+ export declare const authoringPackageNames: string[];
3
+ /** @internal Resolve only local installation scopes; Node's global fallback paths are excluded. */
4
+ export declare function projectPackageDirectory(project: string, specifier: string): string | undefined;
5
+ export declare function resolveProjectExport(project: string, specifier: string): string;
6
+ export declare function confinedFile(directory: string, path: string): Promise<string>;
7
+ /**
8
+ * Discovers project-local Modeling, CLI, and optional SDK/Testkit documentation.
9
+ * Rejects missing required packages, stale manifests, and mixed exact package versions.
10
+ */
11
+ export declare function discoverAuthoringEnvironment(project?: string): Promise<AuthoringEnvironment>;
12
+ /** An installed documentation match carrying the exact package identity that owns it. */
13
+ export interface DocumentationSearchResult extends DocumentationEntry {
14
+ readonly packageName: string;
15
+ readonly packageVersion: string;
16
+ }
17
+ /**
18
+ * Ranks installed topic and symbol metadata without loading every document's body.
19
+ * Returns up to limit matches, defaulting to 10; supported limits are 1 through 50.
20
+ */
21
+ export declare function searchAuthoringDocumentation(query: string, options?: {
22
+ readonly project?: string;
23
+ readonly limit?: number;
24
+ }): Promise<readonly DocumentationSearchResult[]>;
25
+ /** Reads one exact-version installed Markdown topic by its discovered ID, without executing source. */
26
+ export declare function showAuthoringDocumentation(id: string, project?: string): Promise<DocumentationSearchResult & {
27
+ readonly markdown: string;
28
+ }>;
29
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/authoring/environment.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EAGxB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,qBAAqB,UAKjC,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA4B9F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAY/E;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBnF;AAsCD;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,SAAgB,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAgE/B;AAED,yFAAyF;AACzF,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC,CA6C/C;AAED,uGAAuG;AACvG,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBpE"}
@@ -0,0 +1,182 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { readFile, realpath, stat } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
5
+ import { AuthoringError, isRecord } from "./errors.js";
6
+ import { AUTHORING_PROTOCOL_VERSION, } from "./types.js";
7
+ export const authoringPackageNames = [
8
+ "@metamesh/modeling",
9
+ "@metamesh/generator-sdk",
10
+ "@metamesh/testkit",
11
+ "@metamesh/cli",
12
+ ];
13
+ /** @internal Resolve only local installation scopes; Node's global fallback paths are excluded. */
14
+ export function projectPackageDirectory(project, specifier) {
15
+ const packageName = specifier.startsWith("@")
16
+ ? specifier.split("/").slice(0, 2).join("/")
17
+ : specifier.split("/")[0];
18
+ let current = resolve(project);
19
+ let checkedSelf = false;
20
+ while (true) {
21
+ const ownManifest = resolve(current, "package.json");
22
+ if (!checkedSelf && existsSync(ownManifest)) {
23
+ checkedSelf = true;
24
+ try {
25
+ if (JSON.parse(readFileSync(ownManifest, "utf8")).name ===
26
+ packageName) {
27
+ return current;
28
+ }
29
+ }
30
+ catch {
31
+ /* The export resolver below reports invalid installed metadata. */
32
+ }
33
+ }
34
+ const installed = resolve(current, "node_modules", packageName);
35
+ if (existsSync(resolve(installed, "package.json")))
36
+ return installed;
37
+ const parent = dirname(current);
38
+ if (parent === current)
39
+ break;
40
+ current = parent;
41
+ }
42
+ return undefined;
43
+ }
44
+ export function resolveProjectExport(project, specifier) {
45
+ try {
46
+ if (projectPackageDirectory(project, specifier) === undefined)
47
+ throw new Error("No project-local installation.");
48
+ return createRequire(resolve(project, "package.json")).resolve(specifier);
49
+ }
50
+ catch {
51
+ throw new AuthoringError("environment", "PACKAGE_NOT_INSTALLED", `Cannot resolve ${specifier} from ${resolve(project)}. Install the matching MetaMesh package in that project.`);
52
+ }
53
+ }
54
+ export async function confinedFile(directory, path) {
55
+ if (isAbsolute(path) ||
56
+ path.includes("\\") ||
57
+ path.split("/").some((part) => part === ".." || part === ""))
58
+ throw new AuthoringError("artifact", "INVALID_PATH", `Invalid relative artifact/document path: ${path}`);
59
+ const root = await realpath(directory);
60
+ const file = await realpath(resolve(root, path));
61
+ const delta = relative(root, file);
62
+ if (delta.startsWith("..") || isAbsolute(delta))
63
+ throw new AuthoringError("artifact", "INVALID_PATH", `Path escapes its captured directory: ${path}`);
64
+ return file;
65
+ }
66
+ function readManifest(value, name) {
67
+ if (!isRecord(value) ||
68
+ value.formatVersion !== 1 ||
69
+ value.packageName !== name ||
70
+ typeof value.packageVersion !== "string" ||
71
+ !Array.isArray(value.documents) ||
72
+ value.documents.length === 0 ||
73
+ value.documents.length > 10000)
74
+ throw new AuthoringError("environment", "INVALID_DOCUMENTATION", `Invalid installed documentation manifest for ${name}.`);
75
+ const ids = new Set();
76
+ for (const document of value.documents) {
77
+ if (!isRecord(document) ||
78
+ !["id", "title", "summary", "path", "importPath", "availability", "canonical"].every((key) => typeof document[key] === "string" && document[key].trim().length > 0) ||
79
+ !Array.isArray(document.keywords) ||
80
+ !document.keywords.every((keyword) => typeof keyword === "string") ||
81
+ ids.has(document.id))
82
+ throw new AuthoringError("environment", "INVALID_DOCUMENTATION", `Invalid or duplicate document in ${name}.`);
83
+ ids.add(document.id);
84
+ }
85
+ return value;
86
+ }
87
+ /**
88
+ * Discovers project-local Modeling, CLI, and optional SDK/Testkit documentation.
89
+ * Rejects missing required packages, stale manifests, and mixed exact package versions.
90
+ */
91
+ export async function discoverAuthoringEnvironment(project = process.cwd()) {
92
+ const packages = [];
93
+ for (const name of authoringPackageNames) {
94
+ const installedDirectory = projectPackageDirectory(project, name);
95
+ if (installedDirectory === undefined &&
96
+ name !== "@metamesh/modeling" &&
97
+ name !== "@metamesh/cli")
98
+ continue;
99
+ const manifestPath = resolveProjectExport(project, `${name}/docs/manifest.json`);
100
+ if ((await stat(manifestPath)).size > 8 * 1024 * 1024)
101
+ throw new AuthoringError("environment", "INVALID_DOCUMENTATION", `Documentation index exceeds 8 MiB: ${name}.`);
102
+ const manifest = readManifest(JSON.parse(await readFile(manifestPath, "utf8")), name);
103
+ const installed = JSON.parse(await readFile(resolve(installedDirectory, "package.json"), "utf8"));
104
+ if (!isRecord(installed) ||
105
+ installed.name !== name ||
106
+ installed.version !== manifest.packageVersion)
107
+ throw new AuthoringError("environment", "STALE_DOCUMENTATION", `Documentation version does not match installed ${name}. Rebuild or reinstall the package.`);
108
+ packages.push({
109
+ name,
110
+ version: manifest.packageVersion,
111
+ manifestPath,
112
+ documentCount: manifest.documents.length,
113
+ });
114
+ }
115
+ const versions = new Set(packages.map(({ version }) => version));
116
+ if (versions.size > 1)
117
+ throw new AuthoringError("environment", "PACKAGE_VERSION_MISMATCH", "Installed MetaMesh packages must have matching exact versions.");
118
+ return {
119
+ authoringProtocolVersion: AUTHORING_PROTOCOL_VERSION,
120
+ project: resolve(project),
121
+ packages,
122
+ capabilities: [
123
+ "docs",
124
+ "semantic-check",
125
+ "model",
126
+ ...(packages.some(({ name }) => name === "@metamesh/generator-sdk")
127
+ ? ["generator", "offline-font-fixtures"]
128
+ : []),
129
+ "captured-artifacts",
130
+ "render",
131
+ "export-3mf",
132
+ ],
133
+ };
134
+ }
135
+ /**
136
+ * Ranks installed topic and symbol metadata without loading every document's body.
137
+ * Returns up to limit matches, defaulting to 10; supported limits are 1 through 50.
138
+ */
139
+ export async function searchAuthoringDocumentation(query, options = {}) {
140
+ const limit = options.limit ?? 10;
141
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 50)
142
+ throw new AuthoringError("invocation", "INVALID_LIMIT", "Documentation limit must be an integer from 1 to 50.");
143
+ const words = query.toLocaleLowerCase("en-US").match(/[\p{L}\p{N}_-]+/gu) ?? [];
144
+ if (words.length === 0)
145
+ throw new AuthoringError("invocation", "EMPTY_QUERY", "Enter a documentation search query.");
146
+ const environment = await discoverAuthoringEnvironment(options.project);
147
+ const indexed = await Promise.all(environment.packages.map(async (pkg) => ({
148
+ pkg,
149
+ manifest: readManifest(JSON.parse(await readFile(pkg.manifestPath, "utf8")), pkg.name),
150
+ })));
151
+ return indexed
152
+ .flatMap(({ pkg, manifest }) => manifest.documents.map((document) => {
153
+ const heading = `${document.title} ${document.id} ${document.importPath}`.toLocaleLowerCase("en-US");
154
+ const haystack = `${heading} ${document.summary} ${document.availability} ${document.keywords.join(" ")}`.toLocaleLowerCase("en-US");
155
+ const score = words.reduce((sum, word) => sum + (heading.includes(word) ? 5 : haystack.includes(word) ? 1 : 0), 0);
156
+ return {
157
+ score,
158
+ result: { ...document, packageName: pkg.name, packageVersion: pkg.version },
159
+ };
160
+ }))
161
+ .filter(({ score }) => score > 0)
162
+ .sort((a, b) => b.score - a.score || a.result.id.localeCompare(b.result.id, "en"))
163
+ .slice(0, limit)
164
+ .map(({ result }) => result);
165
+ }
166
+ /** Reads one exact-version installed Markdown topic by its discovered ID, without executing source. */
167
+ export async function showAuthoringDocumentation(id, project) {
168
+ const environment = await discoverAuthoringEnvironment(project);
169
+ for (const pkg of environment.packages) {
170
+ const manifest = readManifest(JSON.parse(await readFile(pkg.manifestPath, "utf8")), pkg.name);
171
+ const document = manifest.documents.find((entry) => entry.id === id);
172
+ if (!document)
173
+ continue;
174
+ const file = await confinedFile(dirname(pkg.manifestPath), document.path);
175
+ const markdown = await readFile(file, "utf8");
176
+ if (Buffer.byteLength(markdown) > 512 * 1024)
177
+ throw new AuthoringError("environment", "DOCUMENT_TOO_LARGE", "Requested document exceeds the 512 KiB retrieval bound.");
178
+ return { ...document, packageName: pkg.name, packageVersion: pkg.version, markdown };
179
+ }
180
+ throw new AuthoringError("invocation", "DOCUMENT_NOT_FOUND", `No installed documentation topic has id ${id}.`);
181
+ }
182
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/authoring/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AuthoringDiagnostic, AuthoringFailure, AuthoringPhase } from "./types.js";
2
+ /** A classified authoring exception retaining its workflow phase, stable code, and exit status. */
3
+ export declare class AuthoringError extends Error {
4
+ readonly phase: AuthoringPhase;
5
+ readonly code: string;
6
+ readonly exitCode: 1 | 2;
7
+ readonly diagnostics?: readonly AuthoringDiagnostic[] | undefined;
8
+ constructor(phase: AuthoringPhase, code: string, message: string, exitCode?: 1 | 2, diagnostics?: readonly AuthoringDiagnostic[] | undefined);
9
+ }
10
+ /** Converts a thrown value to a failure envelope, preserving classified authoring diagnostics. */
11
+ export declare function authoringFailure(error: unknown, fallbackPhase?: AuthoringPhase): AuthoringFailure;
12
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
13
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/authoring/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExF,mGAAmG;AACnG,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,KAAK,EAAE,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAErB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,mBAAmB,EAAE;gBAJ5C,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACN,QAAQ,GAAE,CAAC,GAAG,CAAK,EACnB,WAAW,CAAC,EAAE,SAAS,mBAAmB,EAAE,YAAA;CAKxD;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,aAAa,GAAE,cAA8B,GAC5C,gBAAgB,CAsBlB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,43 @@
1
+ /** A classified authoring exception retaining its workflow phase, stable code, and exit status. */
2
+ export class AuthoringError extends Error {
3
+ phase;
4
+ code;
5
+ exitCode;
6
+ diagnostics;
7
+ constructor(phase, code, message, exitCode = 2, diagnostics) {
8
+ super(message);
9
+ this.phase = phase;
10
+ this.code = code;
11
+ this.exitCode = exitCode;
12
+ this.diagnostics = diagnostics;
13
+ this.name = "AuthoringError";
14
+ }
15
+ }
16
+ /** Converts a thrown value to a failure envelope, preserving classified authoring diagnostics. */
17
+ export function authoringFailure(error, fallbackPhase = "environment") {
18
+ if (error instanceof AuthoringError)
19
+ return {
20
+ success: false,
21
+ phase: error.phase,
22
+ exitCode: error.exitCode,
23
+ diagnostics: error.diagnostics ?? [
24
+ { code: error.code, message: error.message, severity: "error" },
25
+ ],
26
+ };
27
+ return {
28
+ success: false,
29
+ phase: fallbackPhase,
30
+ exitCode: 2,
31
+ diagnostics: [
32
+ {
33
+ code: "TOOLING_ERROR",
34
+ message: error instanceof Error ? error.message : String(error),
35
+ severity: "error",
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ export function isRecord(value) {
41
+ return typeof value === "object" && value !== null && !Array.isArray(value);
42
+ }
43
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/authoring/errors.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B;IACA;IAEA;IACA;IALX,YACW,KAAqB,EACrB,IAAY,EACrB,OAAe,EACN,WAAkB,CAAC,EACnB,WAA4C;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;QANN,UAAK,GAAL,KAAK,CAAgB;QACrB,SAAI,GAAJ,IAAI,CAAQ;QAEZ,aAAQ,GAAR,QAAQ,CAAW;QACnB,gBAAW,GAAX,WAAW,CAAiC;QAGrD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,gBAAgC,aAAa;IAE7C,IAAI,KAAK,YAAY,cAAc;QACjC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI;gBAChC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;aAChE;SACF,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,QAAQ,EAAE,OAAO;aAClB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CaptureState, RenderView } from "./render-types.js";
2
+ declare global {
3
+ var metameshCaptureState: CaptureState;
4
+ var metameshCaptureView: (view: RenderView) => void;
5
+ }
6
+ //# sourceMappingURL=render-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-client.d.ts","sourceRoot":"","sources":["../../src/authoring/render-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,oBAAoB,EAAE,YAAY,CAAC;IACvC,IAAI,mBAAmB,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACrD"}
@@ -0,0 +1,55 @@
1
+ import { SRGBColorSpace, WebGLRenderer } from "three";
2
+ import { createCaptureCamera, createCaptureScene } from "./render-scene.js";
3
+ globalThis.metameshCaptureState = { status: "loading" };
4
+ async function load() {
5
+ const response = await fetch("/scene.json");
6
+ if (!response.ok)
7
+ throw new Error("Could not load captured scene.");
8
+ const input = (await response.json());
9
+ const resources = await Promise.all(input.resources.map(async (resource) => {
10
+ const [positionsResponse, indicesResponse] = await Promise.all([
11
+ fetch(resource.positionsUrl),
12
+ fetch(resource.indicesUrl),
13
+ ]);
14
+ if (!positionsResponse.ok || !indicesResponse.ok)
15
+ throw new Error("Could not load captured buffers.");
16
+ return {
17
+ id: resource.id,
18
+ positions: new Float32Array(await positionsResponse.arrayBuffer()),
19
+ indices: new Uint32Array(await indicesResponse.arrayBuffer()),
20
+ };
21
+ }));
22
+ const capture = createCaptureScene(input, resources);
23
+ // Native Chromium PNG/WebP encoders round partially transparent MSAA edge colors
24
+ // differently. Crisp opaque coverage keeps both lossless artifacts pixel-equivalent.
25
+ const renderer = new WebGLRenderer({
26
+ antialias: false,
27
+ alpha: true,
28
+ preserveDrawingBuffer: true,
29
+ });
30
+ renderer.setPixelRatio(1);
31
+ renderer.setSize(input.width, input.height);
32
+ renderer.outputColorSpace = SRGBColorSpace;
33
+ if (input.background === "transparent")
34
+ renderer.setClearColor(0, 0);
35
+ document.body.append(renderer.domElement);
36
+ globalThis.metameshCaptureView = (view) => {
37
+ const { camera, record } = createCaptureCamera(capture.bounds, view, input.width, input.height);
38
+ renderer.render(capture.scene, camera);
39
+ // Flush the completed frame before exposing readiness to the screenshot owner.
40
+ renderer.getContext().finish();
41
+ globalThis.metameshCaptureState = { status: "ready", camera: record };
42
+ };
43
+ globalThis.addEventListener("pagehide", () => {
44
+ capture.dispose();
45
+ renderer.dispose();
46
+ }, { once: true });
47
+ globalThis.metameshCaptureView("isometric");
48
+ }
49
+ void load().catch((error) => {
50
+ globalThis.metameshCaptureState = {
51
+ status: "error",
52
+ message: error instanceof Error ? error.message : String(error),
53
+ };
54
+ });
55
+ //# sourceMappingURL=render-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-client.js","sourceRoot":"","sources":["../../src/authoring/render-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Box3, Group, OrthographicCamera, Scene } from "three";
2
+ import type { CaptureScene, RenderCamera, RenderView } from "./render-types.js";
3
+ export interface RenderGeometry {
4
+ readonly id: string;
5
+ readonly positions: Float32Array;
6
+ readonly indices: Uint32Array;
7
+ }
8
+ interface CaptureSceneResources {
9
+ readonly scene: Scene;
10
+ readonly group: Group;
11
+ readonly bounds: Box3;
12
+ readonly dispose: () => void;
13
+ }
14
+ /** @internal Owns one capture's GPU-independent scene resources. */
15
+ export declare function createCaptureScene(input: CaptureScene, resources: readonly RenderGeometry[]): CaptureSceneResources;
16
+ /** @internal Fits every world-bounds corner in the selected orthographic view. */
17
+ export declare function createCaptureCamera(bounds: Box3, view: RenderView, width: number, height: number): {
18
+ camera: OrthographicCamera;
19
+ record: RenderCamera;
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=render-scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-scene.d.ts","sourceRoot":"","sources":["../../src/authoring/render-scene.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EAKJ,KAAK,EAIL,kBAAkB,EAClB,KAAK,EAEN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,qBAAqB,CAoFvB;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CA6CtD"}