mimetic-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/argv.d.ts +1 -0
  4. package/dist/argv.js +8 -0
  5. package/dist/argv.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +5 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/feedback.d.ts +48 -0
  10. package/dist/feedback.js +243 -0
  11. package/dist/feedback.js.map +1 -0
  12. package/dist/index.d.ts +15 -0
  13. package/dist/index.js +9 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/init-templates.d.ts +12 -0
  16. package/dist/init-templates.js +251 -0
  17. package/dist/init-templates.js.map +1 -0
  18. package/dist/init.d.ts +26 -0
  19. package/dist/init.js +343 -0
  20. package/dist/init.js.map +1 -0
  21. package/dist/observer-assets.d.ts +2 -0
  22. package/dist/observer-assets.js +2322 -0
  23. package/dist/observer-assets.js.map +1 -0
  24. package/dist/observer-data.d.ts +53 -0
  25. package/dist/observer-data.js +123 -0
  26. package/dist/observer-data.js.map +1 -0
  27. package/dist/observer.d.ts +36 -0
  28. package/dist/observer.js +360 -0
  29. package/dist/observer.js.map +1 -0
  30. package/dist/oss-lab.d.ts +50 -0
  31. package/dist/oss-lab.js +298 -0
  32. package/dist/oss-lab.js.map +1 -0
  33. package/dist/oss-meta-lab.d.ts +43 -0
  34. package/dist/oss-meta-lab.js +901 -0
  35. package/dist/oss-meta-lab.js.map +1 -0
  36. package/dist/program.d.ts +36 -0
  37. package/dist/program.js +825 -0
  38. package/dist/program.js.map +1 -0
  39. package/dist/run.d.ts +206 -0
  40. package/dist/run.js +688 -0
  41. package/dist/run.js.map +1 -0
  42. package/package.json +78 -0
  43. package/skills/mimetic-cli/SKILL.md +92 -0
  44. package/skills/mimetic-cli/agents/openai.yaml +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer-assets.js","sourceRoot":"","sources":["../src/observer-assets.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgxCR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2/BR,CAAC;AACF,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { RunBundle, RunEvent, RunSimulation, RunStream, RunStreamKind } from "./run.js";
