@hasna/skills 0.8.8 → 0.8.10

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.
@@ -1,5 +1,6 @@
1
1
  export declare const INTEGRATION_AGENTS: readonly ["claude", "codex", "gemini", "opencode", "cursor", "hermes"];
2
2
  export type IntegrationAgent = typeof INTEGRATION_AGENTS[number];
3
+ export declare function renderAgentHookCommand(command: string, agent: IntegrationAgent, profileId: string, event: string): string;
3
4
  export declare const AGENT_ADAPTERS: {
4
5
  readonly claude: {
5
6
  readonly root: ".claude/skills";
@@ -0,0 +1,42 @@
1
+ import { connectCodexHookRpc } from "./codex-hook-rpc.js";
2
+ import { type ReviewedSkillsCli } from "./codex-hook-trust-identity.js";
3
+ export interface CodexNativeHookTrustOptions {
4
+ home?: string;
5
+ dataDir?: string;
6
+ codexCommand?: string;
7
+ apply?: boolean;
8
+ reviewedPlanDigest?: string;
9
+ reviewedSkillsCli?: ReviewedSkillsCli;
10
+ }
11
+ type Connect = typeof connectCodexHookRpc;
12
+ /** Deliberately separate from filesystem hook installation: native trust is an
13
+ * explicit authorization of exact owned commands, never a broad trust bypass. */
14
+ export declare function enrollCodexNativeHooks(options?: CodexNativeHookTrustOptions, connect?: Connect): Promise<{
15
+ planDigest: string;
16
+ skillsCli: {
17
+ path: string;
18
+ version: string;
19
+ sha256: string;
20
+ manifestSha256: string;
21
+ };
22
+ nativeVersion: string;
23
+ ownedNativeProcessId: number | undefined;
24
+ agent: string;
25
+ applied: boolean;
26
+ planned: {
27
+ key: any;
28
+ event: string;
29
+ command: string;
30
+ handlerType: any;
31
+ timeoutSec: any;
32
+ sourcePath: any;
33
+ currentHash: any;
34
+ enabled: any;
35
+ trustStatus: any;
36
+ }[];
37
+ nativeEligible: boolean;
38
+ transport: string;
39
+ existingSessionsReloaded: boolean;
40
+ nativeExecutionVerified: boolean;
41
+ }>;
42
+ export {};
@@ -0,0 +1,10 @@
1
+ export declare const CODEX_SKILL_CONFIG_SECTIONS: RegExp;
2
+ /** The path editor supports ordinary array-of-table sections only. Removing
3
+ * those sections must remove exactly the parsed path array, with all other
4
+ * values unchanged. This also excludes header-like text inside user strings. */
5
+ export declare function assertCodexPathConfigEditable(text: string): void;
6
+ /** Preserve user TOML verbatim except for the supported bundled-skill control.
7
+ * Bun's parser accepts some illegal table reopenings, so never append a table
8
+ * over an existing inline/dotted skills definition. Refuse unfamiliar layouts
9
+ * before the integration transaction writes any files. */
10
+ export declare function disableCodexBundledSkills(text: string): string;
@@ -1,10 +1,12 @@
1
1
  import type { IntegrationAgent } from "./agent-adapters.js";
2
2
  import { type DiscoveryDirectory } from "./agent-discovery-directories.js";
3
+ import { type ManagedPluginRegistrationWitness } from "./plugin-discovery.js";
3
4
  export { captureDiscoveryDirectories, type DiscoveryDirectory } from "./agent-discovery-directories.js";
4
5
  export interface DiscoverySource {
5
6
  path: string;
6
7
  sha256: string | null;
7
- hashMode?: "bytes" | "path-bytes";
8
+ hashMode?: "bytes" | "path-bytes" | "claude-plugin-registry";
9
+ managedPlugins?: ManagedPluginRegistrationWitness[];
8
10
  format?: "json" | "toml" | "yaml";
9
11
  fields?: string[];
10
12
  }
@@ -35,7 +37,7 @@ export declare function captureDiscoveryPathSources(paths: string[]): DiscoveryS
35
37
  /** Project settings can introduce a higher-precedence discovery source. Until
36
38
  * its native merge format is supported, refuse that layer rather than certify
37
39
  * the home-only inventory. Ordinary unrelated project settings remain usable. */
38
- export declare function assertProjectDiscovery(agent: IntegrationAgent, directories: string[], home: string, canonical?: (path: string) => string): void;
40
+ export declare function assertProjectDiscovery(agent: IntegrationAgent, directories: string[], home: string, canonical?: (path: string) => string, reviewed?: AgentDiscoveryBinding): void;
39
41
  /** Resolve configured plugin discovery without starting an agent or loading a plugin.
40
42
  * Unknown runtime registrations require explicit reviewed inputs, never a cache guess. */
41
43
  export declare function resolveAgentDiscovery(options: {
@@ -0,0 +1,13 @@
1
+ export declare const SUPPORTED_CODEX_HOOK_VERSIONS: readonly ["codex-cli 0.153.0", "codex-cli 0.154.0", "codex-cli 0.155.0"];
2
+ export interface CodexHookRpc {
3
+ version: string;
4
+ processId?: number;
5
+ request(method: string, params: unknown): Promise<any>;
6
+ close(): Promise<void>;
7
+ }
8
+ /** An owned, short-lived native client. It cannot reload other app servers. */
9
+ export declare function connectCodexHookRpc(options: {
10
+ command: string;
11
+ home: string;
12
+ codexHome: string;
13
+ }): Promise<CodexHookRpc>;
@@ -0,0 +1,15 @@
1
+ import { type BigIntStats } from "node:fs";
2
+ export declare function need(value: unknown, code: string): asserts value;
3
+ export declare function snapshot(file: string, privateFile?: boolean, options?: {
4
+ readOnlyPackage?: true;
5
+ }): {
6
+ file: string;
7
+ privateFile: boolean;
8
+ readOnlyPackage: boolean;
9
+ text: string;
10
+ bytes: Buffer<ArrayBuffer>;
11
+ stat: BigIntStats;
12
+ sha256: string;
13
+ };
14
+ export declare function unchanged(before: ReturnType<typeof snapshot>): void;
15
+ export declare function save(file: string, content: string | Buffer): void;
@@ -0,0 +1,16 @@
1
+ /** A private release adapter supplies a reviewed registry artifact identity;
2
+ * the normal CLI binds to its own installed entrypoint instead. */
3
+ export interface ReviewedSkillsCli {
4
+ path: string;
5
+ version: string;
6
+ sha256: string;
7
+ }
8
+ export declare function bindSkillsCli(command: string, reviewed?: ReviewedSkillsCli): {
9
+ receipt: {
10
+ path: string;
11
+ version: string;
12
+ sha256: string;
13
+ manifestSha256: string;
14
+ };
15
+ recheck(): void;
16
+ };
@@ -0,0 +1,3 @@
1
+ /** Conservative admission and text witness, never a TOML writer. Native Codex
2
+ * performs the versioned write; unrecognized inline/dotted trust shapes refuse. */
3
+ export declare function codexTrustTextWitness(text: string, keys: string[]): string;
@@ -0,0 +1,101 @@
1
+ import { type ProfileClient } from "./profile-client.js";
2
+ import { type SelectionCacheOptions } from "./selection-cache.js";
3
+ import { type PluginFileWitness, type PluginProjectionManifest } from "./plugin-projection.js";
4
+ import type { ResolvedSkillSelection } from "../types/skill-selection.js";
5
+ /** Version 1 is certified against native Claude 2.1.274 and 2.1.276; new hosts require a contract revision/test. */
6
+ export interface PluginAdmissionTarget {
7
+ schemaVersion: 1;
8
+ pluginId: string;
9
+ /** One marketplace command serves all explicitly reviewed native registration scopes. */
10
+ registrations: Array<{
11
+ scope: "user" | "project";
12
+ projectPath: string | null;
13
+ }>;
14
+ native: {
15
+ version: "2.1.274" | "2.1.276";
16
+ executable: string;
17
+ digest: string;
18
+ };
19
+ resolver: {
20
+ executable: string;
21
+ digest: string;
22
+ };
23
+ }
24
+ export interface PluginAdmissionBinding {
25
+ schemaVersion: 2;
26
+ authority: string;
27
+ workspaceId: string;
28
+ /** Stable account subject. Raw credential/key identities are never persisted. */
29
+ principal: PluginAdmissionPrincipal;
30
+ profileId: string;
31
+ bundleSlug: string;
32
+ target: PluginAdmissionTarget;
33
+ }
34
+ export type PluginBundleIdentity = Pick<ResolvedSkillSelection, "slug" | "version" | "bundleDigest">;
35
+ export interface PluginAdmissionPrincipal {
36
+ userId: string;
37
+ accountId: string;
38
+ role: "owner";
39
+ }
40
+ export interface PluginRoutingIdentity extends PluginBundleIdentity {
41
+ aliases?: string[];
42
+ triggers?: {
43
+ keywords?: string[];
44
+ paths?: string[];
45
+ always?: boolean;
46
+ };
47
+ }
48
+ /** Every field that can route or activate the admitted plugin participates in approval. */
49
+ export interface PluginAdmissionIdentity {
50
+ schemaVersion: 3;
51
+ binding: PluginAdmissionBinding;
52
+ bindingId: string;
53
+ profileRevision: string;
54
+ selection: PluginRoutingIdentity;
55
+ payloadSelections: PluginRoutingIdentity[];
56
+ manifest: PluginProjectionManifest;
57
+ originalTreeDigest: string;
58
+ projectionTreeDigest: string;
59
+ files: PluginFileWitness[];
60
+ removed: PluginFileWitness[];
61
+ sourceCommand: string;
62
+ /** Approved digest of the authenticated routing evidence snapshot. */
63
+ evidenceDigest: string;
64
+ }
65
+ export interface PluginAdmissionPlan extends PluginAdmissionIdentity {
66
+ observation: {
67
+ principal: PluginAdmissionPrincipal;
68
+ profileRevision: string;
69
+ integration: PluginRoutingIdentity;
70
+ payloads: PluginRoutingIdentity[];
71
+ };
72
+ planDigest: string;
73
+ }
74
+ export interface PluginAdmissionReceipt {
75
+ schemaVersion: 3;
76
+ plan: PluginAdmissionPlan;
77
+ materializedPath: string;
78
+ admittedAt: string;
79
+ }
80
+ /** Client/store injections are for embedding and isolated tests. The CLI exposes neither. */
81
+ export interface PluginAdmissionOptions extends Pick<SelectionCacheOptions, "now"> {
82
+ client?: ProfileClient;
83
+ storeRoot?: string;
84
+ timeoutMs?: number;
85
+ }
86
+ export declare function pluginAdmissionRoot(): string;
87
+ export declare function validatePluginTarget(value: unknown): asserts value is PluginAdmissionTarget;
88
+ /** The accepted native command opens and hashes one inode, then executes that same descriptor. */
89
+ export declare function pluginResolverCommand(binding: PluginAdmissionBinding): string;
90
+ export declare function pluginBindingPath(storeRoot: string, id: string): string;
91
+ export declare function pluginReceiptPath(storeRoot: string, id: string, digest: string): string;
92
+ export declare function readPluginBinding(storeRoot: string, id: string): PluginAdmissionBinding;
93
+ export declare function readPluginAdmissionReceipt(storeRoot: string, id: string, digest: string): PluginAdmissionReceipt;
94
+ /** Command sources inherit an untrusted shell environment; authority comes from normal owner credentials. */
95
+ export declare function assertPluginAuthorityEnvironment(env?: Record<string, string | undefined>): void;
96
+ /** API reads only: a plan neither writes caches nor admits or executes package code. */
97
+ export declare function planPluginAdmission(spec: string, profileId: string, target: PluginAdmissionTarget, options?: PluginAdmissionOptions): Promise<PluginAdmissionPlan>;
98
+ /** Explicit local admission. Original archive and migrated payloads are already privately published. */
99
+ export declare function admitPlugin(spec: string, profileId: string, target: PluginAdmissionTarget, approvedDigest: string, approvedEvidenceDigest: string, options?: PluginAdmissionOptions): Promise<PluginAdmissionReceipt>;
100
+ /** Fresh authority on every invocation. No receipt, API failure or revocation ever returns a stale directory. */
101
+ export declare function resolveAdmittedPlugin(id: string, options?: PluginAdmissionOptions): Promise<string>;
@@ -0,0 +1,13 @@
1
+ export interface ManagedPluginRegistrationWitness {
2
+ bindingId: string;
3
+ storeRoot: string;
4
+ }
5
+ export declare function validateManagedPluginWitnesses(value: unknown): asserts value is ManagedPluginRegistrationWitness[];
6
+ /** This is a structured witness, not an exemption for a plugin ID or its cache directory. */
7
+ export declare function hashManagedPluginRegistry(path: string, managed: ManagedPluginRegistrationWitness[]): string;
8
+ export declare function captureManagedPluginRegistry(path: string, managedPlugins: ManagedPluginRegistrationWitness[]): {
9
+ path: string;
10
+ hashMode: "claude-plugin-registry";
11
+ managedPlugins: ManagedPluginRegistrationWitness[];
12
+ sha256: string;
13
+ };
@@ -0,0 +1,14 @@
1
+ import type { SkillBundleEntry } from "./skill-bundle.js";
2
+ import { type PluginFileWitness } from "./plugin-projection.js";
3
+ /** Snapshot every file, rejecting empty directories and any membership or metadata change. */
4
+ export declare function snapshotPluginTree(root: string, options?: {
5
+ nativeRuntime?: "claude-2.1.274" | "claude-2.1.276";
6
+ }): SkillBundleEntry[];
7
+ export declare function verifyPluginTree(root: string, witnesses: PluginFileWitness[]): void;
8
+ /** Sibling staging and an exclusive, nonwaiting lock serialize cooperative publishers. */
9
+ export declare function materializePluginTree(root: string, entries: SkillBundleEntry[]): void;
10
+ export declare function readPluginJson(path: string): unknown | null;
11
+ /** Atomic link publication never overwrites an existing receipt. */
12
+ export declare function writePluginJsonImmutable(path: string, value: unknown): void;
13
+ /** Hash the reviewed executable without executing it or allocating the entire binary. */
14
+ export declare function pluginExecutableDigest(path: string): string;
@@ -0,0 +1,80 @@
1
+ import type { SkillBundleEntry } from "./skill-bundle.js";
2
+ import type { SkillSelection } from "../types/skill-selection.js";
3
+ export declare const PLUGIN_PROJECTION_MANIFEST = "plugin-projection.json";
4
+ export declare const PLUGIN_PROJECTION_LIMITS: Readonly<{
5
+ files: 1024;
6
+ bytes: number;
7
+ fileBytes: number;
8
+ metadataBytes: number;
9
+ registrations: 64;
10
+ history: 128;
11
+ }>;
12
+ export interface PluginPayloadMapping {
13
+ path: string;
14
+ kind: "skill" | "command";
15
+ /** Digest of the original one-file tree, including its path and mode. */
16
+ sourceDigest: string;
17
+ target: Pick<SkillSelection, "slug" | "version" | "bundleDigest">;
18
+ }
19
+ interface PluginProjectionFields {
20
+ agent: "claude";
21
+ pluginId: string;
22
+ payloads: PluginPayloadMapping[];
23
+ }
24
+ interface PluginUpstream {
25
+ source: string;
26
+ revision: string;
27
+ license: string;
28
+ treeDigest: string;
29
+ }
30
+ interface PluginReview {
31
+ hooks: "reviewed-no-skill-injection";
32
+ dependencies: "reviewed-no-retired-payload-dependency";
33
+ }
34
+ export type PluginProjectionManifest = PluginProjectionFields & ({
35
+ schemaVersion: 1;
36
+ upstream: PluginUpstream & {
37
+ version: string;
38
+ };
39
+ review: PluginReview;
40
+ } | {
41
+ schemaVersion: 2;
42
+ upstream: PluginUpstream & {
43
+ version: string | null;
44
+ };
45
+ review: PluginReview & {
46
+ documentation: Array<{
47
+ path: string;
48
+ sourceDigest: string;
49
+ }>;
50
+ };
51
+ });
52
+ export interface PluginFileWitness {
53
+ path: string;
54
+ mode: number;
55
+ size: number;
56
+ sha256: string;
57
+ }
58
+ export interface PluginProjection {
59
+ manifest: PluginProjectionManifest;
60
+ payloads: PluginPayloadMapping[];
61
+ files: SkillBundleEntry[];
62
+ witnesses: PluginFileWitness[];
63
+ originalTreeDigest: string;
64
+ projectionTreeDigest: string;
65
+ removed: PluginFileWitness[];
66
+ }
67
+ export declare function pluginRefusal(message: string): never;
68
+ export declare function pluginNeed(value: unknown, message: string): asserts value;
69
+ export declare const pluginHash: (bytes: string | Uint8Array) => string;
70
+ export declare function pluginObject(value: unknown): value is Record<string, unknown>;
71
+ export declare function pluginKeys(value: unknown, keys: string[]): asserts value is Record<string, unknown>;
72
+ export declare function pluginText(value: unknown, limit?: number): asserts value is string;
73
+ export declare function pluginId(value: unknown): asserts value is string;
74
+ export declare function pluginDigest(value: unknown): asserts value is string;
75
+ export declare function validatePluginManifest(value: unknown): asserts value is PluginProjectionManifest;
76
+ export declare function pluginFileWitnesses(entries: SkillBundleEntry[]): PluginFileWitness[];
77
+ export declare function pluginTreeDigest(entries: SkillBundleEntry[]): string;
78
+ /** Pure projection: no filesystem access, upstream commands, package installation or publication. */
79
+ export declare function buildPluginProjection(entries: SkillBundleEntry[]): PluginProjection;
80
+ export {};
@@ -1,18 +1,28 @@
1
1
  import type { ResolvedSkillProfile, StationSkillState, StationSkillStateInput } from "../types/skill-selection.js";
2
2
  export interface ProfileClient {
3
3
  readonly authority: string;
4
+ /** Stable whoami subject; raw credential/key identities are intentionally excluded. */
5
+ resolvePrincipal?(): Promise<AuthenticatedProfilePrincipal>;
4
6
  resolveProfile(id: string): Promise<ResolvedSkillProfile>;
5
7
  recordStation(id: string, state: StationSkillStateInput): Promise<StationSkillState>;
6
8
  getBundle(slug: string, version: string): Promise<Response | null>;
7
9
  }
10
+ export type AuthenticatedProfileRole = "owner" | "admin" | "member" | "viewer";
11
+ export interface AuthenticatedProfilePrincipal {
12
+ userId: string;
13
+ accountId: string;
14
+ role: AuthenticatedProfileRole;
15
+ }
8
16
  export declare class HttpProfileClient implements ProfileClient {
9
17
  private key;
10
18
  readonly authority: string;
11
19
  private origin;
12
20
  constructor(key: string, origin: string);
21
+ private requestRoute;
13
22
  private request;
14
23
  private read;
15
24
  resolveProfile(id: string): Promise<ResolvedSkillProfile>;
25
+ resolvePrincipal(): Promise<AuthenticatedProfilePrincipal>;
16
26
  recordStation(id: string, input: StationSkillStateInput): Promise<StationSkillState>;
17
27
  getBundle(slug: string, version: string): Promise<Response | null>;
18
28
  }
@@ -9,6 +9,7 @@ import { type RemoteCreditPack, type RemoteRunApproval, type RemoteRunQuote } fr
9
9
  import { type RemoteInputFile, type RemoteInputFileDescriptor } from "./remote-files.js";
10
10
  import { type UpdateRemoteProfile, type UpdateRemoteWorkspace } from "./remote-profile.js";
11
11
  import { type RemoteQuoteUnavailableCode } from "./remote-quote-errors.js";
12
+ import { type RemoteSkillsAccess } from "./remote-permissions.js";
12
13
  export type { RemoteQuoteUnavailableCode } from "./remote-quote-errors.js";
13
14
  /**
14
15
  * A server that predates this client's pin/tag/incremental-sync routes answered
@@ -123,7 +124,9 @@ export declare class RemoteSkillsClient {
123
124
  /** Low-level admission transport; interactive surfaces use submitQuotedRun. */
124
125
  submitRun(slug: string, input?: Record<string, unknown>, args?: string[], approval?: RemoteRunApproval): Promise<RemoteSkillRunContract>;
125
126
  quoteRun(slug: string, input?: Record<string, unknown>, args?: string[], files?: RemoteInputFileDescriptor[]): Promise<RemoteRunQuote>;
126
- getCapabilities(): Promise<{
127
+ getCapabilities(options?: {
128
+ refresh?: boolean;
129
+ }): Promise<RemoteSkillsAccess & {
127
130
  contractVersion: 1;
128
131
  apiVersion: 1;
129
132
  capabilities: string[];
@@ -11,7 +11,7 @@ export declare const REMOTE_CUSTOMER_OPERATIONS: readonly [{
11
11
  readonly title: "Get Server Capabilities";
12
12
  readonly parameter: null;
13
13
  readonly mutates: false;
14
- readonly invoke: (client: RemoteSkillsClient) => Promise<{
14
+ readonly invoke: (client: RemoteSkillsClient) => Promise<import("./remote-permissions.js").RemoteSkillsAccess & {
15
15
  contractVersion: 1;
16
16
  apiVersion: 1;
17
17
  capabilities: string[];
@@ -0,0 +1,24 @@
1
+ /** Effective access belongs to the credential, independently of workspace role. */
2
+ export interface RemoteSkillsPermissions {
3
+ read?: boolean;
4
+ publish?: boolean;
5
+ profilesWrite?: boolean;
6
+ stationStateWrite?: boolean;
7
+ cloudSubmit?: boolean;
8
+ executionGrantsRead?: boolean;
9
+ executionGrantsWrite?: boolean;
10
+ executionGrantsResolve?: boolean;
11
+ }
12
+ export interface RemoteSkillsAccess {
13
+ scopes?: string[];
14
+ permissions?: RemoteSkillsPermissions;
15
+ }
16
+ /** Pick known fields only; never reflect additive provider fields into diagnostics. */
17
+ export declare function parseSkillsAccess(value: unknown): RemoteSkillsAccess;
18
+ export declare class RemoteSkillsPermissionError extends Error {
19
+ readonly permission: "publish" | "profilesWrite";
20
+ readonly code = "SKILLS_PERMISSION_DENIED";
21
+ readonly status = 403;
22
+ constructor(permission: "publish" | "profilesWrite");
23
+ }
24
+ export declare function assertSkillsPermission(access: RemoteSkillsAccess, permission: "publish" | "profilesWrite"): void;
@@ -0,0 +1,9 @@
1
+ import type { SkillDocs } from "./skillinfo.js";
2
+ export declare class SkillDocFileError extends Error {
3
+ readonly code: "SKILL_DOC_FILE_INVALID" | "SKILL_DOC_FILE_MISSING";
4
+ constructor(code: "SKILL_DOC_FILE_INVALID" | "SKILL_DOC_FILE_MISSING", message: string);
5
+ }
6
+ /** The docs command's aliases are not arbitrary bundle paths (skills load supports those). */
7
+ export declare function resolveSkillDocFile(file?: string): "SKILL.md" | "README.md" | "CLAUDE.md" | undefined;
8
+ /** Fall back only when no file was requested, identically for text, JSON and SDK reads. */
9
+ export declare function selectSkillDoc(docs: SkillDocs, file?: string): string | null;
@@ -15,9 +15,10 @@ export interface SkillRequirements {
15
15
  */
16
16
  export declare function getSkillDocs(name: string): SkillDocs | null;
17
17
  /**
18
- * Get the best available documentation for a skill (SKILL.md > README.md > CLAUDE.md)
18
+ * Get preferred documentation, or an exact docs alias (skill, readme, claude).
19
+ * Unknown aliases and missing explicitly requested files refuse without fallback.
19
20
  */
20
- export declare function getSkillBestDoc(name: string): string | null;
21
+ export declare function getSkillBestDoc(name: string, file?: string): string | null;
21
22
  /**
22
23
  * Extract requirements from a skill's source files
23
24
  */
@@ -17,7 +17,7 @@
17
17
  */
18
18
  export { readExecutionGrantPolicy, saveExecutionGrantPolicy, resolveExecutionGrant } from "../lib/execution-grant-client.js";
19
19
  export type { ExecutionGrant, ExecutionGrantPolicy, ExecutionGrantRequest, ResolvedExecutionGrant } from "../lib/execution-grants.js";
20
- export { HttpProfileClient, createProfileClient, type ProfileClient } from "../lib/profile-client.js";
20
+ export { HttpProfileClient, createProfileClient, type ProfileClient, type AuthenticatedProfilePrincipal, type AuthenticatedProfileRole } from "../lib/profile-client.js";
21
21
  export { resolveSelectedRun, executeSelectedLocal, prepareSelectedSecretBindings, type ResolvedSelectedRun, type SelectedLocalRunOptions } from "../lib/selected-run.js";
22
22
  export { readSelectedSecretBindings, type SelectedSecretBindings, type SelectedSecretsClient } from "../lib/execution-secrets.js";
23
23
  export type { SkillSelection, SkillProfile, ResolvedSkillSelection, ResolvedSkillProfile, StationSkillStateInput, StationSkillState } from "../types/skill-selection.js";
@@ -37,6 +37,7 @@ export * from "./spend.js";
37
37
  export * from "./offline.js";
38
38
  export * from "./execution/index.js";
39
39
  export { RemoteSkillsClient, createRemoteSkillsClient, RemoteRequestError, RemoteRouteUnsupportedError, RemoteCapabilityUnavailableError, RemoteQuoteUnavailableError, RemoteWorkspaceMemberError } from "../lib/remote-client.js";
40
+ export { RemoteSkillsPermissionError, type RemoteSkillsAccess, type RemoteSkillsPermissions } from "../lib/remote-permissions.js";
40
41
  export * from "../lib/remote-recurring-contract.js";
41
42
  export { RecurringInputError, RemoteRecurringError, RemoteRecurringUnavailableError, RemoteRecurringReadError, RemoteRecurringUnconfirmedError } from "../lib/remote-recurring.js";
42
43
  export type { RecurringCapability, RecurringListOptions, RemoteRecurringErrorCode } from "../lib/remote-recurring.js";