@camstack/core 0.1.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.
@@ -0,0 +1,143 @@
1
+ import { ModelDownloadOptions, ModelDownloadResult, IPythonEnvironment, PythonProbeResult, PythonEnvReady, AddonDeclaration, ICamstackAddon, AddonContext, PipelineConfig, FrameInput, PipelineResult } from '@camstack/types';
2
+ import { ChildProcess } from 'node:child_process';
3
+
4
+ type EventCallback<T = unknown> = (data: T) => void;
5
+ declare class EventBus {
6
+ private listeners;
7
+ on<T = unknown>(event: string, callback: EventCallback<T>): () => void;
8
+ emit<T = unknown>(event: string, data: T): void;
9
+ once<T = unknown>(event: string, callback: EventCallback<T>): () => void;
10
+ removeAllListeners(event?: string): void;
11
+ listenerCount(event: string): number;
12
+ }
13
+
14
+ declare function downloadModel(options: ModelDownloadOptions): Promise<ModelDownloadResult>;
15
+
16
+ declare class PythonEnvManager implements IPythonEnvironment {
17
+ private readonly dataDir;
18
+ private venvPath;
19
+ private cachedProbe;
20
+ constructor(dataDir: string);
21
+ probe(): Promise<PythonProbeResult>;
22
+ ensure(options: {
23
+ packages: readonly string[];
24
+ }): Promise<PythonEnvReady>;
25
+ spawn(script: string, args: readonly string[]): ChildProcess;
26
+ }
27
+
28
+ interface AddonInstallerConfig {
29
+ /** Directory where addons are installed (e.g., ~/.camstack/addons or {dataDir}/addons) */
30
+ readonly addonsDir: string;
31
+ /** Builtin packages to auto-install on first boot */
32
+ readonly builtinPackages: readonly string[];
33
+ /** npm registry URL (default: https://registry.npmjs.org) */
34
+ readonly registry?: string;
35
+ }
36
+ interface InstalledPackage {
37
+ readonly name: string;
38
+ readonly version: string;
39
+ readonly path: string;
40
+ }
41
+ declare class AddonInstaller {
42
+ private readonly config;
43
+ constructor(config: AddonInstallerConfig);
44
+ /** Initialize addon directory — create if not exists, install builtins if needed */
45
+ initialize(): Promise<void>;
46
+ /** Ensure addon directory exists with a package.json */
47
+ private ensureAddonDirectory;
48
+ /** Install builtin packages if not already present */
49
+ private installBuiltins;
50
+ /** Check if a package is installed */
51
+ isInstalled(packageName: string): boolean;
52
+ /** Get installed package info */
53
+ getInstalledPackage(packageName: string): InstalledPackage | null;
54
+ /** List all installed addon packages (those with camstack.addons in package.json) */
55
+ listInstalled(): InstalledPackage[];
56
+ /** Install one or more packages from npm */
57
+ installPackages(packages: readonly string[]): Promise<void>;
58
+ /** Uninstall a package */
59
+ uninstallPackage(packageName: string): Promise<void>;
60
+ /** Update a package to latest version */
61
+ updatePackage(packageName: string): Promise<void>;
62
+ /** Update all packages */
63
+ updateAll(): Promise<void>;
64
+ /** Get the node_modules path for require/import resolution */
65
+ getNodeModulesPath(): string;
66
+ }
67
+ /** Default builtin packages that are auto-installed */
68
+ declare const BUILTIN_PACKAGES: readonly string[];
69
+
70
+ interface RegisteredAddon {
71
+ readonly declaration: AddonDeclaration;
72
+ readonly packageName: string;
73
+ readonly addonClass: new () => ICamstackAddon;
74
+ }
75
+ declare class AddonLoader {
76
+ private addons;
77
+ /** Load all addons from an npm package */
78
+ loadPackage(packageName: string): Promise<void>;
79
+ /** Load addon from a direct path (for development/testing) */
80
+ loadFromPath(addonId: string, modulePath: string, packageName: string): Promise<void>;
81
+ /** Get a registered addon by ID */
82
+ getAddon(addonId: string): RegisteredAddon | undefined;
83
+ /** List all registered addons */
84
+ listAddons(): RegisteredAddon[];
85
+ /** Check if an addon is registered */
86
+ hasAddon(addonId: string): boolean;
87
+ /** Create a new instance of an addon (not yet initialized) */
88
+ createInstance(addonId: string): ICamstackAddon;
89
+ /** Load all installed addon packages from the addon directory */
90
+ loadAllInstalled(installer: AddonInstaller): Promise<void>;
91
+ /** Load addon package from a specific filesystem path */
92
+ loadPackageFromPath(packageName: string, packagePath: string): Promise<void>;
93
+ }
94
+
95
+ declare class AddonEngineManager {
96
+ private readonly loader;
97
+ private readonly baseContext;
98
+ private engines;
99
+ constructor(loader: AddonLoader, baseContext: Omit<AddonContext, 'addonConfig'>);
100
+ /**
101
+ * Get or create an addon engine for the given effective config.
102
+ * Cameras with the same addonId + effective config share the same engine.
103
+ */
104
+ getOrCreateEngine(addonId: string, globalConfig: Record<string, unknown>, cameraOverride?: Record<string, unknown>): Promise<ICamstackAddon>;
105
+ /** Get all active engines */
106
+ getActiveEngines(): Map<string, ICamstackAddon>;
107
+ /** Shutdown a specific engine by its config key */
108
+ shutdownEngine(configKey: string): Promise<void>;
109
+ /** Shutdown all engines */
110
+ shutdownAll(): Promise<void>;
111
+ /** Compute a deterministic config key (visible for tests) */
112
+ computeConfigKey(addonId: string, effectiveConfig: Record<string, unknown>): string;
113
+ private hashConfig;
114
+ }
115
+
116
+ interface ValidationIssue {
117
+ readonly step?: string;
118
+ readonly addon?: string;
119
+ readonly message: string;
120
+ readonly severity: 'error' | 'warning';
121
+ }
122
+ interface ValidationResult {
123
+ readonly valid: boolean;
124
+ readonly errors: readonly ValidationIssue[];
125
+ readonly warnings: readonly ValidationIssue[];
126
+ }
127
+ declare class PipelineValidator {
128
+ private readonly loader;
129
+ constructor(loader: AddonLoader);
130
+ validate(config: PipelineConfig): ValidationResult;
131
+ private validateNode;
132
+ }
133
+
134
+ declare class PipelineRunner {
135
+ private readonly engineManager;
136
+ private readonly addonConfigs;
137
+ constructor(engineManager: AddonEngineManager, addonConfigs: Map<string, Record<string, unknown>>);
138
+ run(frame: FrameInput, config: PipelineConfig): Promise<PipelineResult>;
139
+ private executeNode;
140
+ private executeChildren;
141
+ }
142
+
143
+ export { AddonEngineManager, AddonInstaller, type AddonInstallerConfig, AddonLoader, BUILTIN_PACKAGES, EventBus, type InstalledPackage, PipelineRunner, PipelineValidator, PythonEnvManager, type RegisteredAddon, type ValidationIssue, type ValidationResult, downloadModel };
@@ -0,0 +1,143 @@
1
+ import { ModelDownloadOptions, ModelDownloadResult, IPythonEnvironment, PythonProbeResult, PythonEnvReady, AddonDeclaration, ICamstackAddon, AddonContext, PipelineConfig, FrameInput, PipelineResult } from '@camstack/types';
2
+ import { ChildProcess } from 'node:child_process';
3
+
4
+ type EventCallback<T = unknown> = (data: T) => void;
5
+ declare class EventBus {
6
+ private listeners;
7
+ on<T = unknown>(event: string, callback: EventCallback<T>): () => void;
8
+ emit<T = unknown>(event: string, data: T): void;
9
+ once<T = unknown>(event: string, callback: EventCallback<T>): () => void;
10
+ removeAllListeners(event?: string): void;
11
+ listenerCount(event: string): number;
12
+ }
13
+
14
+ declare function downloadModel(options: ModelDownloadOptions): Promise<ModelDownloadResult>;
15
+
16
+ declare class PythonEnvManager implements IPythonEnvironment {
17
+ private readonly dataDir;
18
+ private venvPath;
19
+ private cachedProbe;
20
+ constructor(dataDir: string);
21
+ probe(): Promise<PythonProbeResult>;
22
+ ensure(options: {
23
+ packages: readonly string[];
24
+ }): Promise<PythonEnvReady>;
25
+ spawn(script: string, args: readonly string[]): ChildProcess;
26
+ }
27
+
28
+ interface AddonInstallerConfig {
29
+ /** Directory where addons are installed (e.g., ~/.camstack/addons or {dataDir}/addons) */
30
+ readonly addonsDir: string;
31
+ /** Builtin packages to auto-install on first boot */
32
+ readonly builtinPackages: readonly string[];
33
+ /** npm registry URL (default: https://registry.npmjs.org) */
34
+ readonly registry?: string;
35
+ }
36
+ interface InstalledPackage {
37
+ readonly name: string;
38
+ readonly version: string;
39
+ readonly path: string;
40
+ }
41
+ declare class AddonInstaller {
42
+ private readonly config;
43
+ constructor(config: AddonInstallerConfig);
44
+ /** Initialize addon directory — create if not exists, install builtins if needed */
45
+ initialize(): Promise<void>;
46
+ /** Ensure addon directory exists with a package.json */
47
+ private ensureAddonDirectory;
48
+ /** Install builtin packages if not already present */
49
+ private installBuiltins;
50
+ /** Check if a package is installed */
51
+ isInstalled(packageName: string): boolean;
52
+ /** Get installed package info */
53
+ getInstalledPackage(packageName: string): InstalledPackage | null;
54
+ /** List all installed addon packages (those with camstack.addons in package.json) */
55
+ listInstalled(): InstalledPackage[];
56
+ /** Install one or more packages from npm */
57
+ installPackages(packages: readonly string[]): Promise<void>;
58
+ /** Uninstall a package */
59
+ uninstallPackage(packageName: string): Promise<void>;
60
+ /** Update a package to latest version */
61
+ updatePackage(packageName: string): Promise<void>;
62
+ /** Update all packages */
63
+ updateAll(): Promise<void>;
64
+ /** Get the node_modules path for require/import resolution */
65
+ getNodeModulesPath(): string;
66
+ }
67
+ /** Default builtin packages that are auto-installed */
68
+ declare const BUILTIN_PACKAGES: readonly string[];
69
+
70
+ interface RegisteredAddon {
71
+ readonly declaration: AddonDeclaration;
72
+ readonly packageName: string;
73
+ readonly addonClass: new () => ICamstackAddon;
74
+ }
75
+ declare class AddonLoader {
76
+ private addons;
77
+ /** Load all addons from an npm package */
78
+ loadPackage(packageName: string): Promise<void>;
79
+ /** Load addon from a direct path (for development/testing) */
80
+ loadFromPath(addonId: string, modulePath: string, packageName: string): Promise<void>;
81
+ /** Get a registered addon by ID */
82
+ getAddon(addonId: string): RegisteredAddon | undefined;
83
+ /** List all registered addons */
84
+ listAddons(): RegisteredAddon[];
85
+ /** Check if an addon is registered */
86
+ hasAddon(addonId: string): boolean;
87
+ /** Create a new instance of an addon (not yet initialized) */
88
+ createInstance(addonId: string): ICamstackAddon;
89
+ /** Load all installed addon packages from the addon directory */
90
+ loadAllInstalled(installer: AddonInstaller): Promise<void>;
91
+ /** Load addon package from a specific filesystem path */
92
+ loadPackageFromPath(packageName: string, packagePath: string): Promise<void>;
93
+ }
94
+
95
+ declare class AddonEngineManager {
96
+ private readonly loader;
97
+ private readonly baseContext;
98
+ private engines;
99
+ constructor(loader: AddonLoader, baseContext: Omit<AddonContext, 'addonConfig'>);
100
+ /**
101
+ * Get or create an addon engine for the given effective config.
102
+ * Cameras with the same addonId + effective config share the same engine.
103
+ */
104
+ getOrCreateEngine(addonId: string, globalConfig: Record<string, unknown>, cameraOverride?: Record<string, unknown>): Promise<ICamstackAddon>;
105
+ /** Get all active engines */
106
+ getActiveEngines(): Map<string, ICamstackAddon>;
107
+ /** Shutdown a specific engine by its config key */
108
+ shutdownEngine(configKey: string): Promise<void>;
109
+ /** Shutdown all engines */
110
+ shutdownAll(): Promise<void>;
111
+ /** Compute a deterministic config key (visible for tests) */
112
+ computeConfigKey(addonId: string, effectiveConfig: Record<string, unknown>): string;
113
+ private hashConfig;
114
+ }
115
+
116
+ interface ValidationIssue {
117
+ readonly step?: string;
118
+ readonly addon?: string;
119
+ readonly message: string;
120
+ readonly severity: 'error' | 'warning';
121
+ }
122
+ interface ValidationResult {
123
+ readonly valid: boolean;
124
+ readonly errors: readonly ValidationIssue[];
125
+ readonly warnings: readonly ValidationIssue[];
126
+ }
127
+ declare class PipelineValidator {
128
+ private readonly loader;
129
+ constructor(loader: AddonLoader);
130
+ validate(config: PipelineConfig): ValidationResult;
131
+ private validateNode;
132
+ }
133
+
134
+ declare class PipelineRunner {
135
+ private readonly engineManager;
136
+ private readonly addonConfigs;
137
+ constructor(engineManager: AddonEngineManager, addonConfigs: Map<string, Record<string, unknown>>);
138
+ run(frame: FrameInput, config: PipelineConfig): Promise<PipelineResult>;
139
+ private executeNode;
140
+ private executeChildren;
141
+ }
142
+
143
+ export { AddonEngineManager, AddonInstaller, type AddonInstallerConfig, AddonLoader, BUILTIN_PACKAGES, EventBus, type InstalledPackage, PipelineRunner, PipelineValidator, PythonEnvManager, type RegisteredAddon, type ValidationIssue, type ValidationResult, downloadModel };