@senior-skills/core 1.0.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.
- package/dist/application/agent-selection.d.ts +42 -0
- package/dist/application/agent-selection.d.ts.map +1 -0
- package/dist/application/agent-selection.js +143 -0
- package/dist/application/agent-selection.js.map +1 -0
- package/dist/application/apply-skill-updates.d.ts +10 -0
- package/dist/application/apply-skill-updates.d.ts.map +1 -0
- package/dist/application/apply-skill-updates.js +75 -0
- package/dist/application/apply-skill-updates.js.map +1 -0
- package/dist/application/check-updates.d.ts +40 -0
- package/dist/application/check-updates.d.ts.map +1 -0
- package/dist/application/check-updates.js +130 -0
- package/dist/application/check-updates.js.map +1 -0
- package/dist/application/context.d.ts +28 -0
- package/dist/application/context.d.ts.map +1 -0
- package/dist/application/context.js +2 -0
- package/dist/application/context.js.map +1 -0
- package/dist/application/create-skill.d.ts +33 -0
- package/dist/application/create-skill.d.ts.map +1 -0
- package/dist/application/create-skill.js +58 -0
- package/dist/application/create-skill.js.map +1 -0
- package/dist/application/diagnose.d.ts +44 -0
- package/dist/application/diagnose.d.ts.map +1 -0
- package/dist/application/diagnose.js +228 -0
- package/dist/application/diagnose.js.map +1 -0
- package/dist/application/install-skills.d.ts +59 -0
- package/dist/application/install-skills.d.ts.map +1 -0
- package/dist/application/install-skills.js +191 -0
- package/dist/application/install-skills.js.map +1 -0
- package/dist/application/list-installed.d.ts +39 -0
- package/dist/application/list-installed.d.ts.map +1 -0
- package/dist/application/list-installed.js +68 -0
- package/dist/application/list-installed.js.map +1 -0
- package/dist/application/package-loader.d.ts +42 -0
- package/dist/application/package-loader.d.ts.map +1 -0
- package/dist/application/package-loader.js +320 -0
- package/dist/application/package-loader.js.map +1 -0
- package/dist/application/publish-skill.d.ts +41 -0
- package/dist/application/publish-skill.d.ts.map +1 -0
- package/dist/application/publish-skill.js +112 -0
- package/dist/application/publish-skill.js.map +1 -0
- package/dist/application/remove-skills.d.ts +34 -0
- package/dist/application/remove-skills.d.ts.map +1 -0
- package/dist/application/remove-skills.js +95 -0
- package/dist/application/remove-skills.js.map +1 -0
- package/dist/application/resolution-source.d.ts +25 -0
- package/dist/application/resolution-source.d.ts.map +1 -0
- package/dist/application/resolution-source.js +60 -0
- package/dist/application/resolution-source.js.map +1 -0
- package/dist/application/resolve-suggestions.d.ts +17 -0
- package/dist/application/resolve-suggestions.d.ts.map +1 -0
- package/dist/application/resolve-suggestions.js +77 -0
- package/dist/application/resolve-suggestions.js.map +1 -0
- package/dist/application/search-skills.d.ts +36 -0
- package/dist/application/search-skills.d.ts.map +1 -0
- package/dist/application/search-skills.js +78 -0
- package/dist/application/search-skills.js.map +1 -0
- package/dist/application/update-skills.d.ts +55 -0
- package/dist/application/update-skills.d.ts.map +1 -0
- package/dist/application/update-skills.js +115 -0
- package/dist/application/update-skills.js.map +1 -0
- package/dist/application/validate-package.d.ts +27 -0
- package/dist/application/validate-package.d.ts.map +1 -0
- package/dist/application/validate-package.js +165 -0
- package/dist/application/validate-package.js.map +1 -0
- package/dist/application/workspace.d.ts +22 -0
- package/dist/application/workspace.d.ts.map +1 -0
- package/dist/application/workspace.js +66 -0
- package/dist/application/workspace.js.map +1 -0
- package/dist/domain/agent.d.ts +89 -0
- package/dist/domain/agent.d.ts.map +1 -0
- package/dist/domain/agent.js +20 -0
- package/dist/domain/agent.js.map +1 -0
- package/dist/domain/errors.d.ts +91 -0
- package/dist/domain/errors.d.ts.map +1 -0
- package/dist/domain/errors.js +121 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/integrity.d.ts +19 -0
- package/dist/domain/integrity.d.ts.map +1 -0
- package/dist/domain/integrity.js +0 -0
- package/dist/domain/integrity.js.map +1 -0
- package/dist/domain/js-literal.d.ts +22 -0
- package/dist/domain/js-literal.d.ts.map +1 -0
- package/dist/domain/js-literal.js +221 -0
- package/dist/domain/js-literal.js.map +1 -0
- package/dist/domain/lockfile.d.ts +36 -0
- package/dist/domain/lockfile.d.ts.map +1 -0
- package/dist/domain/lockfile.js +148 -0
- package/dist/domain/lockfile.js.map +1 -0
- package/dist/domain/manifest.d.ts +96 -0
- package/dist/domain/manifest.d.ts.map +1 -0
- package/dist/domain/manifest.js +448 -0
- package/dist/domain/manifest.js.map +1 -0
- package/dist/domain/path-safety.d.ts +19 -0
- package/dist/domain/path-safety.d.ts.map +1 -0
- package/dist/domain/path-safety.js +125 -0
- package/dist/domain/path-safety.js.map +1 -0
- package/dist/domain/posix-path.d.ts +28 -0
- package/dist/domain/posix-path.d.ts.map +1 -0
- package/dist/domain/posix-path.js +84 -0
- package/dist/domain/posix-path.js.map +1 -0
- package/dist/domain/receipt.d.ts +41 -0
- package/dist/domain/receipt.d.ts.map +1 -0
- package/dist/domain/receipt.js +93 -0
- package/dist/domain/receipt.js.map +1 -0
- package/dist/domain/registry-index.d.ts +41 -0
- package/dist/domain/registry-index.d.ts.map +1 -0
- package/dist/domain/registry-index.js +150 -0
- package/dist/domain/registry-index.js.map +1 -0
- package/dist/domain/resolver.d.ts +54 -0
- package/dist/domain/resolver.d.ts.map +1 -0
- package/dist/domain/resolver.js +238 -0
- package/dist/domain/resolver.js.map +1 -0
- package/dist/domain/skill-document.d.ts +16 -0
- package/dist/domain/skill-document.d.ts.map +1 -0
- package/dist/domain/skill-document.js +60 -0
- package/dist/domain/skill-document.js.map +1 -0
- package/dist/domain/skill-package.d.ts +43 -0
- package/dist/domain/skill-package.d.ts.map +1 -0
- package/dist/domain/skill-package.js +63 -0
- package/dist/domain/skill-package.js.map +1 -0
- package/dist/domain/skill-ref.d.ts +30 -0
- package/dist/domain/skill-ref.d.ts.map +1 -0
- package/dist/domain/skill-ref.js +119 -0
- package/dist/domain/skill-ref.js.map +1 -0
- package/dist/domain/validation.d.ts +30 -0
- package/dist/domain/validation.d.ts.map +1 -0
- package/dist/domain/validation.js +32 -0
- package/dist/domain/validation.js.map +1 -0
- package/dist/domain/version.d.ts +23 -0
- package/dist/domain/version.d.ts.map +1 -0
- package/dist/domain/version.js +81 -0
- package/dist/domain/version.js.map +1 -0
- package/dist/domain/workflow-document.d.ts +23 -0
- package/dist/domain/workflow-document.d.ts.map +1 -0
- package/dist/domain/workflow-document.js +56 -0
- package/dist/domain/workflow-document.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/agent-adapter.d.ts +65 -0
- package/dist/ports/agent-adapter.d.ts.map +1 -0
- package/dist/ports/agent-adapter.js +28 -0
- package/dist/ports/agent-adapter.js.map +1 -0
- package/dist/ports/config-store.d.ts +27 -0
- package/dist/ports/config-store.d.ts.map +1 -0
- package/dist/ports/config-store.js +2 -0
- package/dist/ports/config-store.js.map +1 -0
- package/dist/ports/infrastructure.d.ts +123 -0
- package/dist/ports/infrastructure.d.ts.map +1 -0
- package/dist/ports/infrastructure.js +9 -0
- package/dist/ports/infrastructure.js.map +1 -0
- package/dist/ports/installation.d.ts +86 -0
- package/dist/ports/installation.d.ts.map +1 -0
- package/dist/ports/installation.js +2 -0
- package/dist/ports/installation.js.map +1 -0
- package/dist/ports/skill-registry.d.ts +74 -0
- package/dist/ports/skill-registry.d.ts.map +1 -0
- package/dist/ports/skill-registry.js +2 -0
- package/dist/ports/skill-registry.js.map +1 -0
- package/dist/ports/updates.d.ts +31 -0
- package/dist/ports/updates.d.ts.map +1 -0
- package/dist/ports/updates.js +4 -0
- package/dist/ports/updates.js.map +1 -0
- package/dist/testing/doubles.d.ts +127 -0
- package/dist/testing/doubles.d.ts.map +1 -0
- package/dist/testing/doubles.js +299 -0
- package/dist/testing/doubles.js.map +1 -0
- package/dist/testing/in-memory-file-system.d.ts +61 -0
- package/dist/testing/in-memory-file-system.d.ts.map +1 -0
- package/dist/testing/in-memory-file-system.js +297 -0
- package/dist/testing/in-memory-file-system.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posix-path.d.ts","sourceRoot":"","sources":["../../src/domain/posix-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqB/C;AAED,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAExD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAIzD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAKjE;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal POSIX-style path helper.
|
|
3
|
+
*
|
|
4
|
+
* The domain keeps its own copy rather than importing `node:path` so that `@senior-skills/core`
|
|
5
|
+
* stays runtime-free: package-relative paths are always POSIX regardless of the host OS, and
|
|
6
|
+
* a domain that imported `node:path` would silently behave differently on Windows.
|
|
7
|
+
*
|
|
8
|
+
* Filesystem-absolute paths are the concern of the `FileSystem` port, not of this module.
|
|
9
|
+
*/
|
|
10
|
+
/** Normalise separators and collapse `.` / `..` segments without touching the filesystem. */
|
|
11
|
+
export function normalize(input) {
|
|
12
|
+
const isAbsolute = input.startsWith('/');
|
|
13
|
+
const segments = [];
|
|
14
|
+
for (const segment of input.replace(/\\/g, '/').split('/')) {
|
|
15
|
+
if (segment === '' || segment === '.')
|
|
16
|
+
continue;
|
|
17
|
+
if (segment === '..') {
|
|
18
|
+
const last = segments[segments.length - 1];
|
|
19
|
+
if (segments.length > 0 && last !== '..') {
|
|
20
|
+
segments.pop();
|
|
21
|
+
}
|
|
22
|
+
else if (!isAbsolute) {
|
|
23
|
+
segments.push('..');
|
|
24
|
+
}
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
segments.push(segment);
|
|
28
|
+
}
|
|
29
|
+
const joined = segments.join('/');
|
|
30
|
+
if (isAbsolute)
|
|
31
|
+
return `/${joined}`;
|
|
32
|
+
return joined === '' ? '.' : joined;
|
|
33
|
+
}
|
|
34
|
+
export function join(...parts) {
|
|
35
|
+
return normalize(parts.filter((part) => part !== '').join('/'));
|
|
36
|
+
}
|
|
37
|
+
export function dirname(input) {
|
|
38
|
+
const normalized = normalize(input);
|
|
39
|
+
const index = normalized.lastIndexOf('/');
|
|
40
|
+
if (index === -1)
|
|
41
|
+
return '.';
|
|
42
|
+
if (index === 0)
|
|
43
|
+
return '/';
|
|
44
|
+
return normalized.slice(0, index);
|
|
45
|
+
}
|
|
46
|
+
export function basename(input) {
|
|
47
|
+
const normalized = normalize(input);
|
|
48
|
+
const index = normalized.lastIndexOf('/');
|
|
49
|
+
return index === -1 ? normalized : normalized.slice(index + 1);
|
|
50
|
+
}
|
|
51
|
+
export function extname(input) {
|
|
52
|
+
const base = basename(input);
|
|
53
|
+
const index = base.lastIndexOf('.');
|
|
54
|
+
return index <= 0 ? '' : base.slice(index);
|
|
55
|
+
}
|
|
56
|
+
/** Split into non-empty segments. `''` and `'.'` yield an empty list. */
|
|
57
|
+
export function segments(input) {
|
|
58
|
+
const normalized = normalize(input);
|
|
59
|
+
if (normalized === '.' || normalized === '')
|
|
60
|
+
return [];
|
|
61
|
+
return normalized.replace(/^\//, '').split('/').filter(Boolean);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* True when `candidate` stays inside `root`. Both are treated as POSIX-relative paths;
|
|
65
|
+
* this is a *lexical* check and is intentionally conservative — the filesystem-level
|
|
66
|
+
* check (symlinks, real paths) lives in the installer.
|
|
67
|
+
*/
|
|
68
|
+
export function isInside(root, candidate) {
|
|
69
|
+
const rootSegments = segments(root);
|
|
70
|
+
const candidateSegments = segments(candidate);
|
|
71
|
+
if (candidateSegments.length < rootSegments.length)
|
|
72
|
+
return false;
|
|
73
|
+
return rootSegments.every((segment, index) => candidateSegments[index] === segment);
|
|
74
|
+
}
|
|
75
|
+
/** True when the path escapes its own root, i.e. normalising leaves a leading `..`. */
|
|
76
|
+
export function escapesRoot(input) {
|
|
77
|
+
const normalized = normalize(input);
|
|
78
|
+
return normalized === '..' || normalized.startsWith('../');
|
|
79
|
+
}
|
|
80
|
+
/** Convert an OS-native path to the POSIX form used inside packages. */
|
|
81
|
+
export function toPosix(input) {
|
|
82
|
+
return input.replace(/\\/g, '/');
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=posix-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posix-path.js","sourceRoot":"","sources":["../../src/domain/posix-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SemanticVersion } from './version.ts';
|
|
2
|
+
import type { AgentId, InstallScope } from './agent.ts';
|
|
3
|
+
/**
|
|
4
|
+
* An install receipt is how the tool knows what it owns.
|
|
5
|
+
*
|
|
6
|
+
* The brief's rule — "do not delete files that were not installed by the tool" — is only
|
|
7
|
+
* enforceable with a record of exactly which relative paths were written and what they
|
|
8
|
+
* hashed to. Uninstall consults this; a file whose hash has drifted is treated as
|
|
9
|
+
* user-modified and preserved unless `--force`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const RECEIPT_DIRNAME = ".senior-skills";
|
|
12
|
+
export declare const CURRENT_RECEIPT_VERSION = 1;
|
|
13
|
+
export interface ReceiptFile {
|
|
14
|
+
/** POSIX path relative to the installed skill directory. */
|
|
15
|
+
readonly path: string;
|
|
16
|
+
readonly integrity: string;
|
|
17
|
+
readonly size: number;
|
|
18
|
+
}
|
|
19
|
+
export interface InstallReceipt {
|
|
20
|
+
readonly receiptVersion: number;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly version: SemanticVersion;
|
|
23
|
+
readonly agentId: AgentId;
|
|
24
|
+
readonly scope: InstallScope;
|
|
25
|
+
readonly registry: string;
|
|
26
|
+
readonly resolved: string;
|
|
27
|
+
/** Integrity of the neutral package, matching the lockfile and registry index. */
|
|
28
|
+
readonly integrity: string;
|
|
29
|
+
readonly installedAt: string;
|
|
30
|
+
readonly installedWith: string;
|
|
31
|
+
/** Absolute path of the installed directory at install time, for diagnostics. */
|
|
32
|
+
readonly directory: string;
|
|
33
|
+
readonly files: readonly ReceiptFile[];
|
|
34
|
+
/** Skills installed only because this one required them. */
|
|
35
|
+
readonly dependencyOf: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
export declare function parseReceipt(text: string, source: string): InstallReceipt;
|
|
38
|
+
export declare function stringifyReceipt(receipt: InstallReceipt): string;
|
|
39
|
+
/** Where a receipt lives, relative to the agent's skill root. */
|
|
40
|
+
export declare function receiptPath(skillName: string): string;
|
|
41
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/domain/receipt.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAChD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAiEzE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAoBhE;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { AgentSkillsError, ErrorCode } from "./errors.js";
|
|
2
|
+
import { parseVersion } from "./version.js";
|
|
3
|
+
/**
|
|
4
|
+
* An install receipt is how the tool knows what it owns.
|
|
5
|
+
*
|
|
6
|
+
* The brief's rule — "do not delete files that were not installed by the tool" — is only
|
|
7
|
+
* enforceable with a record of exactly which relative paths were written and what they
|
|
8
|
+
* hashed to. Uninstall consults this; a file whose hash has drifted is treated as
|
|
9
|
+
* user-modified and preserved unless `--force`.
|
|
10
|
+
*/
|
|
11
|
+
export const RECEIPT_DIRNAME = '.senior-skills';
|
|
12
|
+
export const CURRENT_RECEIPT_VERSION = 1;
|
|
13
|
+
export function parseReceipt(text, source) {
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = JSON.parse(text);
|
|
17
|
+
}
|
|
18
|
+
catch (cause) {
|
|
19
|
+
throw new AgentSkillsError(ErrorCode.IO_ERROR, `Corrupted install receipt: ${source}`, {
|
|
20
|
+
hints: ['Run `senior-skills doctor` to list corrupted metadata'],
|
|
21
|
+
cause,
|
|
22
|
+
data: { source },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
26
|
+
throw new AgentSkillsError(ErrorCode.IO_ERROR, `Corrupted install receipt: ${source}`, {
|
|
27
|
+
data: { source },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const doc = raw;
|
|
31
|
+
const required = (key) => {
|
|
32
|
+
const value = doc[key];
|
|
33
|
+
if (typeof value !== 'string' || value === '') {
|
|
34
|
+
throw new AgentSkillsError(ErrorCode.IO_ERROR, `Install receipt ${source} is missing "${key}"`, { data: { source, field: key } });
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
};
|
|
38
|
+
const files = [];
|
|
39
|
+
if (Array.isArray(doc['files'])) {
|
|
40
|
+
for (const entry of doc['files']) {
|
|
41
|
+
if (entry === null || typeof entry !== 'object')
|
|
42
|
+
continue;
|
|
43
|
+
const record = entry;
|
|
44
|
+
if (typeof record['path'] !== 'string' || typeof record['integrity'] !== 'string')
|
|
45
|
+
continue;
|
|
46
|
+
files.push({
|
|
47
|
+
path: record['path'],
|
|
48
|
+
integrity: record['integrity'],
|
|
49
|
+
size: typeof record['size'] === 'number' ? record['size'] : 0,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const scope = doc['scope'];
|
|
54
|
+
return {
|
|
55
|
+
receiptVersion: typeof doc['receiptVersion'] === 'number' ? doc['receiptVersion'] : 1,
|
|
56
|
+
name: required('name'),
|
|
57
|
+
version: parseVersion(required('version'), source),
|
|
58
|
+
agentId: required('agentId'),
|
|
59
|
+
scope: scope === 'project' ? 'project' : 'global',
|
|
60
|
+
registry: typeof doc['registry'] === 'string' ? doc['registry'] : 'unknown',
|
|
61
|
+
resolved: typeof doc['resolved'] === 'string' ? doc['resolved'] : '',
|
|
62
|
+
integrity: typeof doc['integrity'] === 'string' ? doc['integrity'] : '',
|
|
63
|
+
installedAt: typeof doc['installedAt'] === 'string' ? doc['installedAt'] : '',
|
|
64
|
+
installedWith: typeof doc['installedWith'] === 'string' ? doc['installedWith'] : '',
|
|
65
|
+
directory: typeof doc['directory'] === 'string' ? doc['directory'] : '',
|
|
66
|
+
files,
|
|
67
|
+
dependencyOf: Array.isArray(doc['dependencyOf'])
|
|
68
|
+
? doc['dependencyOf'].filter((item) => typeof item === 'string')
|
|
69
|
+
: [],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function stringifyReceipt(receipt) {
|
|
73
|
+
return `${JSON.stringify({
|
|
74
|
+
receiptVersion: receipt.receiptVersion,
|
|
75
|
+
name: receipt.name,
|
|
76
|
+
version: receipt.version,
|
|
77
|
+
agentId: receipt.agentId,
|
|
78
|
+
scope: receipt.scope,
|
|
79
|
+
registry: receipt.registry,
|
|
80
|
+
resolved: receipt.resolved,
|
|
81
|
+
integrity: receipt.integrity,
|
|
82
|
+
installedAt: receipt.installedAt,
|
|
83
|
+
installedWith: receipt.installedWith,
|
|
84
|
+
directory: receipt.directory,
|
|
85
|
+
dependencyOf: [...receipt.dependencyOf].sort(),
|
|
86
|
+
files: [...receipt.files].sort((a, b) => a.path.localeCompare(b.path)),
|
|
87
|
+
}, null, 2)}\n`;
|
|
88
|
+
}
|
|
89
|
+
/** Where a receipt lives, relative to the agent's skill root. */
|
|
90
|
+
export function receiptPath(skillName) {
|
|
91
|
+
return `${RECEIPT_DIRNAME}/receipts/${skillName}.json`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/domain/receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SemanticVersion } from './version.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The registry index is the one document every registry kind must serve. It is
|
|
4
|
+
* denormalised so `search` and `info` work from a single cached fetch.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CURRENT_INDEX_VERSION = 1;
|
|
7
|
+
export type RegistryKind = 'local' | 'git' | 'http';
|
|
8
|
+
export interface IndexVersionEntry {
|
|
9
|
+
readonly version: SemanticVersion;
|
|
10
|
+
/** Package location relative to the registry root. Mutually exclusive with `tarball`. */
|
|
11
|
+
readonly path?: string;
|
|
12
|
+
/** Absolute URL of a `.tar.gz`. Mutually exclusive with `path`. */
|
|
13
|
+
readonly tarball?: string;
|
|
14
|
+
readonly integrity?: string;
|
|
15
|
+
readonly publishedAt?: string;
|
|
16
|
+
readonly deprecated: boolean;
|
|
17
|
+
readonly deprecationReason?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface IndexSkillEntry {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly description: string;
|
|
22
|
+
readonly keywords: readonly string[];
|
|
23
|
+
readonly latest: SemanticVersion;
|
|
24
|
+
/** Sorted newest-first. */
|
|
25
|
+
readonly versions: readonly IndexVersionEntry[];
|
|
26
|
+
}
|
|
27
|
+
export interface RegistryIndex {
|
|
28
|
+
readonly schemaVersion: number;
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly updatedAt?: string;
|
|
31
|
+
readonly skills: readonly IndexSkillEntry[];
|
|
32
|
+
}
|
|
33
|
+
export interface ParseIndexOptions {
|
|
34
|
+
readonly source?: string;
|
|
35
|
+
/** Registry name to assume when the document omits one. */
|
|
36
|
+
readonly fallbackName?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function parseRegistryIndex(text: string, options?: ParseIndexOptions): RegistryIndex;
|
|
39
|
+
export declare function stringifyRegistryIndex(index: RegistryIndex): string;
|
|
40
|
+
export declare function findIndexEntry(index: RegistryIndex, name: string): IndexSkillEntry | undefined;
|
|
41
|
+
//# sourceMappingURL=registry-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-index.d.ts","sourceRoot":"","sources":["../../src/domain/registry-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,aAAa,CAiE/F;AAyGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA0BnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE9F"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
2
|
+
import { AgentSkillsError, ErrorCode } from "./errors.js";
|
|
3
|
+
import { compareVersions, parseVersion } from "./version.js";
|
|
4
|
+
import { validateSkillName } from "./skill-ref.js";
|
|
5
|
+
/**
|
|
6
|
+
* The registry index is the one document every registry kind must serve. It is
|
|
7
|
+
* denormalised so `search` and `info` work from a single cached fetch.
|
|
8
|
+
*/
|
|
9
|
+
export const CURRENT_INDEX_VERSION = 1;
|
|
10
|
+
export function parseRegistryIndex(text, options = {}) {
|
|
11
|
+
const source = options.source ?? 'registry index';
|
|
12
|
+
let raw;
|
|
13
|
+
try {
|
|
14
|
+
raw = parseYaml(text);
|
|
15
|
+
}
|
|
16
|
+
catch (cause) {
|
|
17
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `Could not parse ${source}`, {
|
|
18
|
+
details: [cause instanceof Error ? cause.message : String(cause)],
|
|
19
|
+
cause,
|
|
20
|
+
data: { source },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
24
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source} must be a mapping with a "skills" list`, { data: { source } });
|
|
25
|
+
}
|
|
26
|
+
const doc = raw;
|
|
27
|
+
const schemaVersion = typeof doc['schemaVersion'] === 'number' ? doc['schemaVersion'] : 1;
|
|
28
|
+
if (schemaVersion > CURRENT_INDEX_VERSION) {
|
|
29
|
+
throw new AgentSkillsError(ErrorCode.UNSUPPORTED_SCHEMA, `${source} uses index format v${schemaVersion}; this CLI understands up to v${CURRENT_INDEX_VERSION}`, {
|
|
30
|
+
hints: ['Upgrade the CLI: npm install -g @senior-skills/cli@latest'],
|
|
31
|
+
data: { source },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const name = typeof doc['name'] === 'string' && doc['name'].trim() !== ''
|
|
35
|
+
? doc['name'].trim()
|
|
36
|
+
: (options.fallbackName ?? 'unnamed');
|
|
37
|
+
const rawSkills = doc['skills'];
|
|
38
|
+
if (rawSkills !== undefined && !Array.isArray(rawSkills)) {
|
|
39
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: "skills" must be a list`, {
|
|
40
|
+
data: { source },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const skills = [];
|
|
44
|
+
for (const entry of (rawSkills ?? [])) {
|
|
45
|
+
const skill = parseSkillEntry(entry, source);
|
|
46
|
+
if (skill !== undefined)
|
|
47
|
+
skills.push(skill);
|
|
48
|
+
}
|
|
49
|
+
skills.sort((a, b) => a.name.localeCompare(b.name));
|
|
50
|
+
return {
|
|
51
|
+
schemaVersion,
|
|
52
|
+
name,
|
|
53
|
+
...(typeof doc['updatedAt'] === 'string' ? { updatedAt: doc['updatedAt'] } : {}),
|
|
54
|
+
skills,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function parseSkillEntry(entry, source) {
|
|
58
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
59
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: each skill entry must be a mapping`, { data: { source } });
|
|
60
|
+
}
|
|
61
|
+
const record = entry;
|
|
62
|
+
const name = record['name'];
|
|
63
|
+
if (typeof name !== 'string') {
|
|
64
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: a skill entry has no name`, {
|
|
65
|
+
data: { source },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const nameProblems = validateSkillName(name);
|
|
69
|
+
if (nameProblems.length > 0) {
|
|
70
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: invalid skill name "${name}"`, { details: nameProblems.map((problem) => `- ${problem}`), data: { source, name } });
|
|
71
|
+
}
|
|
72
|
+
const rawVersions = record['versions'];
|
|
73
|
+
if (!Array.isArray(rawVersions) || rawVersions.length === 0) {
|
|
74
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: skill "${name}" has no versions`, { data: { source, name } });
|
|
75
|
+
}
|
|
76
|
+
const versions = rawVersions.map((version) => parseVersionEntry(version, name, source));
|
|
77
|
+
// Newest first, so `latest` and `info` never have to re-sort.
|
|
78
|
+
const ordered = [...versions].sort((a, b) => compareVersions(b.version, a.version));
|
|
79
|
+
const declaredLatest = record['latest'];
|
|
80
|
+
const latest = typeof declaredLatest === 'string'
|
|
81
|
+
? parseVersion(declaredLatest, `${source} ${name}.latest`)
|
|
82
|
+
: // Fall back to the newest non-deprecated version, or the newest overall.
|
|
83
|
+
(ordered.find((version) => !version.deprecated)?.version ?? ordered[0].version);
|
|
84
|
+
return {
|
|
85
|
+
name,
|
|
86
|
+
description: typeof record['description'] === 'string' ? record['description'] : '',
|
|
87
|
+
keywords: Array.isArray(record['keywords'])
|
|
88
|
+
? record['keywords'].filter((k) => typeof k === 'string')
|
|
89
|
+
: [],
|
|
90
|
+
latest,
|
|
91
|
+
versions: ordered,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function parseVersionEntry(entry, skillName, source) {
|
|
95
|
+
if (typeof entry === 'string') {
|
|
96
|
+
return { version: parseVersion(entry, `${source} ${skillName}`), deprecated: false };
|
|
97
|
+
}
|
|
98
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
99
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: version entries for "${skillName}" must be mappings`, { data: { source, name: skillName } });
|
|
100
|
+
}
|
|
101
|
+
const record = entry;
|
|
102
|
+
const version = record['version'];
|
|
103
|
+
if (typeof version !== 'string') {
|
|
104
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: a version entry for "${skillName}" has no "version"`, { data: { source, name: skillName } });
|
|
105
|
+
}
|
|
106
|
+
const path = record['path'];
|
|
107
|
+
const tarball = record['tarball'];
|
|
108
|
+
if (typeof path === 'string' && typeof tarball === 'string') {
|
|
109
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_INVALID_INDEX, `${source}: "${skillName}@${version}" declares both "path" and "tarball"`, { hints: ['Use "path" for git/local registries and "tarball" for http registries'] });
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
version: parseVersion(version, `${source} ${skillName}`),
|
|
113
|
+
...(typeof path === 'string' ? { path } : {}),
|
|
114
|
+
...(typeof tarball === 'string' ? { tarball } : {}),
|
|
115
|
+
...(typeof record['integrity'] === 'string' ? { integrity: record['integrity'] } : {}),
|
|
116
|
+
...(typeof record['publishedAt'] === 'string' ? { publishedAt: record['publishedAt'] } : {}),
|
|
117
|
+
deprecated: record['deprecated'] === true,
|
|
118
|
+
...(typeof record['deprecationReason'] === 'string'
|
|
119
|
+
? { deprecationReason: record['deprecationReason'] }
|
|
120
|
+
: {}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function stringifyRegistryIndex(index) {
|
|
124
|
+
return stringifyYaml({
|
|
125
|
+
schemaVersion: index.schemaVersion,
|
|
126
|
+
name: index.name,
|
|
127
|
+
...(index.updatedAt === undefined ? {} : { updatedAt: index.updatedAt }),
|
|
128
|
+
skills: index.skills.map((skill) => ({
|
|
129
|
+
name: skill.name,
|
|
130
|
+
description: skill.description,
|
|
131
|
+
...(skill.keywords.length > 0 ? { keywords: [...skill.keywords] } : {}),
|
|
132
|
+
latest: skill.latest,
|
|
133
|
+
versions: skill.versions.map((version) => ({
|
|
134
|
+
version: version.version,
|
|
135
|
+
...(version.path === undefined ? {} : { path: version.path }),
|
|
136
|
+
...(version.tarball === undefined ? {} : { tarball: version.tarball }),
|
|
137
|
+
...(version.integrity === undefined ? {} : { integrity: version.integrity }),
|
|
138
|
+
...(version.publishedAt === undefined ? {} : { publishedAt: version.publishedAt }),
|
|
139
|
+
...(version.deprecated ? { deprecated: true } : {}),
|
|
140
|
+
...(version.deprecationReason === undefined
|
|
141
|
+
? {}
|
|
142
|
+
: { deprecationReason: version.deprecationReason }),
|
|
143
|
+
})),
|
|
144
|
+
})),
|
|
145
|
+
}, { lineWidth: 120, singleQuote: false });
|
|
146
|
+
}
|
|
147
|
+
export function findIndexEntry(index, name) {
|
|
148
|
+
return index.skills.find((skill) => skill.name === name);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=registry-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-index.js","sourceRoot":"","sources":["../../src/domain/registry-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SkillManifest } from './manifest.ts';
|
|
2
|
+
import type { IndexVersionEntry } from './registry-index.ts';
|
|
3
|
+
import { type SkillRef } from './skill-ref.ts';
|
|
4
|
+
import { type SemanticVersion } from './version.ts';
|
|
5
|
+
/** What the resolver needs from a registry. Kept separate so the resolver stays testable. */
|
|
6
|
+
export interface ResolutionSource {
|
|
7
|
+
/**
|
|
8
|
+
* Versions of `name`. When `registry` is given the lookup is restricted to it; otherwise
|
|
9
|
+
* federation precedence decides which registry owns the name.
|
|
10
|
+
*/
|
|
11
|
+
listVersions(name: string, registry?: string): Promise<{
|
|
12
|
+
readonly registry: string;
|
|
13
|
+
readonly versions: readonly IndexVersionEntry[];
|
|
14
|
+
}>;
|
|
15
|
+
loadManifest(name: string, version: SemanticVersion, registry: string): Promise<SkillManifest>;
|
|
16
|
+
}
|
|
17
|
+
export interface ResolvedSkill {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly version: SemanticVersion;
|
|
20
|
+
readonly registry: string;
|
|
21
|
+
readonly entry: IndexVersionEntry;
|
|
22
|
+
readonly manifest: SkillManifest;
|
|
23
|
+
/** True when the user asked for this skill by name, rather than it being pulled in. */
|
|
24
|
+
readonly direct: boolean;
|
|
25
|
+
/** Names of skills that required this one. Empty for a purely direct install. */
|
|
26
|
+
readonly requiredBy: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export interface ResolutionResult {
|
|
29
|
+
/** Dependencies before dependents, so installing in order never leaves a dangling need. */
|
|
30
|
+
readonly order: readonly ResolvedSkill[];
|
|
31
|
+
readonly warnings: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ResolveOptions {
|
|
34
|
+
/** Pins that must be honoured exactly, from `skills.lock`. */
|
|
35
|
+
readonly pinned?: Readonly<Record<string, SemanticVersion>>;
|
|
36
|
+
/** Skip transitive dependencies entirely. Used by `--no-deps`-style flows and `info`. */
|
|
37
|
+
readonly skipDependencies?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Breadth-first constraint resolution without backtracking.
|
|
41
|
+
*
|
|
42
|
+
* Adding a constraint can only lower the chosen version, never raise it, so the fixed-point
|
|
43
|
+
* loop terminates; the iteration cap exists to turn a hypothetical resolver bug into a clear
|
|
44
|
+
* error rather than a hang.
|
|
45
|
+
*/
|
|
46
|
+
export declare class Resolver {
|
|
47
|
+
private readonly source;
|
|
48
|
+
constructor(source: ResolutionSource);
|
|
49
|
+
resolve(refs: readonly SkillRef[], options?: ResolveOptions): Promise<ResolutionResult>;
|
|
50
|
+
/** The first name (alphabetically, for determinism) whose choice does not satisfy its constraints. */
|
|
51
|
+
private findStale;
|
|
52
|
+
private choose;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/domain/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAU,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhG,6FAA6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;KAAE,CAAC,CAAC;IAE3F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,uFAAuF;IACvF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAYD,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,EAAE,gBAAgB;IAI9B,OAAO,CACX,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC;IAuE5B,sGAAsG;IACtG,OAAO,CAAC,SAAS;YAaH,MAAM;CA0CrB"}
|