2
+ export declare const OBSERVER_DATA_SCHEMA = "mimetic.observer-data.v1";
3
+ export interface ObserverArtifactLink {
4
+ label: string;
5
+ href: string;
6
+ kind: string;
7
+ }
8
+ export interface ObserverData {
9
+ schema: typeof OBSERVER_DATA_SCHEMA;
10
+ schemaVersion: 1;
11
+ generatedAt: string;
12
+ run: {
13
+ runId: string;
14
+ mode: RunBundle["mode"];
15
+ status: "contract_proof_only" | "running" | "complete" | "failed";
16
+ title: string;
17
+ createdAt: string;
18
+ simCount: number;
19
+ persona: RunBundle["persona"];
20
+ scenario: RunBundle["scenario"];
21
+ packageName: string | null;
22
+ redaction: RunBundle["redaction"];
23
+ lifecycle: RunBundle["lifecycle"];
24
+ knownGaps: string[];
25
+ };
26
+ summary: {
27
+ streams: number;
28
+ byKind: Record<RunStreamKind, number>;
29
+ active: number;
30
+ blocked: number;
31
+ warnings: number;
32
+ };
33
+ streams: ObserverStream[];
34
+ events: RunEvent[];
35
+ artifactLinks: ObserverArtifactLink[];
36
+ publicSafety: {
37
+ publishable: false;
38
+ note: string;
39
+ };
40
+ raw: {
41
+ bundleSchema: string;
42
+ artifactRoot: string;
43
+ };
44
+ }
45
+ export interface ObserverStream extends RunStream {
46
+ sim: RunSimulation;
47
+ kindLabel: string;
48
+ statusLabel: string;
49
+ terminalPlain: string;
50
+ timeline: RunEvent[];
51
+ }
52
+ export declare function buildObserverData(bundle: RunBundle, generatedAt?: string): ObserverData;
53
+ export declare function stripAnsi(value: string): string;
@@ -0,0 +1,123 @@
1
+ export const OBSERVER_DATA_SCHEMA = "mimetic.observer-data.v1";
2
+ const allKinds = ["ui", "browser", "terminal", "tui", "codex-ui", "artifact", "summary"];
3
+ export function buildObserverData(bundle, generatedAt = new Date().toISOString()) {
4
+ const byKind = Object.fromEntries(allKinds.map((kind) => [kind, 0]));
5
+ const events = [...(bundle.events ?? [])];
6
+ const streams = (bundle.streams ?? []).map((stream) => {
7
+ const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ?? fallbackSimulation(bundle, stream);
8
+ byKind[stream.kind] += 1;
9
+ return {
10
+ ...stream,
11
+ sim,
12
+ kindLabel: kindLabel(stream.kind),
13
+ statusLabel: statusLabel(stream.status),
14
+ terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
15
+ timeline: events.filter((event) => event.simId === sim.id || event.streamId === stream.id)
16
+ };
17
+ });
18
+ const warnings = events.filter((event) => event.level === "warn").length;
19
+ const blocked = streams.filter((stream) => stream.status === "blocked" || stream.status === "failed").length;
20
+ const active = streams.filter((stream) => stream.status === "running" || stream.status === "preparing").length;
21
+ return {
22
+ schema: OBSERVER_DATA_SCHEMA,
23
+ schemaVersion: 1,
24
+ generatedAt,
25
+ run: {
26
+ runId: bundle.runId,
27
+ mode: bundle.mode,
28
+ status: bundle.review.verdict,
29
+ title: `${bundle.scenario.title} - ${bundle.persona.name}`,
30
+ createdAt: bundle.createdAt,
31
+ simCount: bundle.simCount ?? bundle.simulations.length,
32
+ persona: bundle.persona,
33
+ scenario: bundle.scenario,
34
+ packageName: bundle.source.packageName,
35
+ redaction: bundle.redaction,
36
+ lifecycle: bundle.lifecycle,
37
+ knownGaps: bundle.review.gaps
38
+ },
39
+ summary: {
40
+ streams: streams.length,
41
+ byKind,
42
+ active,
43
+ blocked,
44
+ warnings
45
+ },
46
+ streams,
47
+ events,
48
+ artifactLinks: [
49
+ { label: "run bundle", href: "../run.json", kind: "bundle" },
50
+ { label: "review JSON", href: "../review.json", kind: "review" },
51
+ { label: "review Markdown", href: "../review.md", kind: "review" },
52
+ { label: "event log", href: "../events.ndjson", kind: "events" },
53
+ { label: "observer data", href: "observer-data.json", kind: "observer" }
54
+ ],
55
+ publicSafety: {
56
+ publishable: false,
57
+ note: "Observer artifacts are local evidence. Before filing a public issue, use `mimetic feedback issue` so redaction and public-safety checks gate the payload."
58
+ },
59
+ raw: {
60
+ bundleSchema: bundle.schema,
61
+ artifactRoot: bundle.artifactRoot
62
+ }
63
+ };
64
+ }
65
+ export function stripAnsi(value) {
66
+ return value
67
+ .replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g, "")
68
+ .replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, "");
69
+ }
70
+ function fallbackSimulation(bundle, stream) {
71
+ return {
72
+ id: stream.simId,
73
+ index: bundle.simulations.length + 1,
74
+ personaId: bundle.persona.id,
75
+ scenarioId: bundle.scenario.id,
76
+ status: stream.status,
77
+ streamKind: stream.kind,
78
+ mode: "cli-sim",
79
+ progress: 0,
80
+ currentStep: "Unknown sim stream",
81
+ summary: "This stream did not include matching sim metadata.",
82
+ streamIds: [stream.id],
83
+ startedAt: bundle.createdAt,
84
+ updatedAt: stream.updatedAt
85
+ };
86
+ }
87
+ function kindLabel(kind) {
88
+ switch (kind) {
89
+ case "ui":
90
+ return "UI";
91
+ case "browser":
92
+ return "Browser";
93
+ case "terminal":
94
+ return "CLI";
95
+ case "tui":
96
+ return "TUI";
97
+ case "codex-ui":
98
+ return "Codex UI";
99
+ case "artifact":
100
+ return "Artifact";
101
+ case "summary":
102
+ return "Summary";
103
+ }
104
+ }
105
+ function statusLabel(status) {
106
+ switch (status) {
107
+ case "contract_proof_only":
108
+ return "Contract proof";
109
+ case "preparing":
110
+ return "Preparing";
111
+ case "queued":
112
+ return "Queued";
113
+ case "running":
114
+ return "Running";
115
+ case "complete":
116
+ return "Complete";
117
+ case "blocked":
118
+ return "Blocked";
119
+ case "failed":
120
+ return "Failed";
121
+ }
122
+ }
123
+ //# sourceMappingURL=observer-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer-data.js","sourceRoot":"","sources":["../src/observer-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare const OBSERVER_SCHEMA = "mimetic.observer-result.v1";
2
+ export interface ObserverResult {
3
+ schema: typeof OBSERVER_SCHEMA;
4
+ ok: boolean;
5
+ cwd: string;
6
+ run: string;
7
+ observerPath?: string;
8
+ observerDataPath?: string;
9
+ eventsPath?: string;
10
+ observerUrl?: string;
11
+ serverUrl?: string;
12
+ bundlePath?: string;
13
+ opened?: boolean;
14
+ openCommand?: string;
15
+ warnings: string[];
16
+ error?: {
17
+ code: "MIMETIC_RUN_NOT_FOUND" | "MIMETIC_INVALID_RUN_BUNDLE";
18
+ message: string;
19
+ };
20
+ }
21
+ export interface ObserverOptions {
22
+ open?: boolean;
23
+ }
24
+ export interface ObserverServeOptions {
25
+ open?: boolean;
26
+ port?: number;
27
+ }
28
+ export interface ObserverServer {
29
+ url: string;
30
+ opened: boolean;
31
+ openCommand?: string;
32
+ warning?: string;
33
+ close(): Promise<void>;
34
+ }
35
+ export declare function renderObserver(cwdInput: string, runInput: string, options?: ObserverOptions): Promise<ObserverResult>;
36
+ export declare function serveObserver(result: ObserverResult, options?: ObserverServeOptions): Promise<ObserverServer>;
@@ -0,0 +1,360 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createServer } from "node:http";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import { buildObserverData } from "./observer-data.js";
7
+ import { observerClientJs, observerCss } from "./observer-assets.js";
8
+ import { listRuns, loadRunBundle, verifyRun } from "./run.js";
9
+ export const OBSERVER_SCHEMA = "mimetic.observer-result.v1";
10
+ export async function renderObserver(cwdInput, runInput, options = {}) {
11
+ const cwd = path.resolve(cwdInput);
12
+ const verified = await verifyRun(cwd, runInput);
13
+ if (!verified.ok) {
14
+ return {
15
+ schema: OBSERVER_SCHEMA,
16
+ ok: false,
17
+ cwd,
18
+ run: runInput,
19
+ warnings: [],
20
+ error: {
21
+ code: verified.error?.code === "MIMETIC_RUN_NOT_FOUND" ? "MIMETIC_RUN_NOT_FOUND" : "MIMETIC_INVALID_RUN_BUNDLE",
22
+ message: verified.error?.message ?? "Run bundle failed verification."
23
+ }
24
+ };
25
+ }
26
+ const loaded = await loadRunBundle(cwd, runInput);
27
+ if (!loaded) {
28
+ return {
29
+ schema: OBSERVER_SCHEMA,
30
+ ok: false,
31
+ cwd,
32
+ run: runInput,
33
+ warnings: [],
34
+ error: {
35
+ code: "MIMETIC_RUN_NOT_FOUND",
36
+ message: `Run not found: ${runInput}`
37
+ }
38
+ };
39
+ }
40
+ const observerDir = path.join(loaded.runDir, "observer");
41
+ const observerPath = path.join(observerDir, "index.html");
42
+ const observerDataPath = path.join(observerDir, "observer-data.json");
43
+ const eventsPath = path.join(loaded.runDir, "events.ndjson");
44
+ const observerData = buildObserverData(loaded.bundle);
45
+ await mkdir(observerDir, { recursive: true });
46
+ await writeJson(observerDataPath, observerData);
47
+ await writeFile(observerPath, renderObserverHtml(observerData), "utf8");
48
+ const relativeObserverPath = path.relative(cwd, observerPath);
49
+ const observerUrl = pathToFileURL(observerPath).href;
50
+ const openResult = options.open === true ? openTarget(observerPath) : { opened: false };
51
+ return {
52
+ schema: OBSERVER_SCHEMA,
53
+ ok: true,
54
+ cwd,
55
+ run: loaded.bundle.runId,
56
+ observerPath: relativeObserverPath,
57
+ observerDataPath: path.relative(cwd, observerDataPath),
58
+ eventsPath: path.relative(cwd, eventsPath),
59
+ observerUrl,
60
+ bundlePath: loaded.bundlePath,
61
+ opened: openResult.opened,
62
+ ...(openResult.command ? { openCommand: openResult.command } : {}),
63
+ warnings: [
64
+ "Observer renders local evidence only; dry-run lanes do not claim product behavior proof.",
65
+ "Before filing public feedback, use `mimetic feedback issue` so redaction and public-safety checks gate the payload.",
66
+ ...(openResult.warning ? [openResult.warning] : [])
67
+ ]
68
+ };
69
+ }
70
+ export async function serveObserver(result, options = {}) {
71
+ if (!result.ok || !result.observerPath) {
72
+ throw new Error("Cannot serve an observer result that did not render successfully.");
73
+ }
74
+ const cwd = path.resolve(result.cwd);
75
+ const observerPath = path.join(cwd, result.observerPath);
76
+ const runRoot = path.dirname(path.dirname(observerPath));
77
+ const proofRoot = path.dirname(runRoot);
78
+ const server = createServer(async (request, response) => {
79
+ try {
80
+ const url = new URL(request.url ?? "/", `http://${request.headers.host ?? "127.0.0.1"}`);
81
+ if (url.pathname === "/") {
82
+ response.writeHead(302, { location: "/observer/index.html" });
83
+ response.end();
84
+ return;
85
+ }
86
+ if (url.pathname === "/_mimetic/history.json") {
87
+ const history = await buildHistoryIndex(cwd);
88
+ writeResponse(response, 200, JSON.stringify(history, null, 2), "application/json; charset=utf-8");
89
+ return;
90
+ }
91
+ const runRoute = matchRunRoute(url.pathname);
92
+ if (runRoute) {
93
+ const targetRoot = path.join(proofRoot, runRoute.runId);
94
+ await serveRunPath(targetRoot, runRoute.relativePath || "observer/index.html", response);
95
+ return;
96
+ }
97
+ await serveRunPath(runRoot, decodeURIComponent(url.pathname.slice(1)), response);
98
+ }
99
+ catch (error) {
100
+ writeResponse(response, 500, error instanceof Error ? error.message : String(error), "text/plain; charset=utf-8");
101
+ }
102
+ });
103
+ const port = await listen(server, options.port ?? 0);
104
+ const url = `http://127.0.0.1:${port}/observer/index.html`;
105
+ const openResult = options.open === true ? openTarget(url) : { opened: false };
106
+ return {
107
+ url,
108
+ opened: openResult.opened,
109
+ ...(openResult.command ? { openCommand: openResult.command } : {}),
110
+ ...(openResult.warning ? { warning: openResult.warning } : {}),
111
+ close: () => closeServer(server)
112
+ };
113
+ }
114
+ function renderObserverHtml(data) {
115
+ return `<!doctype html>
116
+ <html lang="en">
117
+ <head>
118
+ <meta charset="utf-8">
119
+ <meta name="viewport" content="width=device-width, initial-scale=1">
120
+ <title>Mimetic Observer - ${escapeHtml(data.run.runId)}</title>
121
+ <style>${observerCss()}</style>
122
+ </head>
123
+ <body>
124
+ <div class="app" id="app">
125
+ <header class="rp" id="rp">
126
+ <div class="rp-bar">
127
+ <div class="rp-brand">
128
+ <span class="rp-brand-mark" aria-hidden="true"></span>
129
+ <span class="rp-brand-text">Mimetic - Observer</span>
130
+ </div>
131
+ <span class="rp-divider"></span>
132
+ <div class="rp-current">
133
+ <span class="pulse-dot" id="rp-current-pulse"></span>
134
+ <span class="rp-current-label" id="rp-current-label">Initializing</span>
135
+ <span class="rp-current-step" id="rp-current-step">- step 0/0</span>
136
+ </div>
137
+ <div class="rp-progress" id="rp-progress"><span></span></div>
138
+ <span class="rp-meta" id="rp-meta"></span>
139
+ <div class="rp-chips" id="rp-chips"></div>
140
+ <button type="button" class="rp-toggle" id="rp-toggle" aria-expanded="false">Phases</button>
141
+ </div>
142
+ <div class="rp-stepper" id="rp-stepper" hidden></div>
143
+ </header>
144
+
145
+ <div class="sub-bar" id="sub-bar">
146
+ <span class="obs-eyebrow" id="sub-mode">Watch grid</span>
147
+ <span class="sub-count"><strong id="sub-count">0</strong> streams</span>
148
+ <span class="sub-divider"></span>
149
+ <div class="sub-filters" id="sub-filters"></div>
150
+ <span class="sub-divider"></span>
151
+ <div class="sub-kind-filters" id="sub-kind-filters"></div>
152
+ <div class="sub-spacer">
153
+ <button class="sub-action" id="history-toggle" aria-expanded="false" hidden>Runs</button>
154
+ <span class="sub-divider" id="history-divider" hidden></span>
155
+ <span class="obs-eyebrow">Scale</span>
156
+ <button class="sub-density-btn" data-density="2" aria-pressed="false">2x</button>
157
+ <button class="sub-density-btn" data-density="3" aria-pressed="false">3x</button>
158
+ <button class="sub-density-btn" data-density="4" aria-pressed="true">4x</button>
159
+ <button class="sub-density-btn" data-density="5" aria-pressed="false">5x</button>
160
+ <span class="sub-divider"></span>
161
+ <button class="sub-action" id="media-toggle" data-mode-toggle="true" aria-pressed="false">Live</button>
162
+ <button class="sub-action" id="focus-mode" aria-pressed="false">Focus</button>
163
+ <button class="sub-action" id="grid-mode" aria-pressed="true">Grid</button>
164
+ </div>
165
+ </div>
166
+
167
+ <main class="grid-shell" id="grid-shell">
168
+ <div class="tile-grid" id="streams" data-density="4" data-stream-count="${data.streams.length}" aria-label="${data.streams.length} watchable streams"></div>
169
+ </main>
170
+
171
+ <section class="focus" id="focus" hidden aria-live="polite"></section>
172
+ <aside class="history-panel" id="history-panel" hidden aria-label="Run history">
173
+ <header class="history-head">
174
+ <div>
175
+ <span class="obs-eyebrow">Run history</span>
176
+ <h2>Past Mimetic runs</h2>
177
+ </div>
178
+ <button type="button" class="history-close" id="history-close" aria-label="Close run history">x</button>
179
+ </header>
180
+ <div class="history-current" id="history-current"></div>
181
+ <div class="history-list" id="history-list"></div>
182
+ </aside>
183
+ </div>
184
+ <script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>
185
+ <script>${observerClientJs()}</script>
186
+ </body>
187
+ </html>
188
+ `;
189
+ }
190
+ async function serveRunPath(runRoot, relativePath, response) {
191
+ const root = path.resolve(runRoot);
192
+ const cleanedRelativePath = relativePath === "" ? "observer/index.html" : relativePath;
193
+ const filePath = path.resolve(root, cleanedRelativePath);
194
+ if (!isPathInside(root, filePath)) {
195
+ writeResponse(response, 403, "Forbidden", "text/plain; charset=utf-8");
196
+ return;
197
+ }
198
+ if (cleanedRelativePath === "observer/index.html") {
199
+ const observerData = await readObserverData(root);
200
+ if (!observerData) {
201
+ writeResponse(response, 404, "Observer data not found", "text/plain; charset=utf-8");
202
+ return;
203
+ }
204
+ writeResponse(response, 200, renderObserverHtml(observerData), "text/html; charset=utf-8");
205
+ return;
206
+ }
207
+ try {
208
+ const body = await readFile(filePath);
209
+ response.writeHead(200, {
210
+ "cache-control": "no-store",
211
+ "content-type": contentTypeForPath(filePath)
212
+ });
213
+ response.end(body);
214
+ }
215
+ catch {
216
+ writeResponse(response, 404, "Not found", "text/plain; charset=utf-8");
217
+ }
218
+ }
219
+ async function readObserverData(runRoot) {
220
+ try {
221
+ return JSON.parse(await readFile(path.join(runRoot, "observer", "observer-data.json"), "utf8"));
222
+ }
223
+ catch { }
224
+ try {
225
+ const bundle = JSON.parse(await readFile(path.join(runRoot, "run.json"), "utf8"));
226
+ return buildObserverData(bundle);
227
+ }
228
+ catch { }
229
+ return null;
230
+ }
231
+ async function buildHistoryIndex(cwd) {
232
+ const listed = await listRuns(cwd);
233
+ const runs = await Promise.all(listed.runs.slice(0, 80).map(async (run) => {
234
+ const root = path.join(cwd, run.path);
235
+ const data = await readObserverData(root);
236
+ return {
237
+ runId: run.runId,
238
+ createdAt: run.createdAt,
239
+ mode: run.mode,
240
+ href: `/_mimetic/runs/${encodeURIComponent(run.runId)}/observer/index.html`,
241
+ status: data?.run.status ?? "unknown",
242
+ streamCount: data?.streams.length ?? 0
243
+ };
244
+ }));
245
+ return { latestRunId: listed.latest, runs };
246
+ }
247
+ function matchRunRoute(pathname) {
248
+ const match = pathname.match(/^\/_mimetic\/runs\/([^/]+)(?:\/(.*))?$/);
249
+ if (!match)
250
+ return null;
251
+ return {
252
+ runId: decodeURIComponent(match[1] ?? ""),
253
+ relativePath: decodeURIComponent(match[2] || "observer/index.html")
254
+ };
255
+ }
256
+ function writeJson(filePath, value) {
257
+ return writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
258
+ }
259
+ function writeResponse(response, status, body, contentType) {
260
+ response.writeHead(status, {
261
+ "cache-control": "no-store",
262
+ "content-type": contentType
263
+ });
264
+ response.end(body);
265
+ }
266
+ function contentTypeForPath(filePath) {
267
+ switch (path.extname(filePath)) {
268
+ case ".html":
269
+ return "text/html; charset=utf-8";
270
+ case ".json":
271
+ return "application/json; charset=utf-8";
272
+ case ".md":
273
+ return "text/markdown; charset=utf-8";
274
+ case ".ndjson":
275
+ return "application/x-ndjson; charset=utf-8";
276
+ case ".png":
277
+ return "image/png";
278
+ case ".jpg":
279
+ case ".jpeg":
280
+ return "image/jpeg";
281
+ case ".webp":
282
+ return "image/webp";
283
+ default:
284
+ return "text/plain; charset=utf-8";
285
+ }
286
+ }
287
+ function openTarget(target) {
288
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
289
+ const args = process.platform === "win32" ? ["/c", "start", "", target] : [target];
290
+ try {
291
+ const child = spawn(command, args, {
292
+ detached: true,
293
+ stdio: "ignore"
294
+ });
295
+ child.unref();
296
+ return { opened: true, command: [command, ...args].join(" ") };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ opened: false,
301
+ command: [command, ...args].join(" "),
302
+ warning: `Could not open observer automatically: ${error instanceof Error ? error.message : String(error)}`
303
+ };
304
+ }
305
+ }
306
+ function listen(server, port) {
307
+ return new Promise((resolve, reject) => {
308
+ server.once("error", reject);
309
+ server.listen(port, "127.0.0.1", () => {
310
+ server.off("error", reject);
311
+ const address = server.address();
312
+ if (!address || typeof address === "string") {
313
+ reject(new Error("Observer server did not bind to a TCP port."));
314
+ return;
315
+ }
316
+ resolve(address.port);
317
+ });
318
+ });
319
+ }
320
+ function closeServer(server) {
321
+ return new Promise((resolve, reject) => {
322
+ server.close((error) => {
323
+ if (error) {
324
+ reject(error);
325
+ }
326
+ else {
327
+ resolve();
328
+ }
329
+ });
330
+ });
331
+ }
332
+ function isPathInside(root, filePath) {
333
+ const relative = path.relative(root, filePath);
334
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
335
+ }
336
+ function escapeHtml(value) {
337
+ return value.replace(/[&<>"']/g, (char) => {
338
+ switch (char) {
339
+ case "&":
340
+ return "&amp;";
341
+ case "<":
342
+ return "&lt;";
343
+ case ">":
344
+ return "&gt;";
345
+ case "\"":
346
+ return "&quot;";
347
+ default:
348
+ return "&#39;";
349
+ }
350
+ });
351
+ }
352
+ function escapeJsonScript(value) {
353
+ return JSON.stringify(value)
354
+ .replace(/</g, "\\u003c")
355
+ .replace(/>/g, "\\u003e")
356
+ .replace(/&/g, "\\u0026")
357
+ .replace(/\u2028/g, "\\u2028")
358
+ .replace(/\u2029/g, "\\u2029");
359
+ }
360
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export declare const OSS_LAB_SCHEMA = "mimetic.oss-lab-result.v1";
2
+ export declare const DEFAULT_OSS_REPOS: readonly ["developit/mitt", "lukeed/clsx", "sindresorhus/is-plain-obj", "ai/nanoid"];
3
+ export interface OssLabOptions {
4
+ cwd: string;
5
+ keep?: boolean;
6
+ limit?: number;
7
+ repos?: string[];
8
+ runId?: string;
9
+ }
10
+ export interface OssLabStep {
11
+ durationMs: number;
12
+ name: string;
13
+ ok: boolean;
14
+ summary: string;
15
+ }
16
+ export interface OssLabRepoResult {
17
+ changedFiles: string[];
18
+ clonePath: string;
19
+ mimeticRunId?: string;
20
+ observerPath?: string;
21
+ ok: boolean;
22
+ repo: string;
23
+ steps: OssLabStep[];
24
+ url: string;
25
+ warnings: string[];
26
+ }
27
+ export interface OssLabResult {
28
+ schema: typeof OSS_LAB_SCHEMA;
29
+ ok: boolean;
30
+ cleanup: {
31
+ kept: boolean;
32
+ sandboxRemoved: boolean;
33
+ };
34
+ completedAt: string;
35
+ cwd: string;
36
+ error?: {
37
+ code: "MIMETIC_INVALID_OSS_REPO" | "MIMETIC_INVALID_OSS_LIMIT";
38
+ message: string;
39
+ };
40
+ reportJsonPath?: string;
41
+ reportMarkdownPath?: string;
42
+ repos: OssLabRepoResult[];
43
+ runId: string;
44
+ sandboxPath: string;
45
+ startedAt: string;
46
+ warnings: string[];
47
+ }
48
+ export declare function normalizeOssRepoSlugs(input: string[] | undefined): string[];
49
+ export declare function validateOssRepoSlug(slug: string): boolean;
50
+ export declare function runOssLab(options: OssLabOptions): Promise<OssLabResult>;