@moorline/contracts 0.0.1

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.
@@ -0,0 +1,33 @@
1
+ import type { JsonSchemaLike, PackageDependency, PackageManifestBase } from './package.js';
2
+ export interface ApiAdapterPackageManifest extends PackageManifestBase {
3
+ type: 'api-adapter';
4
+ entrypoint?: string;
5
+ dependencies?: PackageDependency[];
6
+ configSchema?: JsonSchemaLike;
7
+ displayCategory?: string;
8
+ }
9
+ export interface RuntimeApiEndpoint {
10
+ protocol: string;
11
+ url: string;
12
+ token?: string;
13
+ metadata?: Record<string, unknown>;
14
+ }
15
+ export interface RuntimeApiAdapterContext {
16
+ configPath?: string;
17
+ entrypoint: string;
18
+ host: string;
19
+ port: number;
20
+ config: Record<string, unknown>;
21
+ }
22
+ export interface RuntimeApiAdapter {
23
+ start(): Promise<{
24
+ endpoints: RuntimeApiEndpoint[];
25
+ }>;
26
+ stop(): Promise<void>;
27
+ }
28
+ export interface RuntimeApiAdapterPackage {
29
+ manifest: ApiAdapterPackageManifest;
30
+ createAdapter(input: RuntimeApiAdapterContext): RuntimeApiAdapter;
31
+ }
32
+ export declare function validateApiAdapterPackageManifest(manifest: ApiAdapterPackageManifest): ApiAdapterPackageManifest;
33
+ export declare function validateApiAdapterPackageRuntimeContract(pkg: RuntimeApiAdapterPackage): void;
@@ -0,0 +1,40 @@
1
+ import { validateJsonSchemaLike, validatePackageActivationRule, validatePackageDependencies, validatePackageId } from './package.js';
2
+ export function validateApiAdapterPackageManifest(manifest) {
3
+ if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) {
4
+ throw new Error('API adapter package manifest must be an object');
5
+ }
6
+ const record = manifest;
7
+ validatePackageId(record.id, 'API adapter package manifest id');
8
+ if (typeof record.name !== 'string' || !record.name.trim()) {
9
+ throw new Error('API adapter package manifest name is required');
10
+ }
11
+ if (typeof record.version !== 'string' || !record.version.trim()) {
12
+ throw new Error('API adapter package manifest version is required');
13
+ }
14
+ if (record.type !== 'api-adapter') {
15
+ throw new Error('API adapter package manifest type must be "api-adapter"');
16
+ }
17
+ if (record.description !== undefined && (typeof record.description !== 'string' || !record.description.trim())) {
18
+ throw new Error('API adapter package manifest description must be non-empty when provided');
19
+ }
20
+ if (record.entrypoint !== undefined && (typeof record.entrypoint !== 'string' || !record.entrypoint.trim())) {
21
+ throw new Error('API adapter package manifest entrypoint must be non-empty when provided');
22
+ }
23
+ if (record.displayCategory !== undefined &&
24
+ (typeof record.displayCategory !== 'string' || !record.displayCategory.trim())) {
25
+ throw new Error('API adapter package manifest displayCategory must be non-empty when provided');
26
+ }
27
+ validatePackageDependencies(record.dependencies, 'api adapter package manifest');
28
+ validateJsonSchemaLike(record.configSchema, 'api adapter package manifest');
29
+ const activation = validatePackageActivationRule(record.activation, 'api adapter package manifest');
30
+ return {
31
+ ...manifest,
32
+ ...(activation !== undefined ? { activation } : {})
33
+ };
34
+ }
35
+ export function validateApiAdapterPackageRuntimeContract(pkg) {
36
+ if (typeof pkg.createAdapter !== 'function') {
37
+ throw new Error(`API adapter package ${pkg.manifest.id} must implement createAdapter`);
38
+ }
39
+ }
40
+ //# sourceMappingURL=api-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-adapter.js","sourceRoot":"","sources":["../src/api-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAmCrI,MAAM,UAAU,iCAAiC,CAAC,QAAmC;IACnF,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,QAA8C,CAAC;IAC9D,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAChE,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/G,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5G,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,IACE,MAAM,CAAC,eAAe,KAAK,SAAS;QACpC,CAAC,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAC9E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IACD,2BAA2B,CAAC,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;IACjF,sBAAsB,CAAC,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,6BAA6B,CAAC,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;IACpG,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wCAAwC,CAAC,GAA6B;IACpF,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,QAAQ,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PackageBundleMember, PackageManifestBase } from './package.js';
2
+ export interface BundlePackageManifest extends PackageManifestBase {
3
+ type: 'bundle';
4
+ members: PackageBundleMember[];
5
+ }
6
+ export declare function validateBundlePackageManifest(manifest: BundlePackageManifest): BundlePackageManifest;
package/dist/bundle.js ADDED
@@ -0,0 +1,26 @@
1
+ import { validatePackageBundleMembers, validatePackageId } from './package.js';
2
+ export function validateBundlePackageManifest(manifest) {
3
+ if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) {
4
+ throw new Error('Bundle package manifest must be an object');
5
+ }
6
+ const record = manifest;
7
+ validatePackageId(record.id, 'Bundle package manifest id');
8
+ if (typeof record.name !== 'string' || !record.name.trim()) {
9
+ throw new Error('Bundle package manifest name is required');
10
+ }
11
+ if (typeof record.version !== 'string' || !record.version.trim()) {
12
+ throw new Error('Bundle package manifest version is required');
13
+ }
14
+ if (record.type !== 'bundle') {
15
+ throw new Error('Bundle package manifest type must be "bundle"');
16
+ }
17
+ if (record.description !== undefined && (typeof record.description !== 'string' || !record.description.trim())) {
18
+ throw new Error('Bundle package manifest description must be non-empty when provided');
19
+ }
20
+ validatePackageBundleMembers(record.members, 'bundle package manifest');
21
+ return {
22
+ ...manifest,
23
+ members: validatePackageBundleMembers(record.members, 'bundle package manifest')
24
+ };
25
+ }
26
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAO/E,MAAM,UAAU,6BAA6B,CAAC,QAA+B;IAC3E,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,QAA8C,CAAC;IAC9D,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,4BAA4B,CAAC,CAAC;IAC3D,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/G,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,4BAA4B,CAAC,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;IACxE,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC;KACjF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const CAPABILITIES: readonly ["command.exec", "fs.read", "fs.write", "memory.read", "memory.write", "session.inspect", "session.create", "session.direct", "session.archive", "session.delete", "mission.inspect", "mission.create", "mission.control", "mission.archive", "mission.delete", "net.connect", "runtime.control", "sidecar.manage", "transport.message.send", "transport.action.register", "transport.space.create", "transport.space.update", "transport.space.delete", "transport.native.action.map", "transport.native.interaction"];
2
+ export type CoreCapability = (typeof CAPABILITIES)[number];
3
+ export type PackageLocalCapability = `package:${string}`;
4
+ export type Capability = CoreCapability | PackageLocalCapability;
5
+ export declare function isCapability(value: string): value is Capability;
6
+ export declare function isPackageLocalCapability(value: string): value is PackageLocalCapability;
7
+ export declare function packageOwnsCapability(packageId: string, capability: Capability): boolean;
@@ -0,0 +1,40 @@
1
+ export const CAPABILITIES = [
2
+ 'command.exec',
3
+ 'fs.read',
4
+ 'fs.write',
5
+ 'memory.read',
6
+ 'memory.write',
7
+ 'session.inspect',
8
+ 'session.create',
9
+ 'session.direct',
10
+ 'session.archive',
11
+ 'session.delete',
12
+ 'mission.inspect',
13
+ 'mission.create',
14
+ 'mission.control',
15
+ 'mission.archive',
16
+ 'mission.delete',
17
+ 'net.connect',
18
+ 'runtime.control',
19
+ 'sidecar.manage',
20
+ 'transport.message.send',
21
+ 'transport.action.register',
22
+ 'transport.space.create',
23
+ 'transport.space.update',
24
+ 'transport.space.delete',
25
+ 'transport.native.action.map',
26
+ 'transport.native.interaction'
27
+ ];
28
+ export function isCapability(value) {
29
+ return CAPABILITIES.includes(value) || value.startsWith('package:');
30
+ }
31
+ export function isPackageLocalCapability(value) {
32
+ return value.startsWith('package:');
33
+ }
34
+ export function packageOwnsCapability(packageId, capability) {
35
+ if (!isPackageLocalCapability(capability)) {
36
+ return true;
37
+ }
38
+ return capability.startsWith(`package:${packageId}.`);
39
+ }
40
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc;IACd,SAAS;IACT,UAAU;IACV,aAAa;IACb,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,2BAA2B;IAC3B,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,6BAA6B;IAC7B,8BAA8B;CACtB,CAAC;AAMX,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAQ,YAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,UAAsB;IAC7E,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,UAAU,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface MoorlineDistroMetadata {
2
+ schemaVersion: 1;
3
+ name?: string;
4
+ description?: string;
5
+ version?: string;
6
+ display?: {
7
+ name?: string;
8
+ description?: string;
9
+ version?: string;
10
+ category?: string;
11
+ tags?: string[];
12
+ publisher?: string;
13
+ license?: string;
14
+ homepageUrl?: string;
15
+ docsUrl?: string;
16
+ iconPath?: string;
17
+ hidden?: boolean;
18
+ experimental?: boolean;
19
+ };
20
+ distribution?: {
21
+ audiences?: Array<'setup' | 'catalog' | 'advanced' | 'internal'>;
22
+ recommendedForSetup?: boolean;
23
+ setupOrder?: number;
24
+ };
25
+ compatibility?: {
26
+ moorline?: string;
27
+ platforms?: string[];
28
+ };
29
+ release?: {
30
+ recommendedRef?: string;
31
+ channel?: 'stable' | 'preview' | 'experimental';
32
+ };
33
+ }
34
+ export interface ResolvedMoorlineDistroMetadata extends MoorlineDistroMetadata {
35
+ display: NonNullable<MoorlineDistroMetadata['display']> & {
36
+ name: string;
37
+ description: string;
38
+ version: string;
39
+ };
40
+ }
41
+ export declare function validateMoorlineDistroMetadata(distro: MoorlineDistroMetadata, label?: string): MoorlineDistroMetadata;
package/dist/distro.js ADDED
@@ -0,0 +1,29 @@
1
+ export function validateMoorlineDistroMetadata(distro, label = 'moorline.dist.json') {
2
+ if (!distro || typeof distro !== 'object') {
3
+ throw new Error(`${label} must be an object`);
4
+ }
5
+ if (distro.schemaVersion !== 1) {
6
+ throw new Error(`${label}.schemaVersion must be 1`);
7
+ }
8
+ const name = distro.display?.name ?? distro.name;
9
+ const description = distro.display?.description ?? distro.description;
10
+ const version = distro.display?.version ?? distro.version;
11
+ if (typeof name !== 'string' || !name.trim()) {
12
+ throw new Error(`${label}.name is required`);
13
+ }
14
+ if (typeof description !== 'string' || !description.trim()) {
15
+ throw new Error(`${label}.description is required`);
16
+ }
17
+ if (typeof version !== 'string' || !version.trim()) {
18
+ throw new Error(`${label}.version is required`);
19
+ }
20
+ if (distro.compatibility?.moorline !== undefined && typeof distro.compatibility.moorline !== 'string') {
21
+ throw new Error(`${label}.compatibility.moorline must be a string when provided`);
22
+ }
23
+ if (distro.compatibility?.platforms !== undefined &&
24
+ (!Array.isArray(distro.compatibility.platforms) || distro.compatibility.platforms.some((entry) => typeof entry !== 'string' || !entry.trim()))) {
25
+ throw new Error(`${label}.compatibility.platforms must be a string array when provided`);
26
+ }
27
+ return distro;
28
+ }
29
+ //# sourceMappingURL=distro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distro.js","sourceRoot":"","sources":["../src/distro.ts"],"names":[],"mappings":"AA0CA,MAAM,UAAU,8BAA8B,CAC5C,MAA8B,EAC9B,KAAK,GAAG,oBAAoB;IAE5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,EAAE,QAAQ,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IACpF,CAAC;IACD,IACE,MAAM,CAAC,aAAa,EAAE,SAAS,KAAK,SAAS;QAC7C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9I,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+DAA+D,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from './runtime.js';
2
+ export * from './package.js';
3
+ export * from './distro.js';
4
+ export * from './capabilities.js';
5
+ export * from './plugin.js';
6
+ export * from './plugin-runtime.js';
7
+ export * from './skill.js';
8
+ export * from './provider.js';
9
+ export * from './transport.js';
10
+ export * from './bundle.js';
11
+ export * from './api-adapter.js';
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from './runtime.js';
2
+ export * from './package.js';
3
+ export * from './distro.js';
4
+ export * from './capabilities.js';
5
+ export * from './plugin.js';
6
+ export * from './plugin-runtime.js';
7
+ export * from './skill.js';
8
+ export * from './provider.js';
9
+ export * from './transport.js';
10
+ export * from './bundle.js';
11
+ export * from './api-adapter.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,87 @@
1
+ export type PackageRuntimeKind = 'api-adapter' | 'transport' | 'provider' | 'plugin' | 'skill';
2
+ export type PackageSurface = PackageRuntimeKind;
3
+ export type PackageKind = PackageRuntimeKind | 'bundle';
4
+ export type PackageFamily = 'installable' | 'addon' | 'bundle';
5
+ export type PackageRequirementState = 'installed' | 'active';
6
+ export type PackageRuntimeState = 'not_installed' | 'deactivated' | 'activated';
7
+ export interface PackageRef {
8
+ surface: PackageSurface;
9
+ packageId: string;
10
+ }
11
+ export interface PackageActivationRule {
12
+ uniqueKey?: string;
13
+ }
14
+ export interface JsonSchemaLike {
15
+ type: 'object';
16
+ properties?: Record<string, {
17
+ type?: 'string' | 'boolean' | 'number';
18
+ title?: string;
19
+ description?: string;
20
+ default?: string | boolean | number;
21
+ enum?: Array<string | boolean | number>;
22
+ secret?: boolean;
23
+ }>;
24
+ required?: string[];
25
+ }
26
+ export interface PackageDependency {
27
+ kind?: PackageRuntimeKind;
28
+ surface: PackageSurface;
29
+ packageId: string;
30
+ versionRange?: string;
31
+ requiredState: PackageRequirementState;
32
+ reason?: string;
33
+ }
34
+ export type BundleMemberActivation = 'install' | 'select' | 'enable';
35
+ export interface PackageBundleMember {
36
+ kind: PackageRuntimeKind;
37
+ surface?: PackageSurface;
38
+ packageId: string;
39
+ version: string;
40
+ activation: BundleMemberActivation;
41
+ optional?: boolean;
42
+ reason?: string;
43
+ }
44
+ export type PackageSourceProvenance = {
45
+ type: 'github_release';
46
+ repository?: string;
47
+ releaseRef?: string;
48
+ assetName?: string;
49
+ } | {
50
+ type: 'npm';
51
+ registryUrl: string;
52
+ packageName: string;
53
+ version: string;
54
+ integrity?: string;
55
+ } | {
56
+ type: 'direct_url';
57
+ };
58
+ export type PackageSourceDescriptor = {
59
+ kind: 'local_dir';
60
+ path: string;
61
+ } | {
62
+ kind: 'local_archive';
63
+ path: string;
64
+ } | {
65
+ kind: 'remote_archive';
66
+ url: string;
67
+ sha256?: string;
68
+ integrity?: string;
69
+ provenance?: PackageSourceProvenance;
70
+ };
71
+ export interface PackageManifestBase {
72
+ id: string;
73
+ name: string;
74
+ version: string;
75
+ description?: string;
76
+ dependencies?: PackageDependency[];
77
+ configSchema?: JsonSchemaLike;
78
+ displayCategory?: string;
79
+ activation?: PackageActivationRule;
80
+ }
81
+ export declare function packageFamilyForKind(kind: PackageKind): PackageFamily;
82
+ export declare function packageFamilyForSurface(surface: PackageSurface): PackageFamily;
83
+ export declare function validatePackageId(packageId: unknown, label: string): string;
84
+ export declare function validatePackageActivationRule(rule: unknown, label: string): PackageActivationRule | undefined;
85
+ export declare function validatePackageDependencies(dependencies: unknown, label: string): PackageDependency[];
86
+ export declare function validatePackageBundleMembers(members: unknown, label: string): PackageBundleMember[];
87
+ export declare function validateJsonSchemaLike(schema: unknown, label: string): JsonSchemaLike | undefined;
@@ -0,0 +1,216 @@
1
+ export function packageFamilyForKind(kind) {
2
+ if (kind === 'bundle') {
3
+ return 'bundle';
4
+ }
5
+ return kind === 'skill' ? 'addon' : 'installable';
6
+ }
7
+ export function packageFamilyForSurface(surface) {
8
+ return packageFamilyForKind(surface);
9
+ }
10
+ const PACKAGE_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]{0,62})\/[a-z0-9](?:[a-z0-9._-]{0,62})$/u;
11
+ function asRecord(value) {
12
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
13
+ ? value
14
+ : null;
15
+ }
16
+ function requireNonEmptyString(value, label) {
17
+ if (typeof value !== 'string') {
18
+ throw new Error(`${label} must be a string`);
19
+ }
20
+ const normalized = value.trim();
21
+ if (!normalized) {
22
+ throw new Error(`${label} is required`);
23
+ }
24
+ return normalized;
25
+ }
26
+ function optionalNonEmptyString(value, label) {
27
+ if (value === undefined || value === null) {
28
+ return undefined;
29
+ }
30
+ if (typeof value !== 'string') {
31
+ throw new Error(`${label} must be a string when provided`);
32
+ }
33
+ const normalized = value.trim();
34
+ if (!normalized) {
35
+ throw new Error(`${label} must be non-empty when provided`);
36
+ }
37
+ return normalized;
38
+ }
39
+ function isJsonSchemaType(value) {
40
+ return value === 'string' || value === 'boolean' || value === 'number';
41
+ }
42
+ export function validatePackageId(packageId, label) {
43
+ if (typeof packageId !== 'string') {
44
+ throw new Error(`${label} must be a string`);
45
+ }
46
+ const normalized = packageId.trim();
47
+ if (!normalized) {
48
+ throw new Error(`${label} is required`);
49
+ }
50
+ if (!PACKAGE_ID_PATTERN.test(normalized)) {
51
+ throw new Error(`${label} must match <namespace>/<name> using lowercase letters, numbers, ".", "_" or "-". Received: ${packageId}`);
52
+ }
53
+ return normalized;
54
+ }
55
+ export function validatePackageActivationRule(rule, label) {
56
+ if (rule === undefined) {
57
+ return undefined;
58
+ }
59
+ const record = asRecord(rule);
60
+ if (!record) {
61
+ throw new Error(`${label}.activation must be an object when provided`);
62
+ }
63
+ const uniqueKey = optionalNonEmptyString(record.uniqueKey, `${label}.activation.uniqueKey`);
64
+ return {
65
+ ...(uniqueKey !== undefined ? { uniqueKey } : {})
66
+ };
67
+ }
68
+ export function validatePackageDependencies(dependencies, label) {
69
+ if (dependencies === undefined) {
70
+ return [];
71
+ }
72
+ if (!Array.isArray(dependencies)) {
73
+ throw new Error(`${label}.dependencies must be an array when provided`);
74
+ }
75
+ return dependencies.map((entry, index) => {
76
+ const dependency = asRecord(entry);
77
+ if (!dependency) {
78
+ throw new Error(`${label}.dependencies[${index}] must be an object`);
79
+ }
80
+ const packageId = validatePackageId(dependency.packageId, `${label}.dependencies[${index}].packageId`);
81
+ const rawKind = dependency.kind ?? dependency.surface;
82
+ if (rawKind !== 'api-adapter' &&
83
+ rawKind !== 'transport' &&
84
+ rawKind !== 'provider' &&
85
+ rawKind !== 'plugin' &&
86
+ rawKind !== 'skill') {
87
+ throw new Error(`${label}.dependencies[${index}].kind must be one of: api-adapter, transport, provider, plugin, skill`);
88
+ }
89
+ if (dependency.requiredState !== 'installed' && dependency.requiredState !== 'active') {
90
+ throw new Error(`${label}.dependencies[${index}].requiredState must be "installed" or "active"`);
91
+ }
92
+ const versionRange = optionalNonEmptyString(dependency.versionRange, `${label}.dependencies[${index}].versionRange`);
93
+ const reason = optionalNonEmptyString(dependency.reason, `${label}.dependencies[${index}].reason`);
94
+ return {
95
+ kind: rawKind,
96
+ surface: rawKind,
97
+ packageId,
98
+ requiredState: dependency.requiredState,
99
+ ...(versionRange !== undefined ? { versionRange } : {}),
100
+ ...(reason !== undefined ? { reason } : {})
101
+ };
102
+ });
103
+ }
104
+ function validatePackageRuntimeKind(value, label) {
105
+ if (value === 'api-adapter' || value === 'transport' || value === 'provider' || value === 'plugin' || value === 'skill') {
106
+ return value;
107
+ }
108
+ throw new Error(`${label} must be one of: api-adapter, transport, provider, plugin, skill`);
109
+ }
110
+ export function validatePackageBundleMembers(members, label) {
111
+ if (!Array.isArray(members) || members.length === 0) {
112
+ throw new Error(`${label}.members must declare at least one package`);
113
+ }
114
+ return members.map((entry, index) => {
115
+ const member = asRecord(entry);
116
+ if (!member) {
117
+ throw new Error(`${label}.members[${index}] must be an object`);
118
+ }
119
+ const kind = validatePackageRuntimeKind(member.kind ?? member.surface, `${label}.members[${index}].kind`);
120
+ const packageId = validatePackageId(member.packageId, `${label}.members[${index}].packageId`);
121
+ const version = optionalNonEmptyString(member.version, `${label}.members[${index}].version`) ?? '*';
122
+ const activation = member.activation;
123
+ if (activation !== 'install' && activation !== 'select' && activation !== 'enable') {
124
+ throw new Error(`${label}.members[${index}].activation must be one of: install, select, enable`);
125
+ }
126
+ if (activation === 'select' && kind !== 'api-adapter' && kind !== 'transport' && kind !== 'provider') {
127
+ throw new Error(`${label}.members[${index}].activation select is only valid for api-adapter, transport, or provider packages`);
128
+ }
129
+ if (activation === 'enable' && kind !== 'plugin' && kind !== 'skill') {
130
+ throw new Error(`${label}.members[${index}].activation enable is only valid for plugin or skill packages`);
131
+ }
132
+ if (member.optional !== undefined && typeof member.optional !== 'boolean') {
133
+ throw new Error(`${label}.members[${index}].optional must be a boolean when provided`);
134
+ }
135
+ const reason = optionalNonEmptyString(member.reason, `${label}.members[${index}].reason`);
136
+ return {
137
+ kind,
138
+ surface: kind,
139
+ packageId,
140
+ version,
141
+ activation,
142
+ ...(member.optional !== undefined ? { optional: member.optional } : {}),
143
+ ...(reason !== undefined ? { reason } : {})
144
+ };
145
+ });
146
+ }
147
+ export function validateJsonSchemaLike(schema, label) {
148
+ if (schema === undefined) {
149
+ return undefined;
150
+ }
151
+ const schemaRecord = asRecord(schema);
152
+ if (!schemaRecord || schemaRecord.type !== 'object') {
153
+ throw new Error(`${label}.configSchema must be an object schema when provided`);
154
+ }
155
+ if (schemaRecord.required !== undefined && !Array.isArray(schemaRecord.required)) {
156
+ throw new Error(`${label}.configSchema.required must be an array when provided`);
157
+ }
158
+ if (Array.isArray(schemaRecord.required)) {
159
+ for (const [index, required] of schemaRecord.required.entries()) {
160
+ requireNonEmptyString(required, `${label}.configSchema.required[${index}]`);
161
+ }
162
+ }
163
+ const properties = schemaRecord.properties;
164
+ const normalizedProperties = {};
165
+ if (properties !== undefined) {
166
+ const propertiesRecord = asRecord(properties);
167
+ if (!propertiesRecord) {
168
+ throw new Error(`${label}.configSchema.properties must be an object when provided`);
169
+ }
170
+ for (const [key, value] of Object.entries(propertiesRecord)) {
171
+ const property = asRecord(value);
172
+ if (!property) {
173
+ throw new Error(`${label}.configSchema.properties.${key} must be an object`);
174
+ }
175
+ if (property.type !== undefined && !isJsonSchemaType(property.type)) {
176
+ throw new Error(`${label}.configSchema.properties.${key}.type is invalid`);
177
+ }
178
+ const title = optionalNonEmptyString(property.title, `${label}.configSchema.properties.${key}.title`);
179
+ const description = optionalNonEmptyString(property.description, `${label}.configSchema.properties.${key}.description`);
180
+ if (property.enum !== undefined) {
181
+ if (!Array.isArray(property.enum)) {
182
+ throw new Error(`${label}.configSchema.properties.${key}.enum must be an array`);
183
+ }
184
+ for (const enumValue of property.enum) {
185
+ if (typeof enumValue !== 'string' && typeof enumValue !== 'boolean' && typeof enumValue !== 'number') {
186
+ throw new Error(`${label}.configSchema.properties.${key}.enum must contain string, boolean, or number values`);
187
+ }
188
+ }
189
+ }
190
+ if (property.secret !== undefined && typeof property.secret !== 'boolean') {
191
+ throw new Error(`${label}.configSchema.properties.${key}.secret must be a boolean when provided`);
192
+ }
193
+ if (property.default !== undefined && typeof property.default !== 'string' && typeof property.default !== 'boolean' && typeof property.default !== 'number') {
194
+ throw new Error(`${label}.configSchema.properties.${key}.default must be a string, boolean, or number when provided`);
195
+ }
196
+ normalizedProperties[key] = {
197
+ ...(property.type !== undefined ? { type: property.type } : {}),
198
+ ...(title !== undefined ? { title } : {}),
199
+ ...(description !== undefined ? { description } : {}),
200
+ ...(property.default !== undefined ? { default: property.default } : {}),
201
+ ...(property.enum !== undefined ? { enum: property.enum } : {}),
202
+ ...(property.secret !== undefined ? { secret: property.secret } : {})
203
+ };
204
+ }
205
+ }
206
+ return {
207
+ type: 'object',
208
+ ...(Object.keys(normalizedProperties).length > 0 ? { properties: normalizedProperties } : {}),
209
+ ...(Array.isArray(schemaRecord.required)
210
+ ? {
211
+ required: schemaRecord.required.map((value) => String(value).trim())
212
+ }
213
+ : {})
214
+ };
215
+ }
216
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":"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"}