opencode-plugin-flow 5.2.0 → 5.2.2
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/CHANGELOG.md +45 -0
- package/README.md +6 -5
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +3 -3
- package/dist/index.js +1198 -514
- package/dist/index.js.map +15 -15
- package/package.json +12 -5
- package/dist/application/errors.d.ts +0 -10
- package/dist/application/flow-service.d.ts +0 -311
- package/dist/application/ports/evidence-artifact-store.d.ts +0 -28
- package/dist/application/ports/session-repository.d.ts +0 -19
- package/dist/application/ports/source-identity.d.ts +0 -61
- package/dist/application/replay/canonical-json.d.ts +0 -7
- package/dist/application/replay/contract.d.ts +0 -2130
- package/dist/application/replay/engine.d.ts +0 -101
- package/dist/application/replay/index.d.ts +0 -7
- package/dist/application/replay/privacy.d.ts +0 -14
- package/dist/application/schema.d.ts +0 -1813
- package/dist/cli.d.ts +0 -1
- package/dist/config-shared.d.ts +0 -287
- package/dist/config.d.ts +0 -1
- package/dist/distribution/legacy-cleanup.d.ts +0 -25
- package/dist/domain/feature-id.d.ts +0 -3
- package/dist/domain/limits.d.ts +0 -4
- package/dist/domain/orchestration-policy.d.ts +0 -27
- package/dist/domain/session-invariants.d.ts +0 -8
- package/dist/domain/session.d.ts +0 -356
- package/dist/domain/transitions.d.ts +0 -275
- package/dist/domain/validation-command.d.ts +0 -8
- package/dist/guidance/catalog.d.ts +0 -18
- package/dist/guidance/ids.d.ts +0 -4
- package/dist/infrastructure/fs/evidence-artifact-store.d.ts +0 -5
- package/dist/infrastructure/fs/session-repository.d.ts +0 -2
- package/dist/infrastructure/fs/source-identity.d.ts +0 -26
- package/dist/infrastructure/fs/strict-json-object.d.ts +0 -9
- package/dist/infrastructure/fs/workspace-flow-service.d.ts +0 -10
- package/dist/infrastructure/fs/workspace.d.ts +0 -62
- package/dist/infrastructure/system/transition-environment.d.ts +0 -2
- package/dist/platform/opencode/config.d.ts +0 -2
- package/dist/platform/opencode/logging.d.ts +0 -3
- package/dist/platform/opencode/tools.d.ts +0 -4
- package/dist/prompt-baseline-fixtures.d.ts +0 -20
- package/dist/prompt-model-evaluation.d.ts +0 -88
- package/dist/prompt-quality.d.ts +0 -80
- package/dist/prompt-surfaces.d.ts +0 -28
- package/dist/version.d.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
One short entry per release, written for users deciding whether to upgrade.
|
|
4
4
|
|
|
5
|
+
## [5.2.2] - 2026-07-19
|
|
6
|
+
|
|
7
|
+
Code-quality and persistence-hardening lore makes Flow safer at its input,
|
|
8
|
+
replay, packaging, and filesystem boundaries without changing valid Session v4
|
|
9
|
+
workflows:
|
|
10
|
+
|
|
11
|
+
- Lifecycle admission now applies exact UTF-8 and collection bounds before
|
|
12
|
+
state I/O, reserves reachable execution and reviewer projections including
|
|
13
|
+
the longest persisted run identity, validates dependency graphs iteratively,
|
|
14
|
+
rejects duplicate pending assignments, and requires explicit timestamp
|
|
15
|
+
offsets.
|
|
16
|
+
- Optional orchestration telemetry has bounded raw and retained collections,
|
|
17
|
+
keeps malformed optional records warning-only, and saturates aggregate
|
|
18
|
+
counters instead of allowing valid large observations to corrupt persisted
|
|
19
|
+
state.
|
|
20
|
+
- Replay validates session identity, complete mutation sequencing, crash and
|
|
21
|
+
recovery revision ownership, and monotonic durable revision, digest, and
|
|
22
|
+
status observations while preserving deterministic report bytes.
|
|
23
|
+
- Source and evidence persistence use bounded descriptor reads, identity and
|
|
24
|
+
topology revalidation, streaming traversal, exact filename checks, and
|
|
25
|
+
deterministic publication, collision, growth, and ancestor-substitution
|
|
26
|
+
probes.
|
|
27
|
+
- Release and package gates validate exact metadata, prune internal declaration
|
|
28
|
+
output, assert the complete packed-file allowlist, audit high-severity
|
|
29
|
+
advisories separately, pin workflow tooling, and keep Linux, macOS, Windows,
|
|
30
|
+
Node 24/26, and the real OpenCode host as blocking compatibility signals.
|
|
31
|
+
- Maintained documentation is indexed and source-checked; stale guidance,
|
|
32
|
+
confirmed dead exports and aliases, debug-era wrappers, and test cleanup
|
|
33
|
+
leaks are removed while uncertain external surfaces remain intact.
|
|
34
|
+
|
|
35
|
+
## [5.2.1] - 2026-07-19
|
|
36
|
+
|
|
37
|
+
Desktop helper runtime lore restores durable session closure under OpenCode
|
|
38
|
+
Desktop while preserving Flow's pinned-filesystem safety boundary:
|
|
39
|
+
|
|
40
|
+
- Electron-hosted Flow now starts its short-lived filesystem helper through the
|
|
41
|
+
host executable's Node mode. Bun-hosted OpenCode retains its dedicated CLI
|
|
42
|
+
mode, and ordinary Node hosts remain unchanged.
|
|
43
|
+
- Helper launch and protocol failures are classified separately from malformed
|
|
44
|
+
or ambiguous canonical history. Recovery guidance preserves the active
|
|
45
|
+
session and its exact durable close operation instead of blaming healthy
|
|
46
|
+
archive state.
|
|
47
|
+
- Persistence coverage exercises the Electron launch contract end to end and
|
|
48
|
+
proves that runtime failures remain atomic and receive the correct guidance.
|
|
49
|
+
|
|
5
50
|
## [5.2.0] - 2026-07-19
|
|
6
51
|
|
|
7
52
|
Runtime-owned review assignment lore removes the recovery loops seen in long
|
package/README.md
CHANGED
|
@@ -11,13 +11,14 @@ execution, validation, review, and orchestration judgment, while the plugin
|
|
|
11
11
|
runtime stays deliberately small — it keeps the session ledger and enforces the
|
|
12
12
|
hard gates prompts should not be trusted to remember.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
The maintained documentation starts at [docs/index.md](docs/index.md). The
|
|
15
|
+
tracked `droid-wiki/` tree is an archived generated snapshot and is not a
|
|
16
|
+
current product or contributor contract.
|
|
16
17
|
|
|
17
18
|
## Quick start
|
|
18
19
|
|
|
19
20
|
```bash
|
|
20
|
-
opencode plugin opencode-plugin-flow@5.2.
|
|
21
|
+
opencode plugin opencode-plugin-flow@5.2.2 --global --force
|
|
21
22
|
```
|
|
22
23
|
|
|
23
24
|
Start or restart OpenCode, then give Flow a goal:
|
|
@@ -235,14 +236,14 @@ or sync command is required. To preview recoverable migration of pristine v4
|
|
|
235
236
|
global skill folders:
|
|
236
237
|
|
|
237
238
|
```bash
|
|
238
|
-
npx -y opencode-plugin-flow@5.2.
|
|
239
|
+
npx -y opencode-plugin-flow@5.2.2 legacy-cleanup --dry-run
|
|
239
240
|
```
|
|
240
241
|
|
|
241
242
|
## Development
|
|
242
243
|
|
|
243
244
|
```bash
|
|
244
245
|
bun install
|
|
245
|
-
bun run check # typecheck + lint + prompt quality + build + tests
|
|
246
|
+
bun run check # typecheck + lint + release metadata + prompt quality + build + tests
|
|
246
247
|
bun run smoke:live # boots a real OpenCode server against the packed tarball
|
|
247
248
|
```
|
|
248
249
|
|
package/dist/cli.js
CHANGED
|
@@ -271,6 +271,15 @@ async function cleanupLegacySkills(options) {
|
|
|
271
271
|
}
|
|
272
272
|
await options?.afterQuarantine?.({ name, path, archivePath });
|
|
273
273
|
const verified = await verifyMovedLegacyFolder(name, archivePath);
|
|
274
|
+
if (verified.status === "absent") {
|
|
275
|
+
results.push({
|
|
276
|
+
name,
|
|
277
|
+
path,
|
|
278
|
+
status: "refused",
|
|
279
|
+
reason: "archive moved again while cleanup was running; inspect the legacy archive root"
|
|
280
|
+
});
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
274
283
|
if (verified.status !== "eligible") {
|
|
275
284
|
results.push({
|
|
276
285
|
name,
|
|
@@ -385,4 +394,4 @@ main(process.argv).catch((error) => {
|
|
|
385
394
|
process.exitCode = 1;
|
|
386
395
|
});
|
|
387
396
|
|
|
388
|
-
//# debugId=
|
|
397
|
+
//# debugId=87C725E49214F7FF64756E2164756E21
|
package/dist/cli.js.map
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/distribution/legacy-cleanup.ts", "../src/guidance/ids.ts", "../src/version.ts", "../src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { createHash } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n\ttype FileHandle,\n\tlstat,\n\tmkdir,\n\topen,\n\treaddir,\n\trename,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, normalize, sep } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { FLOW_GUIDANCE_TOPICS } from \"../guidance/ids.js\";\n\nconst LEGACY_MARKER = \".flow-skill-version\";\nconst NO_FOLLOW = constants.O_NOFOLLOW ?? 0;\nconst SUPPORTED_LEGACY_MAJOR = \"4\";\nconst POST_MOVE_VERIFICATION_ATTEMPTS = 4;\nconst POST_MOVE_VERIFICATION_RETRY_MS = 25;\nconst SEMVER_PATTERN =\n\t/^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\ntype ParsedMarker = {\n\tversion: string;\n\tfiles: Map<string, string>;\n};\n\nexport type LegacySkillCleanupResult = {\n\tname: string;\n\tpath: string;\n\tstatus: \"absent\" | \"eligible\" | \"archived\" | \"refused\" | \"quarantined\";\n\treason?: string;\n\tarchivePath?: string;\n};\n\nexport type LegacyCleanupReport = {\n\tmode: \"dry-run\" | \"apply\";\n\troot: string;\n\tarchiveRoot: string;\n\tresults: LegacySkillCleanupResult[];\n};\n\nfunction configuredHome(): string {\n\treturn (\n\t\tprocess.env.HOME?.trim() || process.env.USERPROFILE?.trim() || homedir()\n\t);\n}\n\nexport function resolveLegacySkillsRoot(home = configuredHome()): string {\n\treturn join(home, \".config\", \"opencode\", \"skills\");\n}\n\nexport function resolveLegacyArchiveRoot(home = configuredHome()): string {\n\treturn join(home, \".config\", \"opencode\", \"flow-legacy-skills\");\n}\n\nfunction sha256(content: string): string {\n\treturn createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction safeLegacyPath(folder: string, relativePath: string): string {\n\tif (\n\t\t!relativePath ||\n\t\tisAbsolute(relativePath) ||\n\t\trelativePath.includes(\"\\\\\") ||\n\t\trelativePath\n\t\t\t.split(\"/\")\n\t\t\t.some((part) => !part || part === \".\" || part === \"..\")\n\t) {\n\t\tthrow new Error(`unsafe marker path '${relativePath}'`);\n\t}\n\tconst resolved = normalize(join(folder, ...relativePath.split(\"/\")));\n\tif (!resolved.startsWith(`${folder}${sep}`)) {\n\t\tthrow new Error(`unsafe marker path '${relativePath}'`);\n\t}\n\treturn resolved;\n}\n\nasync function optionalStat(path: string) {\n\ttry {\n\t\treturn await lstat(path, { bigint: false });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n}\n\nasync function readRegularFileWithoutFollowing(path: string): Promise<string> {\n\tlet handle: FileHandle | undefined;\n\ttry {\n\t\tconst pathMetadata = await lstat(path);\n\t\tif (pathMetadata.isSymbolicLink()) {\n\t\t\tthrow new Error(`symbolic link refused: ${path}`);\n\t\t}\n\t\tif (!pathMetadata.isFile()) throw new Error(`not a regular file: ${path}`);\n\t\thandle = await open(path, constants.O_RDONLY | NO_FOLLOW);\n\t\tconst metadata = await handle.stat();\n\t\tif (!metadata.isFile()) throw new Error(`not a regular file: ${path}`);\n\t\tif (\n\t\t\tmetadata.dev !== pathMetadata.dev ||\n\t\t\tmetadata.ino !== pathMetadata.ino\n\t\t) {\n\t\t\tthrow new Error(`file changed while cleanup was running: ${path}`);\n\t\t}\n\t\treturn await handle.readFile({ encoding: \"utf8\" });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ELOOP\") {\n\t\t\tthrow new Error(`symbolic link refused: ${path}`);\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tawait handle?.close();\n\t}\n}\n\nfunction parseMarker(content: string): ParsedMarker {\n\tlet version: string | undefined;\n\tconst files = new Map<string, string>();\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tif (!line) continue;\n\t\tconst versionMatch = /^version=(.+)$/.exec(line);\n\t\tif (versionMatch?.[1]) {\n\t\t\tif (version) throw new Error(\"marker contains duplicate versions\");\n\t\t\tversion = versionMatch[1];\n\t\t\tcontinue;\n\t\t}\n\t\tconst fileMatch =\n\t\t\t/^file=(.+) sha256=([a-f0-9]{64})$/.exec(line) ??\n\t\t\t/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (fileMatch?.[1] && fileMatch[2]) {\n\t\t\tif (files.has(fileMatch[1])) {\n\t\t\t\tthrow new Error(`marker contains duplicate file '${fileMatch[1]}'`);\n\t\t\t}\n\t\t\tfiles.set(fileMatch[1], fileMatch[2]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst topLevelHash = /^hash=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (topLevelHash?.[1] && !files.has(\"SKILL.md\")) {\n\t\t\tfiles.set(\"SKILL.md\", topLevelHash[1]);\n\t\t\tcontinue;\n\t\t}\n\t\tthrow new Error(`marker contains an invalid line: '${line}'`);\n\t}\n\tif (!version) throw new Error(\"marker has no version\");\n\tif (!files.has(\"SKILL.md\")) throw new Error(\"marker does not own SKILL.md\");\n\treturn { version, files };\n}\n\nfunction assertSupportedLegacyVersion(version: string): void {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) {\n\t\tthrow new Error(\n\t\t\t`marker version '${version}' is not a valid semantic version`,\n\t\t);\n\t}\n\tif (match[1] !== SUPPORTED_LEGACY_MAJOR) {\n\t\tthrow new Error(\n\t\t\t`marker version '${version}' is outside the supported legacy range >=4.0.0 <5.0.0`,\n\t\t);\n\t}\n}\n\nfunction expectedDirectoryEntries(\n\tmarker: ParsedMarker,\n): Map<string, Set<string>> {\n\tconst entries = new Map<string, Set<string>>([\n\t\t[\"\", new Set([LEGACY_MARKER])],\n\t]);\n\tfor (const relativePath of marker.files.keys()) {\n\t\tconst parts = relativePath.split(\"/\");\n\t\tlet parent = \"\";\n\t\tfor (let index = 0; index < parts.length; index += 1) {\n\t\t\tconst part = parts[index];\n\t\t\tif (!part) throw new Error(`unsafe marker path '${relativePath}'`);\n\t\t\tconst children = entries.get(parent) ?? new Set<string>();\n\t\t\tchildren.add(part);\n\t\t\tentries.set(parent, children);\n\t\t\tif (index < parts.length - 1) {\n\t\t\t\tparent = parent ? `${parent}/${part}` : part;\n\t\t\t\tif (!entries.has(parent)) entries.set(parent, new Set());\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\n\nasync function inspectLegacyFolder(\n\tname: string,\n\tfolder: string,\n): Promise<LegacySkillCleanupResult> {\n\tconst metadata = await optionalStat(folder);\n\tif (!metadata) return { name, path: folder, status: \"absent\" };\n\tif (!metadata.isDirectory()) {\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"refused\",\n\t\t\treason: \"path is not a real directory\",\n\t\t};\n\t}\n\n\ttry {\n\t\tconst markerPath = join(folder, LEGACY_MARKER);\n\t\tconst marker = parseMarker(\n\t\t\tawait readRegularFileWithoutFollowing(markerPath),\n\t\t);\n\t\tassertSupportedLegacyVersion(marker.version);\n\t\tconst directories = expectedDirectoryEntries(marker);\n\t\tfor (const [relativeDirectory, expectedEntries] of directories) {\n\t\t\tconst directory = relativeDirectory\n\t\t\t\t? safeLegacyPath(folder, relativeDirectory)\n\t\t\t\t: folder;\n\t\t\tconst directoryMetadata = await optionalStat(directory);\n\t\t\tif (!directoryMetadata?.isDirectory()) {\n\t\t\t\tthrow new Error(`expected real directory: ${relativeDirectory || \".\"}`);\n\t\t\t}\n\t\t\tconst actualEntries = await readdir(directory);\n\t\t\tconst unexpected = actualEntries.filter(\n\t\t\t\t(entry) => !expectedEntries.has(entry),\n\t\t\t);\n\t\t\tconst missing = [...expectedEntries].filter(\n\t\t\t\t(entry) => !actualEntries.includes(entry),\n\t\t\t);\n\t\t\tif (unexpected.length > 0 || missing.length > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t[\n\t\t\t\t\t\tunexpected.length > 0\n\t\t\t\t\t\t\t? `unexpected entries: ${unexpected.join(\", \")}`\n\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\tmissing.length > 0 ? `missing entries: ${missing.join(\", \")}` : \"\",\n\t\t\t\t\t]\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.join(\"; \"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const [relativePath, expectedHash] of marker.files) {\n\t\t\tconst path = safeLegacyPath(folder, relativePath);\n\t\t\tconst content = await readRegularFileWithoutFollowing(path);\n\t\t\tif (sha256(content) !== expectedHash) {\n\t\t\t\tthrow new Error(`edited file refused: ${relativePath}`);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"eligible\",\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"refused\",\n\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n}\n\nasync function ensureRealArchiveRoot(path: string): Promise<void> {\n\tconst existing = await optionalStat(path);\n\tif (existing) {\n\t\tif (!existing.isDirectory()) {\n\t\t\tthrow new Error(`Legacy archive path is not a real directory: ${path}`);\n\t\t}\n\t\treturn;\n\t}\n\ttry {\n\t\tawait mkdir(path, { mode: 0o700 });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\tconst raced = await optionalStat(path);\n\t\tif (!raced?.isDirectory()) {\n\t\t\tthrow new Error(`Legacy archive path is not a real directory: ${path}`);\n\t\t}\n\t}\n}\n\nasync function verifyMovedLegacyFolder(\n\tname: string,\n\tarchivePath: string,\n): Promise<LegacySkillCleanupResult> {\n\tlet verified = await inspectLegacyFolder(name, archivePath);\n\tfor (\n\t\tlet attempt = 1;\n\t\tattempt < POST_MOVE_VERIFICATION_ATTEMPTS && verified.status !== \"eligible\";\n\t\tattempt += 1\n\t) {\n\t\t// Windows may briefly report a just-renamed directory as missing or\n\t\t// inaccessible while a competing inspection releases its file handles.\n\t\t// Retrying never weakens cleanup safety: only a complete byte-pristine\n\t\t// inspection can return eligible, while persistent edits still quarantine.\n\t\tawait sleep(POST_MOVE_VERIFICATION_RETRY_MS * attempt);\n\t\tverified = await inspectLegacyFolder(name, archivePath);\n\t}\n\treturn verified;\n}\n\nexport async function cleanupLegacySkills(options?: {\n\thome?: string;\n\tapply?: boolean;\n\t/** @internal Deterministic race-testing seam; package consumers should omit it. */\n\tafterQuarantine?: (context: {\n\t\tname: string;\n\t\tpath: string;\n\t\tarchivePath: string;\n\t}) => Promise<void>;\n}): Promise<LegacyCleanupReport> {\n\tconst home = options?.home ?? configuredHome();\n\tconst root = resolveLegacySkillsRoot(home);\n\tconst archiveRoot = resolveLegacyArchiveRoot(home);\n\tconst apply = options?.apply === true;\n\tconst results: LegacySkillCleanupResult[] = [];\n\n\tlet archiveReady = false;\n\tfor (const name of FLOW_GUIDANCE_TOPICS) {\n\t\tconst path = join(root, name);\n\t\tconst inspected = await inspectLegacyFolder(name, path);\n\t\tif (!apply || inspected.status !== \"eligible\") {\n\t\t\tresults.push(inspected);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!archiveReady) {\n\t\t\tawait ensureRealArchiveRoot(archiveRoot);\n\t\t\tarchiveReady = true;\n\t\t}\n\t\tconst archivePath = join(\n\t\t\tarchiveRoot,\n\t\t\t`${name}-${new Date().toISOString().replaceAll(\":\", \"-\")}-${crypto.randomUUID()}`,\n\t\t);\n\t\ttry {\n\t\t\tawait rename(path, archivePath);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tstatus: \"refused\",\n\t\t\t\treason: \"folder changed while cleanup was running\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tawait options?.afterQuarantine?.({ name, path, archivePath });\n\t\tconst verified = await verifyMovedLegacyFolder(name, archivePath);\n\t\tif (verified.status !== \"eligible\") {\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tstatus: \"quarantined\",\n\t\t\t\treason:\n\t\t\t\t\t\"folder changed while cleanup was running; preserved for manual recovery\",\n\t\t\t\tarchivePath,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tresults.push({\n\t\t\tname,\n\t\t\tpath,\n\t\t\tstatus: \"archived\",\n\t\t\tarchivePath,\n\t\t});\n\t}\n\n\treturn {\n\t\tmode: apply ? \"apply\" : \"dry-run\",\n\t\troot,\n\t\tarchiveRoot,\n\t\tresults,\n\t};\n}\n",
|
|
5
|
+
"import { createHash } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n\ttype FileHandle,\n\tlstat,\n\tmkdir,\n\topen,\n\treaddir,\n\trename,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, normalize, sep } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { FLOW_GUIDANCE_TOPICS } from \"../guidance/ids.js\";\n\nconst LEGACY_MARKER = \".flow-skill-version\";\nconst NO_FOLLOW = constants.O_NOFOLLOW ?? 0;\nconst SUPPORTED_LEGACY_MAJOR = \"4\";\nconst POST_MOVE_VERIFICATION_ATTEMPTS = 4;\nconst POST_MOVE_VERIFICATION_RETRY_MS = 25;\nconst SEMVER_PATTERN =\n\t/^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\ntype ParsedMarker = {\n\tversion: string;\n\tfiles: Map<string, string>;\n};\n\nexport type LegacySkillCleanupResult = {\n\tname: string;\n\tpath: string;\n\tstatus: \"absent\" | \"eligible\" | \"archived\" | \"refused\" | \"quarantined\";\n\treason?: string;\n\tarchivePath?: string;\n};\n\nexport type LegacyCleanupReport = {\n\tmode: \"dry-run\" | \"apply\";\n\troot: string;\n\tarchiveRoot: string;\n\tresults: LegacySkillCleanupResult[];\n};\n\nfunction configuredHome(): string {\n\treturn (\n\t\tprocess.env.HOME?.trim() || process.env.USERPROFILE?.trim() || homedir()\n\t);\n}\n\nexport function resolveLegacySkillsRoot(home = configuredHome()): string {\n\treturn join(home, \".config\", \"opencode\", \"skills\");\n}\n\nexport function resolveLegacyArchiveRoot(home = configuredHome()): string {\n\treturn join(home, \".config\", \"opencode\", \"flow-legacy-skills\");\n}\n\nfunction sha256(content: string): string {\n\treturn createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction safeLegacyPath(folder: string, relativePath: string): string {\n\tif (\n\t\t!relativePath ||\n\t\tisAbsolute(relativePath) ||\n\t\trelativePath.includes(\"\\\\\") ||\n\t\trelativePath\n\t\t\t.split(\"/\")\n\t\t\t.some((part) => !part || part === \".\" || part === \"..\")\n\t) {\n\t\tthrow new Error(`unsafe marker path '${relativePath}'`);\n\t}\n\tconst resolved = normalize(join(folder, ...relativePath.split(\"/\")));\n\tif (!resolved.startsWith(`${folder}${sep}`)) {\n\t\tthrow new Error(`unsafe marker path '${relativePath}'`);\n\t}\n\treturn resolved;\n}\n\nasync function optionalStat(path: string) {\n\ttry {\n\t\treturn await lstat(path, { bigint: false });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n}\n\nasync function readRegularFileWithoutFollowing(path: string): Promise<string> {\n\tlet handle: FileHandle | undefined;\n\ttry {\n\t\tconst pathMetadata = await lstat(path);\n\t\tif (pathMetadata.isSymbolicLink()) {\n\t\t\tthrow new Error(`symbolic link refused: ${path}`);\n\t\t}\n\t\tif (!pathMetadata.isFile()) throw new Error(`not a regular file: ${path}`);\n\t\thandle = await open(path, constants.O_RDONLY | NO_FOLLOW);\n\t\tconst metadata = await handle.stat();\n\t\tif (!metadata.isFile()) throw new Error(`not a regular file: ${path}`);\n\t\tif (\n\t\t\tmetadata.dev !== pathMetadata.dev ||\n\t\t\tmetadata.ino !== pathMetadata.ino\n\t\t) {\n\t\t\tthrow new Error(`file changed while cleanup was running: ${path}`);\n\t\t}\n\t\treturn await handle.readFile({ encoding: \"utf8\" });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ELOOP\") {\n\t\t\tthrow new Error(`symbolic link refused: ${path}`);\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tawait handle?.close();\n\t}\n}\n\nfunction parseMarker(content: string): ParsedMarker {\n\tlet version: string | undefined;\n\tconst files = new Map<string, string>();\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tif (!line) continue;\n\t\tconst versionMatch = /^version=(.+)$/.exec(line);\n\t\tif (versionMatch?.[1]) {\n\t\t\tif (version) throw new Error(\"marker contains duplicate versions\");\n\t\t\tversion = versionMatch[1];\n\t\t\tcontinue;\n\t\t}\n\t\tconst fileMatch =\n\t\t\t/^file=(.+) sha256=([a-f0-9]{64})$/.exec(line) ??\n\t\t\t/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (fileMatch?.[1] && fileMatch[2]) {\n\t\t\tif (files.has(fileMatch[1])) {\n\t\t\t\tthrow new Error(`marker contains duplicate file '${fileMatch[1]}'`);\n\t\t\t}\n\t\t\tfiles.set(fileMatch[1], fileMatch[2]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst topLevelHash = /^hash=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (topLevelHash?.[1] && !files.has(\"SKILL.md\")) {\n\t\t\tfiles.set(\"SKILL.md\", topLevelHash[1]);\n\t\t\tcontinue;\n\t\t}\n\t\tthrow new Error(`marker contains an invalid line: '${line}'`);\n\t}\n\tif (!version) throw new Error(\"marker has no version\");\n\tif (!files.has(\"SKILL.md\")) throw new Error(\"marker does not own SKILL.md\");\n\treturn { version, files };\n}\n\nfunction assertSupportedLegacyVersion(version: string): void {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) {\n\t\tthrow new Error(\n\t\t\t`marker version '${version}' is not a valid semantic version`,\n\t\t);\n\t}\n\tif (match[1] !== SUPPORTED_LEGACY_MAJOR) {\n\t\tthrow new Error(\n\t\t\t`marker version '${version}' is outside the supported legacy range >=4.0.0 <5.0.0`,\n\t\t);\n\t}\n}\n\nfunction expectedDirectoryEntries(\n\tmarker: ParsedMarker,\n): Map<string, Set<string>> {\n\tconst entries = new Map<string, Set<string>>([\n\t\t[\"\", new Set([LEGACY_MARKER])],\n\t]);\n\tfor (const relativePath of marker.files.keys()) {\n\t\tconst parts = relativePath.split(\"/\");\n\t\tlet parent = \"\";\n\t\tfor (let index = 0; index < parts.length; index += 1) {\n\t\t\tconst part = parts[index];\n\t\t\tif (!part) throw new Error(`unsafe marker path '${relativePath}'`);\n\t\t\tconst children = entries.get(parent) ?? new Set<string>();\n\t\t\tchildren.add(part);\n\t\t\tentries.set(parent, children);\n\t\t\tif (index < parts.length - 1) {\n\t\t\t\tparent = parent ? `${parent}/${part}` : part;\n\t\t\t\tif (!entries.has(parent)) entries.set(parent, new Set());\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\n\nasync function inspectLegacyFolder(\n\tname: string,\n\tfolder: string,\n): Promise<LegacySkillCleanupResult> {\n\tconst metadata = await optionalStat(folder);\n\tif (!metadata) return { name, path: folder, status: \"absent\" };\n\tif (!metadata.isDirectory()) {\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"refused\",\n\t\t\treason: \"path is not a real directory\",\n\t\t};\n\t}\n\n\ttry {\n\t\tconst markerPath = join(folder, LEGACY_MARKER);\n\t\tconst marker = parseMarker(\n\t\t\tawait readRegularFileWithoutFollowing(markerPath),\n\t\t);\n\t\tassertSupportedLegacyVersion(marker.version);\n\t\tconst directories = expectedDirectoryEntries(marker);\n\t\tfor (const [relativeDirectory, expectedEntries] of directories) {\n\t\t\tconst directory = relativeDirectory\n\t\t\t\t? safeLegacyPath(folder, relativeDirectory)\n\t\t\t\t: folder;\n\t\t\tconst directoryMetadata = await optionalStat(directory);\n\t\t\tif (!directoryMetadata?.isDirectory()) {\n\t\t\t\tthrow new Error(`expected real directory: ${relativeDirectory || \".\"}`);\n\t\t\t}\n\t\t\tconst actualEntries = await readdir(directory);\n\t\t\tconst unexpected = actualEntries.filter(\n\t\t\t\t(entry) => !expectedEntries.has(entry),\n\t\t\t);\n\t\t\tconst missing = [...expectedEntries].filter(\n\t\t\t\t(entry) => !actualEntries.includes(entry),\n\t\t\t);\n\t\t\tif (unexpected.length > 0 || missing.length > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t[\n\t\t\t\t\t\tunexpected.length > 0\n\t\t\t\t\t\t\t? `unexpected entries: ${unexpected.join(\", \")}`\n\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\tmissing.length > 0 ? `missing entries: ${missing.join(\", \")}` : \"\",\n\t\t\t\t\t]\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.join(\"; \"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const [relativePath, expectedHash] of marker.files) {\n\t\t\tconst path = safeLegacyPath(folder, relativePath);\n\t\t\tconst content = await readRegularFileWithoutFollowing(path);\n\t\t\tif (sha256(content) !== expectedHash) {\n\t\t\t\tthrow new Error(`edited file refused: ${relativePath}`);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"eligible\",\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tpath: folder,\n\t\t\tstatus: \"refused\",\n\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n}\n\nasync function ensureRealArchiveRoot(path: string): Promise<void> {\n\tconst existing = await optionalStat(path);\n\tif (existing) {\n\t\tif (!existing.isDirectory()) {\n\t\t\tthrow new Error(`Legacy archive path is not a real directory: ${path}`);\n\t\t}\n\t\treturn;\n\t}\n\ttry {\n\t\tawait mkdir(path, { mode: 0o700 });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\tconst raced = await optionalStat(path);\n\t\tif (!raced?.isDirectory()) {\n\t\t\tthrow new Error(`Legacy archive path is not a real directory: ${path}`);\n\t\t}\n\t}\n}\n\nasync function verifyMovedLegacyFolder(\n\tname: string,\n\tarchivePath: string,\n): Promise<LegacySkillCleanupResult> {\n\tlet verified = await inspectLegacyFolder(name, archivePath);\n\tfor (\n\t\tlet attempt = 1;\n\t\tattempt < POST_MOVE_VERIFICATION_ATTEMPTS && verified.status !== \"eligible\";\n\t\tattempt += 1\n\t) {\n\t\t// Windows may briefly report a just-renamed directory as missing or\n\t\t// inaccessible while a competing inspection releases its file handles.\n\t\t// Retrying never weakens cleanup safety: only a complete byte-pristine\n\t\t// inspection can return eligible, while persistent edits still quarantine.\n\t\tawait sleep(POST_MOVE_VERIFICATION_RETRY_MS * attempt);\n\t\tverified = await inspectLegacyFolder(name, archivePath);\n\t}\n\treturn verified;\n}\n\nexport async function cleanupLegacySkills(options?: {\n\thome?: string;\n\tapply?: boolean;\n\t/** @internal Deterministic race-testing seam; package consumers should omit it. */\n\tafterQuarantine?: (context: {\n\t\tname: string;\n\t\tpath: string;\n\t\tarchivePath: string;\n\t}) => Promise<void>;\n}): Promise<LegacyCleanupReport> {\n\tconst home = options?.home ?? configuredHome();\n\tconst root = resolveLegacySkillsRoot(home);\n\tconst archiveRoot = resolveLegacyArchiveRoot(home);\n\tconst apply = options?.apply === true;\n\tconst results: LegacySkillCleanupResult[] = [];\n\n\tlet archiveReady = false;\n\tfor (const name of FLOW_GUIDANCE_TOPICS) {\n\t\tconst path = join(root, name);\n\t\tconst inspected = await inspectLegacyFolder(name, path);\n\t\tif (!apply || inspected.status !== \"eligible\") {\n\t\t\tresults.push(inspected);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!archiveReady) {\n\t\t\tawait ensureRealArchiveRoot(archiveRoot);\n\t\t\tarchiveReady = true;\n\t\t}\n\t\tconst archivePath = join(\n\t\t\tarchiveRoot,\n\t\t\t`${name}-${new Date().toISOString().replaceAll(\":\", \"-\")}-${crypto.randomUUID()}`,\n\t\t);\n\t\ttry {\n\t\t\tawait rename(path, archivePath);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tstatus: \"refused\",\n\t\t\t\treason: \"folder changed while cleanup was running\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tawait options?.afterQuarantine?.({ name, path, archivePath });\n\t\tconst verified = await verifyMovedLegacyFolder(name, archivePath);\n\t\tif (verified.status === \"absent\") {\n\t\t\t// On Windows, two concurrent path-based renames can both report success\n\t\t\t// while the later rename relocates the same directory again. Do not claim\n\t\t\t// that our now-missing destination is quarantined; the competing cleanup\n\t\t\t// owns verification of the final archive path.\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tstatus: \"refused\",\n\t\t\t\treason:\n\t\t\t\t\t\"archive moved again while cleanup was running; inspect the legacy archive root\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (verified.status !== \"eligible\") {\n\t\t\tresults.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tstatus: \"quarantined\",\n\t\t\t\treason:\n\t\t\t\t\t\"folder changed while cleanup was running; preserved for manual recovery\",\n\t\t\t\tarchivePath,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tresults.push({\n\t\t\tname,\n\t\t\tpath,\n\t\t\tstatus: \"archived\",\n\t\t\tarchivePath,\n\t\t});\n\t}\n\n\treturn {\n\t\tmode: apply ? \"apply\" : \"dry-run\",\n\t\troot,\n\t\tarchiveRoot,\n\t\tresults,\n\t};\n}\n",
|
|
6
6
|
"export const FLOW_GUIDANCE_TOPICS = [\n\t\"flow\",\n\t\"flow-plan\",\n\t\"flow-run\",\n\t\"flow-test\",\n\t\"flow-review\",\n\t\"flow-deslop\",\n\t\"flow-ui-quality\",\n\t\"flow-commit\",\n] as const;\n\nexport type FlowGuidanceTopic = (typeof FLOW_GUIDANCE_TOPICS)[number];\n\nexport const FLOW_GUIDANCE_IDS = [\n\t\"flow\",\n\t\"flow/references/recovery-playbook.md\",\n\t\"flow/references/parallel-orchestration.md\",\n\t\"flow/references/parallel-decision.md\",\n\t\"flow/references/parallel-manifest.md\",\n\t\"flow/references/parallel-execution.md\",\n\t\"flow/references/parallel-synthesis.md\",\n\t\"flow/references/parallel-pass-example.md\",\n\t\"flow/references/handoff-format.md\",\n\t\"flow-plan\",\n\t\"flow-plan/references/planning-examples.md\",\n\t\"flow-plan/references/plan-quality-checklist.md\",\n\t\"flow-plan/references/parallel-discovery.md\",\n\t\"flow-run\",\n\t\"flow-run/references/validation-rubric.md\",\n\t\"flow-run/references/audit-rubric.md\",\n\t\"flow-test\",\n\t\"flow-review\",\n\t\"flow-review/references/hidden-reviewer-contract.md\",\n\t\"flow-review/references/review-rubric.md\",\n\t\"flow-deslop\",\n\t\"flow-deslop/references/smell-rubric.md\",\n\t\"flow-deslop/references/refactor-workflow.md\",\n\t\"flow-ui-quality\",\n\t\"flow-ui-quality/references/ui-rubric.md\",\n\t\"flow-ui-quality/references/visual-verification.md\",\n\t\"flow-commit\",\n] as const;\n\nexport type FlowGuidanceId = (typeof FLOW_GUIDANCE_IDS)[number];\n",
|
|
7
7
|
"import { createRequire } from \"node:module\";\n\nexport function resolveFlowPluginVersion(): string {\n\ttry {\n\t\tconst require = createRequire(import.meta.url);\n\t\tconst manifest = require(\"../package.json\") as { version?: string };\n\t\tif (manifest.version) return manifest.version;\n\t} catch {\n\t\t// Fall through to the development sentinel.\n\t}\n\treturn \"0.0.0\";\n}\n",
|
|
8
8
|
"import {\n\tcleanupLegacySkills,\n\ttype LegacyCleanupReport,\n} from \"./distribution/legacy-cleanup.js\";\nimport { resolveFlowPluginVersion } from \"./version.js\";\n\nfunction usage(): string {\n\treturn [\n\t\t\"usage: opencode-plugin-flow legacy-cleanup <--dry-run|--apply> [--json]\",\n\t\t\"\",\n\t\t\"commands:\",\n\t\t\" legacy-cleanup Inspect or archive marker-proven legacy global Flow skills\",\n\t\t\"\",\n\t\t\"options:\",\n\t\t\" --dry-run Report eligible folders without changing the filesystem\",\n\t\t\" --apply Move eligible folders to a recoverable archive outside skill discovery\",\n\t\t\" Cleanup never deletes legacy folders\",\n\t\t\" --json Write the report as JSON\",\n\t\t\" --help Show this help\",\n\t\t\" --version Print the plugin version\",\n\t].join(\"\\n\");\n}\n\nfunction writeReport(report: LegacyCleanupReport, json: boolean): void {\n\tif (json) {\n\t\tprocess.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n\t\treturn;\n\t}\n\tprocess.stdout.write(`Flow legacy skill cleanup (${report.mode})\\n`);\n\tprocess.stdout.write(`- legacy root: ${report.root}\\n`);\n\tprocess.stdout.write(`- archive root: ${report.archiveRoot}\\n`);\n\tfor (const result of report.results) {\n\t\tprocess.stdout.write(`- ${result.name}: ${result.status}\\n`);\n\t\tif (result.reason) process.stdout.write(` reason: ${result.reason}\\n`);\n\t\tif (result.archivePath) {\n\t\t\tconst label = result.status === \"archived\" ? \"archived\" : \"preserved\";\n\t\t\tprocess.stdout.write(` ${label} at: ${result.archivePath}\\n`);\n\t\t}\n\t}\n}\n\nasync function main(argv: string[]): Promise<void> {\n\tconst [command, ...flags] = argv.slice(2);\n\tif (command === \"--help\" || command === \"-h\") {\n\t\tprocess.stdout.write(`${usage()}\\n`);\n\t\treturn;\n\t}\n\tif (command === \"--version\" || command === \"-v\") {\n\t\tprocess.stdout.write(`${resolveFlowPluginVersion()}\\n`);\n\t\treturn;\n\t}\n\tconst knownFlags = new Set([\"--dry-run\", \"--apply\", \"--json\"]);\n\tconst validFlags = flags.every((flag) => knownFlags.has(flag));\n\tconst dryRun = flags.includes(\"--dry-run\");\n\tconst apply = flags.includes(\"--apply\");\n\tif (command !== \"legacy-cleanup\" || !validFlags || dryRun === apply) {\n\t\tprocess.stderr.write(`${usage()}\\n`);\n\t\tprocess.exitCode = 2;\n\t\treturn;\n\t}\n\tconst report = await cleanupLegacySkills({ apply });\n\twriteReport(report, flags.includes(\"--json\"));\n\tif (\n\t\tapply &&\n\t\treport.results.some((result) =>\n\t\t\t[\"refused\", \"quarantined\"].includes(result.status),\n\t\t)\n\t) {\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nmain(process.argv).catch((error) => {\n\tprocess.stderr.write(\n\t\t`${error instanceof Error ? error.message : String(error)}\\n`,\n\t);\n\tprocess.exitCode = 1;\n});\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": ";;;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AACA;AACA,uBAAS;;;ACZF,IAAM,uBAAuB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;;;ADMA,IAAM,gBAAgB;AACtB,IAAM,YAAY,UAAU,cAAc;AAC1C,IAAM,yBAAyB;AAC/B,IAAM,kCAAkC;AACxC,IAAM,kCAAkC;AACxC,IAAM,iBACL;AAsBD,SAAS,cAAc,GAAW;AAAA,EACjC,OACC,QAAQ,IAAI,MAAM,KAAK,KAAK,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ;AAAA;AAIlE,SAAS,uBAAuB,CAAC,OAAO,eAAe,GAAW;AAAA,EACxE,OAAO,KAAK,MAAM,WAAW,YAAY,QAAQ;AAAA;AAG3C,SAAS,wBAAwB,CAAC,OAAO,eAAe,GAAW;AAAA,EACzE,OAAO,KAAK,MAAM,WAAW,YAAY,oBAAoB;AAAA;AAG9D,SAAS,MAAM,CAAC,SAAyB;AAAA,EACxC,OAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA;AAGzD,SAAS,cAAc,CAAC,QAAgB,cAA8B;AAAA,EACrE,IACC,CAAC,gBACD,WAAW,YAAY,KACvB,aAAa,SAAS,IAAI,KAC1B,aACE,MAAM,GAAG,EACT,KAAK,CAAC,SAAS,CAAC,QAAQ,SAAS,OAAO,SAAS,IAAI,GACtD;AAAA,IACD,MAAM,IAAI,MAAM,uBAAuB,eAAe;AAAA,EACvD;AAAA,EACA,MAAM,WAAW,UAAU,KAAK,QAAQ,GAAG,aAAa,MAAM,GAAG,CAAC,CAAC;AAAA,EACnE,IAAI,CAAC,SAAS,WAAW,GAAG,SAAS,KAAK,GAAG;AAAA,IAC5C,MAAM,IAAI,MAAM,uBAAuB,eAAe;AAAA,EACvD;AAAA,EACA,OAAO;AAAA;AAGR,eAAe,YAAY,CAAC,MAAc;AAAA,EACzC,IAAI;AAAA,IACH,OAAO,MAAM,MAAM,MAAM,EAAE,QAAQ,MAAM,CAAC;AAAA,IACzC,OAAO,OAAO;AAAA,IACf,IAAK,MAAgC,SAAS;AAAA,MAAU,OAAO;AAAA,IAC/D,MAAM;AAAA;AAAA;AAIR,eAAe,+BAA+B,CAAC,MAA+B;AAAA,EAC7E,IAAI;AAAA,EACJ,IAAI;AAAA,IACH,MAAM,eAAe,MAAM,MAAM,IAAI;AAAA,IACrC,IAAI,aAAa,eAAe,GAAG;AAAA,MAClC,MAAM,IAAI,MAAM,0BAA0B,MAAM;AAAA,IACjD;AAAA,IACA,IAAI,CAAC,aAAa,OAAO;AAAA,MAAG,MAAM,IAAI,MAAM,uBAAuB,MAAM;AAAA,IACzE,SAAS,MAAM,KAAK,MAAM,UAAU,WAAW,SAAS;AAAA,IACxD,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,IACnC,IAAI,CAAC,SAAS,OAAO;AAAA,MAAG,MAAM,IAAI,MAAM,uBAAuB,MAAM;AAAA,IACrE,IACC,SAAS,QAAQ,aAAa,OAC9B,SAAS,QAAQ,aAAa,KAC7B;AAAA,MACD,MAAM,IAAI,MAAM,2CAA2C,MAAM;AAAA,IAClE;AAAA,IACA,OAAO,MAAM,OAAO,SAAS,EAAE,UAAU,OAAO,CAAC;AAAA,IAChD,OAAO,OAAO;AAAA,IACf,IAAK,MAAgC,SAAS,SAAS;AAAA,MACtD,MAAM,IAAI,MAAM,0BAA0B,MAAM;AAAA,IACjD;AAAA,IACA,MAAM;AAAA,YACL;AAAA,IACD,MAAM,QAAQ,MAAM;AAAA;AAAA;AAItB,SAAS,WAAW,CAAC,SAA+B;AAAA,EACnD,IAAI;AAAA,EACJ,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,MAAM,eAAe,iBAAiB,KAAK,IAAI;AAAA,IAC/C,IAAI,eAAe,IAAI;AAAA,MACtB,IAAI;AAAA,QAAS,MAAM,IAAI,MAAM,oCAAoC;AAAA,MACjE,UAAU,aAAa;AAAA,MACvB;AAAA,IACD;AAAA,IACA,MAAM,YACL,oCAAoC,KAAK,IAAI,KAC7C,oCAAoC,KAAK,IAAI;AAAA,IAC9C,IAAI,YAAY,MAAM,UAAU,IAAI;AAAA,MACnC,IAAI,MAAM,IAAI,UAAU,EAAE,GAAG;AAAA,QAC5B,MAAM,IAAI,MAAM,mCAAmC,UAAU,KAAK;AAAA,MACnE;AAAA,MACA,MAAM,IAAI,UAAU,IAAI,UAAU,EAAE;AAAA,MACpC;AAAA,IACD;AAAA,IACA,MAAM,eAAe,+BAA+B,KAAK,IAAI;AAAA,IAC7D,IAAI,eAAe,MAAM,CAAC,MAAM,IAAI,UAAU,GAAG;AAAA,MAChD,MAAM,IAAI,YAAY,aAAa,EAAE;AAAA,MACrC;AAAA,IACD;AAAA,IACA,MAAM,IAAI,MAAM,qCAAqC,OAAO;AAAA,EAC7D;AAAA,EACA,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,uBAAuB;AAAA,EACrD,IAAI,CAAC,MAAM,IAAI,UAAU;AAAA,IAAG,MAAM,IAAI,MAAM,8BAA8B;AAAA,EAC1E,OAAO,EAAE,SAAS,MAAM;AAAA;AAGzB,SAAS,4BAA4B,CAAC,SAAuB;AAAA,EAC5D,MAAM,QAAQ,eAAe,KAAK,OAAO;AAAA,EACzC,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,IAAI,MACT,mBAAmB,0CACpB;AAAA,EACD;AAAA,EACA,IAAI,MAAM,OAAO,wBAAwB;AAAA,IACxC,MAAM,IAAI,MACT,mBAAmB,+DACpB;AAAA,EACD;AAAA;AAGD,SAAS,wBAAwB,CAChC,QAC2B;AAAA,EAC3B,MAAM,UAAU,IAAI,IAAyB;AAAA,IAC5C,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;AAAA,EAC9B,CAAC;AAAA,EACD,WAAW,gBAAgB,OAAO,MAAM,KAAK,GAAG;AAAA,IAC/C,MAAM,QAAQ,aAAa,MAAM,GAAG;AAAA,IACpC,IAAI,SAAS;AAAA,IACb,SAAS,QAAQ,EAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAAA,MACrD,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,CAAC;AAAA,QAAM,MAAM,IAAI,MAAM,uBAAuB,eAAe;AAAA,MACjE,MAAM,WAAW,QAAQ,IAAI,MAAM,KAAK,IAAI;AAAA,MAC5C,SAAS,IAAI,IAAI;AAAA,MACjB,QAAQ,IAAI,QAAQ,QAAQ;AAAA,MAC5B,IAAI,QAAQ,MAAM,SAAS,GAAG;AAAA,QAC7B,SAAS,SAAS,GAAG,UAAU,SAAS;AAAA,QACxC,IAAI,CAAC,QAAQ,IAAI,MAAM;AAAA,UAAG,QAAQ,IAAI,QAAQ,IAAI,GAAK;AAAA,MACxD;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,eAAe,mBAAmB,CACjC,MACA,QACoC;AAAA,EACpC,MAAM,WAAW,MAAM,aAAa,MAAM;AAAA,EAC1C,IAAI,CAAC;AAAA,IAAU,OAAO,EAAE,MAAM,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC7D,IAAI,CAAC,SAAS,YAAY,GAAG;AAAA,IAC5B,OAAO;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACT;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,aAAa,KAAK,QAAQ,aAAa;AAAA,IAC7C,MAAM,SAAS,YACd,MAAM,gCAAgC,UAAU,CACjD;AAAA,IACA,6BAA6B,OAAO,OAAO;AAAA,IAC3C,MAAM,cAAc,yBAAyB,MAAM;AAAA,IACnD,YAAY,mBAAmB,oBAAoB,aAAa;AAAA,MAC/D,MAAM,YAAY,oBACf,eAAe,QAAQ,iBAAiB,IACxC;AAAA,MACH,MAAM,oBAAoB,MAAM,aAAa,SAAS;AAAA,MACtD,IAAI,CAAC,mBAAmB,YAAY,GAAG;AAAA,QACtC,MAAM,IAAI,MAAM,4BAA4B,qBAAqB,KAAK;AAAA,MACvE;AAAA,MACA,MAAM,gBAAgB,MAAM,QAAQ,SAAS;AAAA,MAC7C,MAAM,aAAa,cAAc,OAChC,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CACtC;AAAA,MACA,MAAM,UAAU,CAAC,GAAG,eAAe,EAAE,OACpC,CAAC,UAAU,CAAC,cAAc,SAAS,KAAK,CACzC;AAAA,MACA,IAAI,WAAW,SAAS,KAAK,QAAQ,SAAS,GAAG;AAAA,QAChD,MAAM,IAAI,MACT;AAAA,UACC,WAAW,SAAS,IACjB,uBAAuB,WAAW,KAAK,IAAI,MAC3C;AAAA,UACH,QAAQ,SAAS,IAAI,oBAAoB,QAAQ,KAAK,IAAI,MAAM;AAAA,QACjE,EACE,OAAO,OAAO,EACd,KAAK,IAAI,CACZ;AAAA,MACD;AAAA,IACD;AAAA,IACA,YAAY,cAAc,iBAAiB,OAAO,OAAO;AAAA,MACxD,MAAM,OAAO,eAAe,QAAQ,YAAY;AAAA,MAChD,MAAM,UAAU,MAAM,gCAAgC,IAAI;AAAA,MAC1D,IAAI,OAAO,OAAO,MAAM,cAAc;AAAA,QACrC,MAAM,IAAI,MAAM,wBAAwB,cAAc;AAAA,MACvD;AAAA,IACD;AAAA,IACA,OAAO;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,IACT;AAAA,IACC,OAAO,OAAO;AAAA,IACf,OAAO;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIF,eAAe,qBAAqB,CAAC,MAA6B;AAAA,EACjE,MAAM,WAAW,MAAM,aAAa,IAAI;AAAA,EACxC,IAAI,UAAU;AAAA,IACb,IAAI,CAAC,SAAS,YAAY,GAAG;AAAA,MAC5B,MAAM,IAAI,MAAM,gDAAgD,MAAM;AAAA,IACvE;AAAA,IACA;AAAA,EACD;AAAA,EACA,IAAI;AAAA,IACH,MAAM,MAAM,MAAM,EAAE,MAAM,IAAM,CAAC;AAAA,IAChC,OAAO,OAAO;AAAA,IACf,IAAK,MAAgC,SAAS;AAAA,MAAU,MAAM;AAAA,IAC9D,MAAM,QAAQ,MAAM,aAAa,IAAI;AAAA,IACrC,IAAI,CAAC,OAAO,YAAY,GAAG;AAAA,MAC1B,MAAM,IAAI,MAAM,gDAAgD,MAAM;AAAA,IACvE;AAAA;AAAA;AAIF,eAAe,uBAAuB,CACrC,MACA,aACoC;AAAA,EACpC,IAAI,WAAW,MAAM,oBAAoB,MAAM,WAAW;AAAA,EAC1D,SACK,UAAU,EACd,UAAU,mCAAmC,SAAS,WAAW,YACjE,WAAW,GACV;AAAA,IAKD,MAAM,MAAM,kCAAkC,OAAO;AAAA,IACrD,WAAW,MAAM,oBAAoB,MAAM,WAAW;AAAA,EACvD;AAAA,EACA,OAAO;AAAA;AAGR,eAAsB,mBAAmB,CAAC,SAST;AAAA,EAChC,MAAM,OAAO,SAAS,QAAQ,eAAe;AAAA,EAC7C,MAAM,OAAO,wBAAwB,IAAI;AAAA,EACzC,MAAM,cAAc,yBAAyB,IAAI;AAAA,EACjD,MAAM,QAAQ,SAAS,UAAU;AAAA,EACjC,MAAM,UAAsC,CAAC;AAAA,EAE7C,IAAI,eAAe;AAAA,EACnB,WAAW,QAAQ,sBAAsB;AAAA,IACxC,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,IAC5B,MAAM,YAAY,MAAM,oBAAoB,MAAM,IAAI;AAAA,IACtD,IAAI,CAAC,SAAS,UAAU,WAAW,YAAY;AAAA,MAC9C,QAAQ,KAAK,SAAS;AAAA,MACtB;AAAA,IACD;AAAA,IACA,IAAI,CAAC,cAAc;AAAA,MAClB,MAAM,sBAAsB,WAAW;AAAA,MACvC,eAAe;AAAA,IAChB;AAAA,IACA,MAAM,cAAc,KACnB,aACA,GAAG,QAAQ,IAAI,KAAK,EAAE,YAAY,EAAE,WAAW,KAAK,GAAG,KAAK,OAAO,WAAW,GAC/E;AAAA,IACA,IAAI;AAAA,MACH,MAAM,OAAO,MAAM,WAAW;AAAA,MAC7B,OAAO,OAAO;AAAA,MACf,IAAK,MAAgC,SAAS;AAAA,QAAU,MAAM;AAAA,MAC9D,QAAQ,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACT,CAAC;AAAA,MACD;AAAA;AAAA,IAED,MAAM,SAAS,kBAAkB,EAAE,MAAM,MAAM,YAAY,CAAC;AAAA,IAC5D,MAAM,WAAW,MAAM,wBAAwB,MAAM,WAAW;AAAA,IAChE,IAAI,SAAS,WAAW,YAAY;AAAA,MACnC,QAAQ,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QACC;AAAA,QACD;AAAA,MACD,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IACA,QAAQ,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACN,MAAM,QAAQ,UAAU;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "87C725E49214F7FF64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|