@ystemsrx/cfshare 0.1.1 → 0.1.3

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,15 @@
1
+ import ignore from "ignore";
2
+ import type { CfsharePluginConfig, CfsharePolicy } from "./types.js";
3
+ export declare const DEFAULT_POLICY: CfsharePolicy;
4
+ export type LoadedPolicy = {
5
+ effective: CfsharePolicy;
6
+ warnings: string[];
7
+ matcher: ReturnType<typeof ignore>;
8
+ };
9
+ export declare function mergePolicy(defaults: CfsharePolicy, pluginConfig: CfsharePluginConfig, fileConfig: Record<string, unknown>): CfsharePolicy;
10
+ export declare function loadPolicy(params: {
11
+ policyFile: string;
12
+ ignoreFile: string;
13
+ pluginConfig: CfsharePluginConfig;
14
+ }): Promise<LoadedPolicy>;
15
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,cAAc,EAAE,aAgB5B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;CACpC,CAAC;AAiCF,wBAAgB,WAAW,CACzB,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,mBAAmB,EACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,aAAa,CA6Df;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,mBAAmB,CAAC;CACnC,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CxB"}
@@ -0,0 +1,130 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import ignore from "ignore";
4
+ export const DEFAULT_POLICY = {
5
+ defaultTtlSeconds: 3600,
6
+ maxTtlSeconds: 86400,
7
+ defaultExposePortAccess: "token",
8
+ defaultExposeFilesAccess: "none",
9
+ blockedPorts: [22, 2375, 2376],
10
+ allowedPathRoots: [],
11
+ tunnel: {
12
+ edgeIpVersion: "4",
13
+ protocol: "http2",
14
+ },
15
+ rateLimit: {
16
+ enabled: true,
17
+ windowMs: 60_000,
18
+ maxRequests: 240,
19
+ },
20
+ };
21
+ function isAccessMode(value) {
22
+ return value === "token" || value === "basic" || value === "none";
23
+ }
24
+ function normalizeAccess(value, fallback) {
25
+ return isAccessMode(value) ? value : fallback;
26
+ }
27
+ function asPortArray(input) {
28
+ if (!Array.isArray(input)) {
29
+ return undefined;
30
+ }
31
+ const ports = input
32
+ .map((value) => (typeof value === "number" ? Math.trunc(value) : Number.NaN))
33
+ .filter((value) => Number.isInteger(value) && value > 0 && value <= 65535);
34
+ return Array.from(new Set(ports));
35
+ }
36
+ function asStringArray(input) {
37
+ if (!Array.isArray(input)) {
38
+ return undefined;
39
+ }
40
+ return input
41
+ .filter((entry) => typeof entry === "string")
42
+ .map((entry) => entry.trim())
43
+ .filter(Boolean);
44
+ }
45
+ export function mergePolicy(defaults, pluginConfig, fileConfig) {
46
+ const fileTunnel = fileConfig.tunnel ?? {};
47
+ const fileRateLimit = fileConfig.rateLimit ?? {};
48
+ const merged = {
49
+ defaultTtlSeconds: typeof fileConfig.defaultTtlSeconds === "number"
50
+ ? fileConfig.defaultTtlSeconds
51
+ : pluginConfig.defaultTtlSeconds ?? defaults.defaultTtlSeconds,
52
+ maxTtlSeconds: typeof fileConfig.maxTtlSeconds === "number"
53
+ ? fileConfig.maxTtlSeconds
54
+ : pluginConfig.maxTtlSeconds ?? defaults.maxTtlSeconds,
55
+ defaultExposePortAccess: normalizeAccess(fileConfig.defaultExposePortAccess, normalizeAccess(pluginConfig.defaultExposePortAccess, defaults.defaultExposePortAccess)),
56
+ defaultExposeFilesAccess: normalizeAccess(fileConfig.defaultExposeFilesAccess, normalizeAccess(pluginConfig.defaultExposeFilesAccess, defaults.defaultExposeFilesAccess)),
57
+ blockedPorts: asPortArray(fileConfig.blockedPorts) ??
58
+ asPortArray(pluginConfig.blockedPorts) ??
59
+ defaults.blockedPorts,
60
+ allowedPathRoots: asStringArray(fileConfig.allowedPathRoots) ??
61
+ asStringArray(pluginConfig.allowedPathRoots) ??
62
+ defaults.allowedPathRoots,
63
+ tunnel: {
64
+ ...defaults.tunnel,
65
+ ...(pluginConfig.tunnel ?? {}),
66
+ ...fileTunnel,
67
+ },
68
+ rateLimit: {
69
+ ...defaults.rateLimit,
70
+ ...(pluginConfig.rateLimit ?? {}),
71
+ ...fileRateLimit,
72
+ },
73
+ };
74
+ merged.defaultTtlSeconds = Math.max(60, Math.trunc(merged.defaultTtlSeconds));
75
+ merged.maxTtlSeconds = Math.max(merged.defaultTtlSeconds, Math.trunc(merged.maxTtlSeconds));
76
+ const edge = merged.tunnel.edgeIpVersion;
77
+ if (edge !== "4" && edge !== "6" && edge !== "auto") {
78
+ merged.tunnel.edgeIpVersion = defaults.tunnel.edgeIpVersion;
79
+ }
80
+ const protocol = merged.tunnel.protocol;
81
+ if (protocol !== "http2" && protocol !== "quic" && protocol !== "auto") {
82
+ merged.tunnel.protocol = defaults.tunnel.protocol;
83
+ }
84
+ merged.rateLimit.enabled = merged.rateLimit.enabled !== false;
85
+ merged.rateLimit.windowMs = Math.min(3_600_000, Math.max(1000, Math.trunc(merged.rateLimit.windowMs)));
86
+ merged.rateLimit.maxRequests = Math.min(100_000, Math.max(1, Math.trunc(merged.rateLimit.maxRequests)));
87
+ return merged;
88
+ }
89
+ export async function loadPolicy(params) {
90
+ const warnings = [];
91
+ let fileConfig = {};
92
+ try {
93
+ const raw = await fs.readFile(params.policyFile, "utf8");
94
+ const parsed = JSON.parse(raw);
95
+ if (parsed && typeof parsed === "object") {
96
+ fileConfig = parsed;
97
+ }
98
+ else {
99
+ warnings.push(`policy file is not an object: ${params.policyFile}`);
100
+ }
101
+ }
102
+ catch (error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ if (error?.code !== "ENOENT") {
105
+ warnings.push(`failed to read policy file (${params.policyFile}): ${message}`);
106
+ }
107
+ }
108
+ const effective = mergePolicy(DEFAULT_POLICY, params.pluginConfig, fileConfig);
109
+ const matcher = ignore();
110
+ matcher.add([".git/**", ".openclaw/**"]);
111
+ try {
112
+ const ignoreText = await fs.readFile(params.ignoreFile, "utf8");
113
+ matcher.add(ignoreText.split(/\r?\n/));
114
+ }
115
+ catch (error) {
116
+ if (error?.code !== "ENOENT") {
117
+ const message = error instanceof Error ? error.message : String(error);
118
+ warnings.push(`failed to read ignore file (${params.ignoreFile}): ${message}`);
119
+ }
120
+ }
121
+ const cwdIgnore = path.join(process.cwd(), ".gitignore");
122
+ try {
123
+ const ignoreText = await fs.readFile(cwdIgnore, "utf8");
124
+ matcher.add(ignoreText.split(/\r?\n/));
125
+ }
126
+ catch {
127
+ // ignore missing cwd .gitignore
128
+ }
129
+ return { effective, warnings, matcher };
130
+ }
@@ -0,0 +1,97 @@
1
+ export declare const EnvCheckSchema: import("@sinclair/typebox").TObject<{}>;
2
+ export declare const ExposePortSchema: import("@sinclair/typebox").TObject<{
3
+ port: import("@sinclair/typebox").TNumber;
4
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
5
+ ttl_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
6
+ access: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
7
+ protect_origin: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
8
+ allowlist_paths: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
9
+ }>>;
10
+ }>;
11
+ export declare const ExposeFilesSchema: import("@sinclair/typebox").TObject<{
12
+ paths: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
13
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
14
+ mode: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
15
+ presentation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
16
+ ttl_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
17
+ access: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
18
+ max_downloads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
19
+ }>>;
20
+ }>;
21
+ export declare const ExposureListSchema: import("@sinclair/typebox").TObject<{}>;
22
+ export declare const ExposureGetSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
23
+ id: import("@sinclair/typebox").TString;
24
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TSchema>>;
25
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
26
+ probe_public: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
27
+ }>>;
28
+ }>, import("@sinclair/typebox").TObject<{
29
+ ids: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
30
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TSchema>>;
31
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
32
+ probe_public: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
33
+ }>>;
34
+ }>, import("@sinclair/typebox").TObject<{
35
+ filter: import("@sinclair/typebox").TObject<{
36
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
37
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
38
+ }>;
39
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TSchema>>;
40
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
41
+ probe_public: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
42
+ }>>;
43
+ }>]>;
44
+ export declare const ExposureStopSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
45
+ id: import("@sinclair/typebox").TString;
46
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
47
+ reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
48
+ }>>;
49
+ }>, import("@sinclair/typebox").TObject<{
50
+ ids: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
51
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
52
+ reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
53
+ }>>;
54
+ }>]>;
55
+ export declare const ExposureLogsSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
56
+ id: import("@sinclair/typebox").TString;
57
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
58
+ lines: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
59
+ since_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
60
+ component: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
61
+ }>>;
62
+ }>, import("@sinclair/typebox").TObject<{
63
+ ids: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
64
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
65
+ lines: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
66
+ since_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
67
+ component: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
68
+ }>>;
69
+ }>]>;
70
+ export declare const MaintenanceSchema: import("@sinclair/typebox").TObject<{
71
+ action: import("@sinclair/typebox").TSchema;
72
+ opts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
73
+ policy: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TAny>;
74
+ ignore_patterns: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
75
+ }>>;
76
+ }>;
77
+ export declare const AuditQuerySchema: import("@sinclair/typebox").TObject<{
78
+ filters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
79
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
80
+ event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
81
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
82
+ from_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
83
+ to_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
84
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
85
+ }>>;
86
+ }>;
87
+ export declare const AuditExportSchema: import("@sinclair/typebox").TObject<{
88
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
89
+ from_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
90
+ to_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
91
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
92
+ event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
93
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TSchema>;
94
+ output_path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
95
+ }>>;
96
+ }>;
97
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/schemas.ts"],"names":[],"mappings":"AAwEA,eAAO,MAAM,cAAc,yCAAmD,CAAC;AAE/E,eAAO,MAAM,gBAAgB;;;;;;;;EAM5B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;EAM7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,yCAAmD,CAAC;AAuBnF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;IA4B7B,CAAC;AASF,eAAO,MAAM,kBAAkB;;;;;;;;;;IAqB9B,CAAC;AAWF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;IAkB9B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;EAc7B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;EAiB5B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;EAiB7B,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { stringEnum } from "openclaw/plugin-sdk";
3
+ const AccessMode = stringEnum(["token", "basic", "none"], {
4
+ description: "Access mode",
5
+ });
6
+ const FileMode = stringEnum(["normal", "zip"], {
7
+ description: "File exposure mode",
8
+ });
9
+ const FilePresentationMode = stringEnum(["download", "preview", "raw"], {
10
+ description: "How files should be served to clients",
11
+ });
12
+ const ComponentMode = stringEnum(["tunnel", "origin", "all"], {
13
+ description: "Log component",
14
+ });
15
+ const ExposureType = stringEnum(["port", "files"], {
16
+ description: "Exposure type",
17
+ });
18
+ const ExposureStatus = stringEnum(["starting", "running", "stopped", "error", "expired"], {
19
+ description: "Exposure status",
20
+ });
21
+ const ExposureGetField = stringEnum([
22
+ "id",
23
+ "type",
24
+ "status",
25
+ "port",
26
+ "public_url",
27
+ "expires_at",
28
+ "local_url",
29
+ "stats",
30
+ "file_sharing",
31
+ "last_error",
32
+ "manifest",
33
+ "created_at",
34
+ ], {
35
+ description: "Fields to return",
36
+ });
37
+ const MaintenanceAction = stringEnum(["start_guard", "run_gc", "set_policy"], {
38
+ description: "Maintenance action",
39
+ });
40
+ const PortOptsSchema = Type.Object({
41
+ ttl_seconds: Type.Optional(Type.Number({ minimum: 60, maximum: 604800 })),
42
+ access: Type.Optional(AccessMode),
43
+ protect_origin: Type.Optional(Type.Boolean()),
44
+ allowlist_paths: Type.Optional(Type.Array(Type.String(), { minItems: 1, maxItems: 128 })),
45
+ }, { additionalProperties: false });
46
+ const FilesOptsSchema = Type.Object({
47
+ mode: Type.Optional(FileMode),
48
+ presentation: Type.Optional(FilePresentationMode),
49
+ ttl_seconds: Type.Optional(Type.Number({ minimum: 60, maximum: 604800 })),
50
+ access: Type.Optional(AccessMode),
51
+ max_downloads: Type.Optional(Type.Number({ minimum: 1, maximum: 1_000_000 })),
52
+ }, { additionalProperties: false });
53
+ export const EnvCheckSchema = Type.Object({}, { additionalProperties: false });
54
+ export const ExposePortSchema = Type.Object({
55
+ port: Type.Number({ minimum: 1, maximum: 65535 }),
56
+ opts: Type.Optional(PortOptsSchema),
57
+ }, { additionalProperties: false });
58
+ export const ExposeFilesSchema = Type.Object({
59
+ paths: Type.Array(Type.String(), { minItems: 1, maxItems: 256 }),
60
+ opts: Type.Optional(FilesOptsSchema),
61
+ }, { additionalProperties: false });
62
+ export const ExposureListSchema = Type.Object({}, { additionalProperties: false });
63
+ const ExposureGetOptsSchema = Type.Object({
64
+ probe_public: Type.Optional(Type.Boolean()),
65
+ }, { additionalProperties: false });
66
+ const ExposureGetFieldsSchema = Type.Array(ExposureGetField, {
67
+ minItems: 1,
68
+ maxItems: 32,
69
+ uniqueItems: true,
70
+ });
71
+ const ExposureGetFilterSchema = Type.Object({
72
+ status: Type.Optional(ExposureStatus),
73
+ type: Type.Optional(ExposureType),
74
+ }, { additionalProperties: false });
75
+ export const ExposureGetSchema = Type.Union([
76
+ Type.Object({
77
+ id: Type.String({ minLength: 1 }),
78
+ fields: Type.Optional(ExposureGetFieldsSchema),
79
+ opts: Type.Optional(ExposureGetOptsSchema),
80
+ }, { additionalProperties: false }),
81
+ Type.Object({
82
+ ids: Type.Array(Type.String({ minLength: 1 }), { minItems: 1, maxItems: 4096 }),
83
+ fields: Type.Optional(ExposureGetFieldsSchema),
84
+ opts: Type.Optional(ExposureGetOptsSchema),
85
+ }, { additionalProperties: false }),
86
+ Type.Object({
87
+ filter: ExposureGetFilterSchema,
88
+ fields: Type.Optional(ExposureGetFieldsSchema),
89
+ opts: Type.Optional(ExposureGetOptsSchema),
90
+ }, { additionalProperties: false }),
91
+ ], { description: "Get one/many exposures, or query by filter" });
92
+ const ExposureStopOptsSchema = Type.Object({
93
+ reason: Type.Optional(Type.String()),
94
+ }, { additionalProperties: false });
95
+ export const ExposureStopSchema = Type.Union([
96
+ Type.Object({
97
+ id: Type.String({
98
+ minLength: 1,
99
+ description: `Exposure id or "all"`,
100
+ }),
101
+ opts: Type.Optional(ExposureStopOptsSchema),
102
+ }, { additionalProperties: false }),
103
+ Type.Object({
104
+ ids: Type.Array(Type.String({ minLength: 1 }), { minItems: 1, maxItems: 4096 }),
105
+ opts: Type.Optional(ExposureStopOptsSchema),
106
+ }, { additionalProperties: false }),
107
+ ], { description: "Stop one/many exposures, or all" });
108
+ const ExposureLogsOptsSchema = Type.Object({
109
+ lines: Type.Optional(Type.Number({ minimum: 1, maximum: 10_000 })),
110
+ since_seconds: Type.Optional(Type.Number({ minimum: 1, maximum: 365 * 24 * 3600 })),
111
+ component: Type.Optional(ComponentMode),
112
+ }, { additionalProperties: false });
113
+ export const ExposureLogsSchema = Type.Union([
114
+ Type.Object({
115
+ id: Type.String({ minLength: 1 }),
116
+ opts: Type.Optional(ExposureLogsOptsSchema),
117
+ }, { additionalProperties: false }),
118
+ Type.Object({
119
+ ids: Type.Array(Type.String({ minLength: 1 }), { minItems: 1, maxItems: 4096 }),
120
+ opts: Type.Optional(ExposureLogsOptsSchema),
121
+ }, { additionalProperties: false }),
122
+ ], { description: "Read logs for one/many exposures" });
123
+ export const MaintenanceSchema = Type.Object({
124
+ action: MaintenanceAction,
125
+ opts: Type.Optional(Type.Object({
126
+ policy: Type.Optional(Type.Any({ description: "Policy patch object" })),
127
+ ignore_patterns: Type.Optional(Type.Array(Type.String(), { minItems: 1, maxItems: 4096 })),
128
+ }, { additionalProperties: false })),
129
+ }, { additionalProperties: false });
130
+ export const AuditQuerySchema = Type.Object({
131
+ filters: Type.Optional(Type.Object({
132
+ id: Type.Optional(Type.String()),
133
+ event: Type.Optional(Type.String()),
134
+ type: Type.Optional(ExposureType),
135
+ from_ts: Type.Optional(Type.String({ description: "ISO timestamp" })),
136
+ to_ts: Type.Optional(Type.String({ description: "ISO timestamp" })),
137
+ limit: Type.Optional(Type.Number({ minimum: 1, maximum: 10000 })),
138
+ }, { additionalProperties: false })),
139
+ }, { additionalProperties: false });
140
+ export const AuditExportSchema = Type.Object({
141
+ range: Type.Optional(Type.Object({
142
+ from_ts: Type.Optional(Type.String({ description: "ISO timestamp" })),
143
+ to_ts: Type.Optional(Type.String({ description: "ISO timestamp" })),
144
+ id: Type.Optional(Type.String()),
145
+ event: Type.Optional(Type.String()),
146
+ type: Type.Optional(ExposureType),
147
+ output_path: Type.Optional(Type.String()),
148
+ }, { additionalProperties: false })),
149
+ }, { additionalProperties: false });
@@ -0,0 +1,12 @@
1
+ import type { FilePresentationMode, ManifestEntry } from "../types.js";
2
+ type RenderFileExplorerTemplateParams = {
3
+ title: string;
4
+ mode: "normal" | "zip";
5
+ presentation: FilePresentationMode;
6
+ manifest: ManifestEntry[];
7
+ autoEnterSingleDirectory?: boolean;
8
+ rootDirectories?: string[];
9
+ };
10
+ export declare function renderFileExplorerTemplate(params: RenderFileExplorerTemplateParams): string;
11
+ export {};
12
+ //# sourceMappingURL=fileExplorerTemplate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileExplorerTemplate.d.ts","sourceRoot":"","sources":["../../../src/templates/fileExplorerTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWvE,KAAK,gCAAgC,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,YAAY,EAAE,oBAAoB,CAAC;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gCAAgC,GAAG,MAAM,CAuzC3F"}