@mobtakronio/capskit 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MobtakronIO
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # CapsKit 💊
2
+
3
+ **The Universal Capability Kernel** — Break free from controllers. Package your business logic into pure, swappable capsules that run identically via HTTP, Event Bus, CLI, or internal routines.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@mobtakronio/capskit.svg)](https://www.npmjs.com/package/@mobtakronio/capskit)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## 🚀 Why CapsKit?
9
+
10
+ Traditional architectures tightly couple business logic to the transport layer (Controllers/Request objects). This makes it hard to reuse logic in CRON jobs, background workers, or CLIs.
11
+
12
+ CapsKit implements the **Capability Architecture** pattern:
13
+ - **Zero Boundary Logic**: Capsules don't know about HTTP or Frameworks.
14
+ - **Declarative Manifests**: Routing, Traits, and Events are defined in simple metadata.
15
+ - **Universal Pipelines**: Global Interceptors and Action-level Hooks for tracing, auth, and more.
16
+
17
+ ## 📦 Installation
18
+
19
+ ```bash
20
+ npm install @mobtakronio/capskit elysia
21
+ # or
22
+ bun add @mobtakronio/capskit elysia
23
+ ```
24
+
25
+ ## 🛠️ Quick Start
26
+
27
+ ### 1. Define a Capsule
28
+
29
+ ```typescript
30
+ // capsules/calculator/manifest.ts
31
+ import { CapsuleManifest } from '@mobtakronio/capskit';
32
+
33
+ export const service: CapsuleManifest = {
34
+ name: 'calculator',
35
+ actions: {
36
+ sum: {
37
+ handler: async (payload) => ({ result: payload.a + payload.b }),
38
+ description: 'Adds two numbers'
39
+ }
40
+ },
41
+ routes: [
42
+ { method: 'POST', path: '/sum', action: 'sum' }
43
+ ]
44
+ };
45
+ ```
46
+
47
+ ### 2. Boot the Kernel
48
+
49
+ ```typescript
50
+ import { createCapsKit } from '@mobtakronio/capskit';
51
+ import { Elysia } from 'elysia';
52
+ import * as path from 'path';
53
+
54
+ const capskit = await createCapsKit({
55
+ capsuleDirs: [path.resolve('./capsules')],
56
+ dependencies: { db: myDatabase }
57
+ });
58
+
59
+ await capskit.start();
60
+
61
+ // Mount to Elysia automatically!
62
+ const { router } = await capskit.call('http.buildRouter', { adapter: 'elysia' });
63
+
64
+ new Elysia()
65
+ .use(router)
66
+ .listen(3000);
67
+ ```
68
+
69
+ ### 3. Native Invocation (Proxy Client)
70
+
71
+ ```typescript
72
+ const calculator = capskit.use('calculator');
73
+ const { result } = await calculator.sum({ a: 10, b: 20 });
74
+ ```
75
+
76
+ ## 📖 Documentation
77
+
78
+ Visit [capskit.io](https://capskit.io) (Coming Soon!) or check the `/docs` folder for the full guide.
79
+
80
+ ## 📄 License
81
+
82
+ MIT © 2026 CapsKit Team / MobtakronIO
package/dist/index.cjs ADDED
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ CapsKit: () => CapsKit,
34
+ createCapsKit: () => createCapsKit,
35
+ loadCapsules: () => loadCapsules
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/kernel/platform.ts
40
+ var path2 = __toESM(require("path"), 1);
41
+
42
+ // src/kernel/loader.ts
43
+ var fs = __toESM(require("fs"), 1);
44
+ var path = __toESM(require("path"), 1);
45
+ async function loadCapsules(capsulesDir) {
46
+ const manifests = [];
47
+ if (!fs.existsSync(capsulesDir)) {
48
+ return manifests;
49
+ }
50
+ const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });
51
+ for (const entry of entries) {
52
+ if (entry.isDirectory()) {
53
+ const manifestPath = path.join(capsulesDir, entry.name, "manifest.ts");
54
+ const manifestJsPath = path.join(capsulesDir, entry.name, "manifest.js");
55
+ let finalPath = "";
56
+ if (fs.existsSync(manifestPath)) {
57
+ finalPath = manifestPath;
58
+ } else if (fs.existsSync(manifestJsPath)) {
59
+ finalPath = manifestJsPath;
60
+ }
61
+ if (finalPath) {
62
+ try {
63
+ console.log(finalPath);
64
+ const module2 = await import(`file://${finalPath}`);
65
+ const manifest = module2.service || module2.manifest || module2.default;
66
+ if (manifest) {
67
+ manifests.push(manifest);
68
+ }
69
+ } catch (error) {
70
+ console.error(`Failed to load manifest at ${finalPath}:`, error);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return manifests;
76
+ }
77
+
78
+ // src/kernel/platform.ts
79
+ var CapsKit = class {
80
+ constructor(config) {
81
+ this.config = config;
82
+ this.dependencies = {
83
+ ...config.dependencies,
84
+ capskit: this
85
+ };
86
+ }
87
+ actions = /* @__PURE__ */ new Map();
88
+ manifests = /* @__PURE__ */ new Map();
89
+ interceptors = [];
90
+ eventRegistry = /* @__PURE__ */ new Map();
91
+ dependencies = {};
92
+ async start() {
93
+ if (this.config.capsuleDirs) {
94
+ for (const dir of this.config.capsuleDirs) {
95
+ const absoluteDir = path2.resolve(dir);
96
+ const manifests = await loadCapsules(absoluteDir);
97
+ for (const manifest of manifests) {
98
+ this.registerCapsule(manifest);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ registerCapsule(manifest) {
104
+ this.validateDependencies(manifest);
105
+ this.manifests.set(manifest.name, manifest);
106
+ for (const [actionName, definition] of Object.entries(manifest.actions)) {
107
+ const fullName = `${manifest.name}.${actionName}`;
108
+ if (typeof definition.handler === "function") {
109
+ this.actions.set(fullName, definition);
110
+ } else {
111
+ }
112
+ }
113
+ if (manifest.events?.subscribes) {
114
+ for (const sub of manifest.events.subscribes) {
115
+ const targetAction = `${manifest.name}.${sub.action}`;
116
+ const existing = this.eventRegistry.get(sub.event) || [];
117
+ existing.push(targetAction);
118
+ this.eventRegistry.set(sub.event, existing);
119
+ }
120
+ }
121
+ }
122
+ validateDependencies(manifest) {
123
+ if (manifest.requires) {
124
+ for (const dep of manifest.requires) {
125
+ if (!this.dependencies[dep]) {
126
+ throw new Error(`Capsule "${manifest.name}" requires dependency "${dep}" which is not provided.`);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ addInterceptor(interceptor) {
132
+ this.interceptors.push(interceptor);
133
+ }
134
+ async call(actionName, payload) {
135
+ const actionDef = this.actions.get(actionName);
136
+ if (!actionDef) {
137
+ throw new Error(`Action "${actionName}" not found.`);
138
+ }
139
+ const handler = actionDef.handler;
140
+ const context = {
141
+ params: payload?.params,
142
+ body: payload?.body,
143
+ query: payload?.query,
144
+ deps: this.dependencies,
145
+ emit: this.emit.bind(this),
146
+ call: this.call.bind(this),
147
+ use: this.use.bind(this)
148
+ };
149
+ let index = -1;
150
+ const dispatch = async (i) => {
151
+ if (i <= index) throw new Error("next() called multiple times");
152
+ index = i;
153
+ if (i === this.interceptors.length) {
154
+ if (actionDef.pre) {
155
+ for (const hook of actionDef.pre) {
156
+ await hook(payload, context);
157
+ }
158
+ }
159
+ let result = await handler(payload, context);
160
+ if (actionDef.post) {
161
+ for (const hook of actionDef.post) {
162
+ const hookResult = await hook(payload, result, context);
163
+ if (hookResult !== void 0) {
164
+ result = hookResult;
165
+ }
166
+ }
167
+ }
168
+ return result;
169
+ }
170
+ const interceptor = this.interceptors[i];
171
+ return interceptor(actionName, payload, context, () => dispatch(i + 1));
172
+ };
173
+ return dispatch(0);
174
+ }
175
+ use(capsuleName) {
176
+ return new Proxy({}, {
177
+ get: (_, actionName) => {
178
+ return async (payload) => {
179
+ const actionPath = `${capsuleName}.${String(actionName)}`;
180
+ return this.call(actionPath, payload);
181
+ };
182
+ }
183
+ });
184
+ }
185
+ describe(capsuleName) {
186
+ return this.manifests.get(capsuleName);
187
+ }
188
+ emit(event, data) {
189
+ console.log(`[Event Bus] Emitted: ${event}`);
190
+ const subscribers = this.eventRegistry.get(event);
191
+ if (subscribers) {
192
+ for (const actionName of subscribers) {
193
+ this.call(actionName, data).catch((err) => {
194
+ console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);
195
+ });
196
+ }
197
+ }
198
+ }
199
+ // Helper for internal registry access (used by system capsule later)
200
+ getManifests() {
201
+ return Array.from(this.manifests.values());
202
+ }
203
+ };
204
+ async function createCapsKit(config) {
205
+ return new CapsKit(config);
206
+ }
207
+ // Annotate the CommonJS export names for ESM import in node:
208
+ 0 && (module.exports = {
209
+ CapsKit,
210
+ createCapsKit,
211
+ loadCapsules
212
+ });
213
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["export * from './kernel/platform';\r\nexport { loadCapsules } from './kernel/loader';\r\nexport * from './types';\r\n","import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<CapsKit> {\r\n return new CapsKit(config);\r\n}\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":"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","names":["path","module"]}
@@ -0,0 +1,76 @@
1
+ interface CapsuleManifest {
2
+ name: string;
3
+ requires?: string[];
4
+ actions: Record<string, ActionDefinition>;
5
+ events?: {
6
+ publishes?: string[];
7
+ subscribes?: EventSubscription[];
8
+ };
9
+ routes?: RouteDefinition[];
10
+ }
11
+ type ActionPreHook = (payload: any, context: ActionContext) => Promise<void> | void;
12
+ type ActionPostHook = (payload: any, result: any, context: ActionContext) => Promise<any> | any;
13
+ interface ActionDefinition {
14
+ handler: string | ActionHandler;
15
+ description?: string;
16
+ pre?: ActionPreHook[];
17
+ post?: ActionPostHook[];
18
+ }
19
+ type ActionHandler = (input: any, context: ActionContext) => Promise<any>;
20
+ type ActionInterceptor = (actionName: string, payload: any, context: ActionContext, next: () => Promise<any>) => Promise<any>;
21
+ interface ActionContext {
22
+ params?: any;
23
+ body?: any;
24
+ query?: any;
25
+ deps: Record<string, any>;
26
+ emit: (event: string, data: any) => void;
27
+ call: (action: string, payload: any) => Promise<any>;
28
+ use: <TCapsule = any>(capsuleName: string) => TCapsule;
29
+ }
30
+ interface EventSubscription {
31
+ event: string;
32
+ action: string;
33
+ }
34
+ interface RouteDefinition {
35
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
36
+ path: string;
37
+ action: string;
38
+ schema?: any;
39
+ traits?: Record<string, any>;
40
+ }
41
+ interface CapsKitConfig {
42
+ capsuleDirs?: string[];
43
+ dependencies?: Record<string, any>;
44
+ }
45
+ interface ICapsKit {
46
+ start(): Promise<void>;
47
+ call(actionName: string, payload: any): Promise<any>;
48
+ use<TCapsule = any>(capsuleName: string): TCapsule;
49
+ describe(capsuleName: string): CapsuleManifest | undefined;
50
+ emit(event: string, data: any): void;
51
+ addInterceptor(interceptor: ActionInterceptor): void;
52
+ }
53
+
54
+ declare class CapsKit implements ICapsKit {
55
+ private config;
56
+ private actions;
57
+ private manifests;
58
+ private interceptors;
59
+ private eventRegistry;
60
+ private dependencies;
61
+ constructor(config: CapsKitConfig);
62
+ start(): Promise<void>;
63
+ private registerCapsule;
64
+ private validateDependencies;
65
+ addInterceptor(interceptor: ActionInterceptor): void;
66
+ call(actionName: string, payload: any): Promise<any>;
67
+ use<TCapsule = any>(capsuleName: string): TCapsule;
68
+ describe(capsuleName: string): CapsuleManifest | undefined;
69
+ emit(event: string, data: any): void;
70
+ getManifests(): CapsuleManifest[];
71
+ }
72
+ declare function createCapsKit(config: CapsKitConfig): Promise<CapsKit>;
73
+
74
+ declare function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]>;
75
+
76
+ export { type ActionContext, type ActionDefinition, type ActionHandler, type ActionInterceptor, type ActionPostHook, type ActionPreHook, CapsKit, type CapsKitConfig, type CapsuleManifest, type EventSubscription, type ICapsKit, type RouteDefinition, createCapsKit, loadCapsules };
@@ -0,0 +1,76 @@
1
+ interface CapsuleManifest {
2
+ name: string;
3
+ requires?: string[];
4
+ actions: Record<string, ActionDefinition>;
5
+ events?: {
6
+ publishes?: string[];
7
+ subscribes?: EventSubscription[];
8
+ };
9
+ routes?: RouteDefinition[];
10
+ }
11
+ type ActionPreHook = (payload: any, context: ActionContext) => Promise<void> | void;
12
+ type ActionPostHook = (payload: any, result: any, context: ActionContext) => Promise<any> | any;
13
+ interface ActionDefinition {
14
+ handler: string | ActionHandler;
15
+ description?: string;
16
+ pre?: ActionPreHook[];
17
+ post?: ActionPostHook[];
18
+ }
19
+ type ActionHandler = (input: any, context: ActionContext) => Promise<any>;
20
+ type ActionInterceptor = (actionName: string, payload: any, context: ActionContext, next: () => Promise<any>) => Promise<any>;
21
+ interface ActionContext {
22
+ params?: any;
23
+ body?: any;
24
+ query?: any;
25
+ deps: Record<string, any>;
26
+ emit: (event: string, data: any) => void;
27
+ call: (action: string, payload: any) => Promise<any>;
28
+ use: <TCapsule = any>(capsuleName: string) => TCapsule;
29
+ }
30
+ interface EventSubscription {
31
+ event: string;
32
+ action: string;
33
+ }
34
+ interface RouteDefinition {
35
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
36
+ path: string;
37
+ action: string;
38
+ schema?: any;
39
+ traits?: Record<string, any>;
40
+ }
41
+ interface CapsKitConfig {
42
+ capsuleDirs?: string[];
43
+ dependencies?: Record<string, any>;
44
+ }
45
+ interface ICapsKit {
46
+ start(): Promise<void>;
47
+ call(actionName: string, payload: any): Promise<any>;
48
+ use<TCapsule = any>(capsuleName: string): TCapsule;
49
+ describe(capsuleName: string): CapsuleManifest | undefined;
50
+ emit(event: string, data: any): void;
51
+ addInterceptor(interceptor: ActionInterceptor): void;
52
+ }
53
+
54
+ declare class CapsKit implements ICapsKit {
55
+ private config;
56
+ private actions;
57
+ private manifests;
58
+ private interceptors;
59
+ private eventRegistry;
60
+ private dependencies;
61
+ constructor(config: CapsKitConfig);
62
+ start(): Promise<void>;
63
+ private registerCapsule;
64
+ private validateDependencies;
65
+ addInterceptor(interceptor: ActionInterceptor): void;
66
+ call(actionName: string, payload: any): Promise<any>;
67
+ use<TCapsule = any>(capsuleName: string): TCapsule;
68
+ describe(capsuleName: string): CapsuleManifest | undefined;
69
+ emit(event: string, data: any): void;
70
+ getManifests(): CapsuleManifest[];
71
+ }
72
+ declare function createCapsKit(config: CapsKitConfig): Promise<CapsKit>;
73
+
74
+ declare function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]>;
75
+
76
+ export { type ActionContext, type ActionDefinition, type ActionHandler, type ActionInterceptor, type ActionPostHook, type ActionPreHook, CapsKit, type CapsKitConfig, type CapsuleManifest, type EventSubscription, type ICapsKit, type RouteDefinition, createCapsKit, loadCapsules };
package/dist/index.js ADDED
@@ -0,0 +1,174 @@
1
+ // src/kernel/platform.ts
2
+ import * as path2 from "path";
3
+
4
+ // src/kernel/loader.ts
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+ async function loadCapsules(capsulesDir) {
8
+ const manifests = [];
9
+ if (!fs.existsSync(capsulesDir)) {
10
+ return manifests;
11
+ }
12
+ const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });
13
+ for (const entry of entries) {
14
+ if (entry.isDirectory()) {
15
+ const manifestPath = path.join(capsulesDir, entry.name, "manifest.ts");
16
+ const manifestJsPath = path.join(capsulesDir, entry.name, "manifest.js");
17
+ let finalPath = "";
18
+ if (fs.existsSync(manifestPath)) {
19
+ finalPath = manifestPath;
20
+ } else if (fs.existsSync(manifestJsPath)) {
21
+ finalPath = manifestJsPath;
22
+ }
23
+ if (finalPath) {
24
+ try {
25
+ console.log(finalPath);
26
+ const module = await import(`file://${finalPath}`);
27
+ const manifest = module.service || module.manifest || module.default;
28
+ if (manifest) {
29
+ manifests.push(manifest);
30
+ }
31
+ } catch (error) {
32
+ console.error(`Failed to load manifest at ${finalPath}:`, error);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ return manifests;
38
+ }
39
+
40
+ // src/kernel/platform.ts
41
+ var CapsKit = class {
42
+ constructor(config) {
43
+ this.config = config;
44
+ this.dependencies = {
45
+ ...config.dependencies,
46
+ capskit: this
47
+ };
48
+ }
49
+ actions = /* @__PURE__ */ new Map();
50
+ manifests = /* @__PURE__ */ new Map();
51
+ interceptors = [];
52
+ eventRegistry = /* @__PURE__ */ new Map();
53
+ dependencies = {};
54
+ async start() {
55
+ if (this.config.capsuleDirs) {
56
+ for (const dir of this.config.capsuleDirs) {
57
+ const absoluteDir = path2.resolve(dir);
58
+ const manifests = await loadCapsules(absoluteDir);
59
+ for (const manifest of manifests) {
60
+ this.registerCapsule(manifest);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ registerCapsule(manifest) {
66
+ this.validateDependencies(manifest);
67
+ this.manifests.set(manifest.name, manifest);
68
+ for (const [actionName, definition] of Object.entries(manifest.actions)) {
69
+ const fullName = `${manifest.name}.${actionName}`;
70
+ if (typeof definition.handler === "function") {
71
+ this.actions.set(fullName, definition);
72
+ } else {
73
+ }
74
+ }
75
+ if (manifest.events?.subscribes) {
76
+ for (const sub of manifest.events.subscribes) {
77
+ const targetAction = `${manifest.name}.${sub.action}`;
78
+ const existing = this.eventRegistry.get(sub.event) || [];
79
+ existing.push(targetAction);
80
+ this.eventRegistry.set(sub.event, existing);
81
+ }
82
+ }
83
+ }
84
+ validateDependencies(manifest) {
85
+ if (manifest.requires) {
86
+ for (const dep of manifest.requires) {
87
+ if (!this.dependencies[dep]) {
88
+ throw new Error(`Capsule "${manifest.name}" requires dependency "${dep}" which is not provided.`);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ addInterceptor(interceptor) {
94
+ this.interceptors.push(interceptor);
95
+ }
96
+ async call(actionName, payload) {
97
+ const actionDef = this.actions.get(actionName);
98
+ if (!actionDef) {
99
+ throw new Error(`Action "${actionName}" not found.`);
100
+ }
101
+ const handler = actionDef.handler;
102
+ const context = {
103
+ params: payload?.params,
104
+ body: payload?.body,
105
+ query: payload?.query,
106
+ deps: this.dependencies,
107
+ emit: this.emit.bind(this),
108
+ call: this.call.bind(this),
109
+ use: this.use.bind(this)
110
+ };
111
+ let index = -1;
112
+ const dispatch = async (i) => {
113
+ if (i <= index) throw new Error("next() called multiple times");
114
+ index = i;
115
+ if (i === this.interceptors.length) {
116
+ if (actionDef.pre) {
117
+ for (const hook of actionDef.pre) {
118
+ await hook(payload, context);
119
+ }
120
+ }
121
+ let result = await handler(payload, context);
122
+ if (actionDef.post) {
123
+ for (const hook of actionDef.post) {
124
+ const hookResult = await hook(payload, result, context);
125
+ if (hookResult !== void 0) {
126
+ result = hookResult;
127
+ }
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ const interceptor = this.interceptors[i];
133
+ return interceptor(actionName, payload, context, () => dispatch(i + 1));
134
+ };
135
+ return dispatch(0);
136
+ }
137
+ use(capsuleName) {
138
+ return new Proxy({}, {
139
+ get: (_, actionName) => {
140
+ return async (payload) => {
141
+ const actionPath = `${capsuleName}.${String(actionName)}`;
142
+ return this.call(actionPath, payload);
143
+ };
144
+ }
145
+ });
146
+ }
147
+ describe(capsuleName) {
148
+ return this.manifests.get(capsuleName);
149
+ }
150
+ emit(event, data) {
151
+ console.log(`[Event Bus] Emitted: ${event}`);
152
+ const subscribers = this.eventRegistry.get(event);
153
+ if (subscribers) {
154
+ for (const actionName of subscribers) {
155
+ this.call(actionName, data).catch((err) => {
156
+ console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);
157
+ });
158
+ }
159
+ }
160
+ }
161
+ // Helper for internal registry access (used by system capsule later)
162
+ getManifests() {
163
+ return Array.from(this.manifests.values());
164
+ }
165
+ };
166
+ async function createCapsKit(config) {
167
+ return new CapsKit(config);
168
+ }
169
+ export {
170
+ CapsKit,
171
+ createCapsKit,
172
+ loadCapsules
173
+ };
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<CapsKit> {\r\n return new CapsKit(config);\r\n}\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":"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","names":["path"]}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@mobtakronio/capskit",
3
+ "version": "0.1.0",
4
+ "description": "The Universal Capability Kernel - A framework-agnostic runtime for pure business logic.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "bun test/verify.test.ts",
29
+ "docs:dev": "vitepress dev docs",
30
+ "docs:build": "vitepress build docs",
31
+ "docs:preview": "vitepress preview docs",
32
+ "prepublishOnly": "npm run build"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.4.0",
36
+ "elysia": "^1.4.27",
37
+ "tsup": "^8.5.1",
38
+ "tsx": "^4.21.0",
39
+ "typescript": "^5.9.3",
40
+ "vitepress": "^1.6.4",
41
+ "vue": "^3.5.30"
42
+ }
43
+ }