@kadi.build/core 0.0.1-alpha.3 → 0.0.1-alpha.4

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.
Files changed (128) hide show
  1. package/README.md +571 -594
  2. package/dist/KadiClient.d.ts +303 -0
  3. package/dist/KadiClient.d.ts.map +1 -0
  4. package/dist/KadiClient.js +1162 -0
  5. package/dist/KadiClient.js.map +1 -0
  6. package/dist/errors/error-codes.d.ts +215 -0
  7. package/dist/errors/error-codes.d.ts.map +1 -0
  8. package/dist/errors/error-codes.js +295 -0
  9. package/dist/errors/error-codes.js.map +1 -0
  10. package/dist/index.d.ts +15 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +24 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/loadAbility.d.ts +65 -0
  15. package/dist/loadAbility.d.ts.map +1 -0
  16. package/dist/loadAbility.js +335 -0
  17. package/dist/loadAbility.js.map +1 -0
  18. package/dist/messages/BrokerMessages.d.ts +84 -0
  19. package/dist/messages/BrokerMessages.d.ts.map +1 -0
  20. package/dist/messages/BrokerMessages.js +127 -0
  21. package/dist/messages/BrokerMessages.js.map +1 -0
  22. package/dist/messages/MessageBuilder.d.ts +83 -0
  23. package/dist/messages/MessageBuilder.d.ts.map +1 -0
  24. package/dist/messages/MessageBuilder.js +144 -0
  25. package/dist/messages/MessageBuilder.js.map +1 -0
  26. package/dist/schemas/events.schemas.d.ts +177 -0
  27. package/dist/schemas/events.schemas.d.ts.map +1 -0
  28. package/dist/schemas/events.schemas.js +265 -0
  29. package/dist/schemas/events.schemas.js.map +1 -0
  30. package/dist/schemas/index.d.ts +3 -0
  31. package/dist/schemas/index.d.ts.map +1 -0
  32. package/dist/schemas/index.js +4 -0
  33. package/dist/schemas/index.js.map +1 -0
  34. package/dist/schemas/kadi.schemas.d.ts +70 -0
  35. package/dist/schemas/kadi.schemas.d.ts.map +1 -0
  36. package/dist/schemas/kadi.schemas.js +120 -0
  37. package/dist/schemas/kadi.schemas.js.map +1 -0
  38. package/dist/transports/BrokerTransport.d.ts +96 -0
  39. package/dist/transports/BrokerTransport.d.ts.map +1 -0
  40. package/dist/transports/BrokerTransport.js +145 -0
  41. package/dist/transports/BrokerTransport.js.map +1 -0
  42. package/dist/transports/NativeTransport.d.ts +92 -0
  43. package/dist/transports/NativeTransport.d.ts.map +1 -0
  44. package/dist/transports/NativeTransport.js +221 -0
  45. package/dist/transports/NativeTransport.js.map +1 -0
  46. package/dist/transports/StdioTransport.d.ts +112 -0
  47. package/dist/transports/StdioTransport.d.ts.map +1 -0
  48. package/dist/transports/StdioTransport.js +440 -0
  49. package/dist/transports/StdioTransport.js.map +1 -0
  50. package/dist/transports/Transport.d.ts +93 -0
  51. package/dist/transports/Transport.d.ts.map +1 -0
  52. package/dist/transports/Transport.js +13 -0
  53. package/dist/transports/Transport.js.map +1 -0
  54. package/dist/types/broker.d.ts +31 -0
  55. package/dist/types/broker.d.ts.map +1 -0
  56. package/dist/types/broker.js +6 -0
  57. package/dist/types/broker.js.map +1 -0
  58. package/dist/types/core.d.ts +138 -0
  59. package/dist/types/core.d.ts.map +1 -0
  60. package/dist/types/core.js +26 -0
  61. package/dist/types/core.js.map +1 -0
  62. package/dist/types/events.d.ts +186 -0
  63. package/dist/types/events.d.ts.map +1 -0
  64. package/dist/types/events.js +16 -0
  65. package/dist/types/events.js.map +1 -0
  66. package/dist/types/index.d.ts +9 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/index.js +13 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/dist/types/protocol.d.ts +160 -0
  71. package/dist/types/protocol.d.ts.map +1 -0
  72. package/dist/types/protocol.js +5 -0
  73. package/dist/types/protocol.js.map +1 -0
  74. package/dist/utils/agentUtils.d.ts +102 -0
  75. package/dist/utils/agentUtils.d.ts.map +1 -0
  76. package/dist/utils/agentUtils.js +166 -0
  77. package/dist/utils/agentUtils.js.map +1 -0
  78. package/dist/utils/commandUtils.d.ts +45 -0
  79. package/dist/utils/commandUtils.d.ts.map +1 -0
  80. package/dist/utils/commandUtils.js +145 -0
  81. package/dist/utils/commandUtils.js.map +1 -0
  82. package/dist/utils/configUtils.d.ts +55 -0
  83. package/dist/utils/configUtils.d.ts.map +1 -0
  84. package/dist/utils/configUtils.js +100 -0
  85. package/dist/utils/configUtils.js.map +1 -0
  86. package/dist/utils/logger.d.ts +59 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +122 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/dist/utils/pathUtils.d.ts +48 -0
  91. package/dist/utils/pathUtils.d.ts.map +1 -0
  92. package/dist/utils/pathUtils.js +128 -0
  93. package/dist/utils/pathUtils.js.map +1 -0
  94. package/package.json +56 -5
  95. package/agent.json +0 -18
  96. package/examples/example-abilities/echo-js/README.md +0 -131
  97. package/examples/example-abilities/echo-js/agent.json +0 -63
  98. package/examples/example-abilities/echo-js/package.json +0 -24
  99. package/examples/example-abilities/echo-js/service.js +0 -43
  100. package/examples/example-abilities/hash-go/agent.json +0 -53
  101. package/examples/example-abilities/hash-go/cmd/hash_ability/main.go +0 -340
  102. package/examples/example-abilities/hash-go/go.mod +0 -3
  103. package/examples/example-agent/abilities/echo-js/0.0.1/README.md +0 -131
  104. package/examples/example-agent/abilities/echo-js/0.0.1/agent.json +0 -63
  105. package/examples/example-agent/abilities/echo-js/0.0.1/package-lock.json +0 -93
  106. package/examples/example-agent/abilities/echo-js/0.0.1/package.json +0 -24
  107. package/examples/example-agent/abilities/echo-js/0.0.1/service.js +0 -41
  108. package/examples/example-agent/abilities/hash-go/0.0.1/agent.json +0 -53
  109. package/examples/example-agent/abilities/hash-go/0.0.1/bin/hash_ability +0 -0
  110. package/examples/example-agent/abilities/hash-go/0.0.1/cmd/hash_ability/main.go +0 -340
  111. package/examples/example-agent/abilities/hash-go/0.0.1/go.mod +0 -3
  112. package/examples/example-agent/agent.json +0 -39
  113. package/examples/example-agent/index.js +0 -102
  114. package/examples/example-agent/package-lock.json +0 -93
  115. package/examples/example-agent/package.json +0 -17
  116. package/src/KadiAbility.js +0 -478
  117. package/src/index.js +0 -65
  118. package/src/loadAbility.js +0 -1086
  119. package/src/servers/BaseRpcServer.js +0 -404
  120. package/src/servers/BrokerRpcServer.js +0 -776
  121. package/src/servers/StdioRpcServer.js +0 -360
  122. package/src/transport/BrokerMessageBuilder.js +0 -377
  123. package/src/transport/IpcMessageBuilder.js +0 -1229
  124. package/src/utils/agentUtils.js +0 -137
  125. package/src/utils/commandUtils.js +0 -64
  126. package/src/utils/configUtils.js +0 -72
  127. package/src/utils/logger.js +0 -161
  128. package/src/utils/pathUtils.js +0 -86
@@ -0,0 +1,59 @@
1
+ import { Debugger } from 'debug';
2
+ export interface KadiLogger extends Debugger {
3
+ trace: Debugger;
4
+ error: Debugger;
5
+ lifecycle: Debugger;
6
+ protocol: Debugger;
7
+ transport: Debugger;
8
+ info: Debugger;
9
+ warn: Debugger;
10
+ debug: Debugger;
11
+ }
12
+ export declare const loggers: {
13
+ main: KadiLogger | null;
14
+ ability: KadiLogger | null;
15
+ broker: KadiLogger | null;
16
+ ipc: KadiLogger | null;
17
+ transport: KadiLogger | null;
18
+ rpc: KadiLogger | null;
19
+ };
20
+ /**
21
+ * Creates a namespaced logger with sub-loggers for different concerns
22
+ * @param namespace - The logger namespace (e.g., 'ability', 'broker')
23
+ * @returns A logger instance with specialized sub-loggers
24
+ */
25
+ export declare function createLogger(namespace: string): KadiLogger;
26
+ /**
27
+ * Creates a logger for a specific component within a namespace
28
+ */
29
+ export declare function createComponentLogger(component: string): KadiLogger;
30
+ /**
31
+ * Checks if debug is enabled for a namespace
32
+ */
33
+ export declare function isDebugEnabled(namespace: string): boolean;
34
+ /**
35
+ * Format an object for logging
36
+ */
37
+ export declare function formatObject(obj: any, label?: string): string;
38
+ /**
39
+ * Create a child logger with additional context
40
+ */
41
+ export declare function createChildLogger(parentLogger: KadiLogger, context: string): KadiLogger;
42
+ export declare function isKadiLogger(obj: unknown): obj is KadiLogger;
43
+ declare const _default: {
44
+ loggers: {
45
+ main: KadiLogger | null;
46
+ ability: KadiLogger | null;
47
+ broker: KadiLogger | null;
48
+ ipc: KadiLogger | null;
49
+ transport: KadiLogger | null;
50
+ rpc: KadiLogger | null;
51
+ };
52
+ createLogger: typeof createLogger;
53
+ createComponentLogger: typeof createComponentLogger;
54
+ isDebugEnabled: typeof isDebugEnabled;
55
+ formatObject: typeof formatObject;
56
+ createChildLogger: typeof createChildLogger;
57
+ };
58
+ export default _default;
59
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAA0B,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIpD,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;CACjB;AAMD,eAAO,MAAM,OAAO;UACJ,UAAU,GAAG,IAAI;aACd,UAAU,GAAG,IAAI;YAClB,UAAU,GAAG,IAAI;SACpB,UAAU,GAAG,IAAI;eACX,UAAU,GAAG,IAAI;SACvB,UAAU,GAAG,IAAI;CAC/B,CAAC;AAYF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAwC1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAEnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,UAAU,EACxB,OAAO,EAAE,MAAM,GACd,UAAU,CAGZ;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAQ5D;;;cAxHe,UAAU,GAAG,IAAI;iBACd,UAAU,GAAG,IAAI;gBAClB,UAAU,GAAG,IAAI;aACpB,UAAU,GAAG,IAAI;mBACX,UAAU,GAAG,IAAI;aACvB,UAAU,GAAG,IAAI;;;;;;;;AAyHhC,wBAOE"}
@@ -0,0 +1,122 @@
1
+ import createDebugLogger from 'debug';
2
+ import chalk from 'chalk';
3
+ // Typed logger storage
4
+ const loggerCache = new Map();
5
+ // Pre-configured loggers for backward compatibility
6
+ export const loggers = {
7
+ main: null,
8
+ ability: null,
9
+ broker: null,
10
+ ipc: null,
11
+ transport: null,
12
+ rpc: null
13
+ };
14
+ // Initialize default loggers
15
+ function initializeDefaultLoggers() {
16
+ loggers.main = createLogger('main');
17
+ loggers.ability = createLogger('ability');
18
+ loggers.broker = createLogger('broker');
19
+ loggers.ipc = createLogger('ipc');
20
+ loggers.transport = createLogger('transport');
21
+ loggers.rpc = createLogger('rpc');
22
+ }
23
+ /**
24
+ * Creates a namespaced logger with sub-loggers for different concerns
25
+ * @param namespace - The logger namespace (e.g., 'ability', 'broker')
26
+ * @returns A logger instance with specialized sub-loggers
27
+ */
28
+ export function createLogger(namespace) {
29
+ // Check cache first
30
+ if (loggerCache.has(namespace)) {
31
+ return loggerCache.get(namespace);
32
+ }
33
+ const baseNamespace = `kadi:${namespace}`;
34
+ const logger = createDebugLogger(baseNamespace);
35
+ // Create typed sub-loggers
36
+ logger.trace = createDebugLogger(`${baseNamespace}:trace`);
37
+ logger.error = createDebugLogger(`${baseNamespace}:error`);
38
+ logger.lifecycle = createDebugLogger(`${baseNamespace}:lifecycle`);
39
+ logger.protocol = createDebugLogger(`${baseNamespace}:protocol`);
40
+ logger.transport = createDebugLogger(`${baseNamespace}:transport`);
41
+ logger.info = createDebugLogger(`${baseNamespace}:info`);
42
+ logger.warn = createDebugLogger(`${baseNamespace}:warn`);
43
+ logger.debug = createDebugLogger(`${baseNamespace}:debug`);
44
+ // Add colored output for different log levels
45
+ const originalError = logger.error;
46
+ logger.error = ((message, ...args) => {
47
+ if (process.stdout.isTTY) {
48
+ originalError(chalk.red(message), ...args);
49
+ }
50
+ else {
51
+ originalError(message, ...args);
52
+ }
53
+ });
54
+ const originalWarn = logger.warn;
55
+ logger.warn = ((message, ...args) => {
56
+ if (process.stdout.isTTY) {
57
+ originalWarn(chalk.yellow(message), ...args);
58
+ }
59
+ else {
60
+ originalWarn(message, ...args);
61
+ }
62
+ });
63
+ loggerCache.set(namespace, logger);
64
+ return logger;
65
+ }
66
+ /**
67
+ * Creates a logger for a specific component within a namespace
68
+ */
69
+ export function createComponentLogger(component) {
70
+ return createLogger(component);
71
+ }
72
+ /**
73
+ * Checks if debug is enabled for a namespace
74
+ */
75
+ export function isDebugEnabled(namespace) {
76
+ const debug = process.env.DEBUG || '';
77
+ // Handle wildcard patterns
78
+ if (debug.includes('*')) {
79
+ const patterns = debug.split(',').map((p) => p.trim());
80
+ return patterns.some((pattern) => {
81
+ const regex = pattern.replace(/\*/g, '.*');
82
+ return new RegExp(`^${regex}$`).test(namespace);
83
+ });
84
+ }
85
+ return debug.includes(namespace);
86
+ }
87
+ /**
88
+ * Format an object for logging
89
+ */
90
+ export function formatObject(obj, label = '') {
91
+ if (label) {
92
+ return `${label}: ${JSON.stringify(obj, null, 2)}`;
93
+ }
94
+ return JSON.stringify(obj, null, 2);
95
+ }
96
+ /**
97
+ * Create a child logger with additional context
98
+ */
99
+ export function createChildLogger(parentLogger, context) {
100
+ const namespace = parentLogger.namespace.replace('kadi:', '');
101
+ return createLogger(`${namespace}:${context}`);
102
+ }
103
+ // Type guard for checking if something is a logger
104
+ export function isKadiLogger(obj) {
105
+ return (obj !== null &&
106
+ typeof obj === 'function' &&
107
+ 'trace' in obj &&
108
+ 'error' in obj &&
109
+ 'lifecycle' in obj);
110
+ }
111
+ // Initialize default loggers on module load
112
+ initializeDefaultLoggers();
113
+ // Default export for backward compatibility
114
+ export default {
115
+ loggers,
116
+ createLogger,
117
+ createComponentLogger,
118
+ isDebugEnabled,
119
+ formatObject,
120
+ createChildLogger
121
+ };
122
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type ValidatedPath = string & {
2
+ __brand: 'ValidatedPath';
3
+ };
4
+ /**
5
+ * Resolves the Kadi executable directory path
6
+ * @returns The directory containing the Kadi executable
7
+ */
8
+ export declare function resolveKadiExecPath(): string;
9
+ /**
10
+ * Safely resolves Kadi installation path
11
+ * @throws {Error} If Kadi installation cannot be found
12
+ */
13
+ export declare function resolveKadiInstallPath(): string;
14
+ export declare const kadiExecDir: string;
15
+ export declare const kadiRootDir: string;
16
+ export declare const kadiAgentPath: string;
17
+ export declare const rootDir: string;
18
+ export declare const abilitiesDir: string;
19
+ export declare const projectAgentPath: string;
20
+ export declare const kadiCoreAgentPath: string;
21
+ export declare const pathUtils: {
22
+ /**
23
+ * Normalizes path for current platform
24
+ */
25
+ readonly normalize: (inputPath: string) => string;
26
+ /**
27
+ * Checks if path is absolute
28
+ */
29
+ readonly isAbsolute: (inputPath: string) => boolean;
30
+ /**
31
+ * Safely joins paths
32
+ */
33
+ readonly join: (...paths: string[]) => string;
34
+ /**
35
+ * Gets directory name from path
36
+ */
37
+ readonly dirname: (inputPath: string) => string;
38
+ /**
39
+ * Gets base name from path
40
+ */
41
+ readonly basename: (inputPath: string, ext?: string) => string;
42
+ /**
43
+ * Resolve a path relative to the project root
44
+ */
45
+ readonly resolveFromRoot: (...segments: string[]) => string;
46
+ };
47
+ export default pathUtils;
48
+ //# sourceMappingURL=pathUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathUtils.d.ts","sourceRoot":"","sources":["../../src/utils/pathUtils.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAElE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA4C/C;AAaD,eAAO,MAAM,WAAW,QAAwB,CAAC;AACjD,eAAO,MAAM,WAAW,QAA2B,CAAC;AACpD,eAAO,MAAM,aAAa,QAAuC,CAAC;AAElE,eAAO,MAAM,OAAO,QAAgB,CAAC;AACrC,eAAO,MAAM,YAAY,QAAkC,CAAC;AAC5D,eAAO,MAAM,gBAAgB,QAAmC,CAAC;AACjE,eAAO,MAAM,iBAAiB,QAA2C,CAAC;AAG1E,eAAO,MAAM,SAAS;IACpB;;OAEG;oCACkB,MAAM,KAAG,MAAM;IAIpC;;OAEG;qCACmB,MAAM,KAAG,OAAO;IAItC;;OAEG;8BACY,MAAM,EAAE,KAAG,MAAM;IAIhC;;OAEG;kCACgB,MAAM,KAAG,MAAM;IAIlC;;OAEG;mCACiB,MAAM,QAAQ,MAAM,KAAG,MAAM;IAIjD;;OAEG;4CAC0B,MAAM,EAAE,KAAG,MAAM;CAGtC,CAAC;AAEX,eAAe,SAAS,CAAC"}
@@ -0,0 +1,128 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { execSync } from 'node:child_process';
4
+ import { fileURLToPath } from 'node:url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ /**
8
+ * Resolves the Kadi executable directory path
9
+ * @returns The directory containing the Kadi executable
10
+ */
11
+ export function resolveKadiExecPath() {
12
+ // Try to find kadi using which command
13
+ try {
14
+ const kadiPath = execSync('which kadi', { encoding: 'utf8' }).trim();
15
+ if (kadiPath) {
16
+ return path.dirname(kadiPath);
17
+ }
18
+ }
19
+ catch {
20
+ // which command failed, continue with other methods
21
+ }
22
+ // Fallback to process.execPath
23
+ return path.dirname(process.execPath);
24
+ }
25
+ /**
26
+ * Safely resolves Kadi installation path
27
+ * @throws {Error} If Kadi installation cannot be found
28
+ */
29
+ export function resolveKadiInstallPath() {
30
+ // Try using npm to find the global kadi installation
31
+ try {
32
+ const npmGlobalPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
33
+ const kadiPath = path.join(npmGlobalPath, 'kadi');
34
+ if (fs.existsSync(kadiPath)) {
35
+ return kadiPath;
36
+ }
37
+ }
38
+ catch {
39
+ // npm command failed, continue with other methods
40
+ }
41
+ // Try to find kadi in the path
42
+ try {
43
+ const kadiExecutable = execSync('which kadi', { encoding: 'utf8' }).trim();
44
+ if (kadiExecutable) {
45
+ // Follow symlinks to get real path
46
+ const realPath = fs.realpathSync(kadiExecutable);
47
+ // Go up from bin to find the kadi root
48
+ let currentPath = path.dirname(realPath);
49
+ while (currentPath !== path.dirname(currentPath)) {
50
+ if (fs.existsSync(path.join(currentPath, 'package.json'))) {
51
+ try {
52
+ const pkg = JSON.parse(fs.readFileSync(path.join(currentPath, 'package.json'), 'utf8'));
53
+ if (pkg.name === 'kadi' || pkg.name === '@kadi.build/core') {
54
+ return currentPath;
55
+ }
56
+ }
57
+ catch {
58
+ // Not a valid package.json, continue searching
59
+ }
60
+ }
61
+ currentPath = path.dirname(currentPath);
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // which command failed
67
+ }
68
+ // Fallback to current working directory
69
+ return process.cwd();
70
+ }
71
+ /**
72
+ * Type guard to validate a path exists
73
+ */
74
+ function validatePath(pathStr) {
75
+ if (!fs.existsSync(pathStr)) {
76
+ throw new Error(`Path does not exist: ${pathStr}`);
77
+ }
78
+ return pathStr;
79
+ }
80
+ // Export path constants
81
+ export const kadiExecDir = resolveKadiExecPath();
82
+ export const kadiRootDir = resolveKadiInstallPath();
83
+ export const kadiAgentPath = path.join(kadiRootDir, 'agent.json');
84
+ export const rootDir = process.cwd();
85
+ export const abilitiesDir = path.join(rootDir, 'abilities');
86
+ export const projectAgentPath = path.join(rootDir, 'agent.json');
87
+ export const kadiCoreAgentPath = path.join(__dirname, '..', 'agent.json');
88
+ // Platform-specific path utilities
89
+ export const pathUtils = {
90
+ /**
91
+ * Normalizes path for current platform
92
+ */
93
+ normalize(inputPath) {
94
+ return path.normalize(inputPath);
95
+ },
96
+ /**
97
+ * Checks if path is absolute
98
+ */
99
+ isAbsolute(inputPath) {
100
+ return path.isAbsolute(inputPath);
101
+ },
102
+ /**
103
+ * Safely joins paths
104
+ */
105
+ join(...paths) {
106
+ return path.join(...paths);
107
+ },
108
+ /**
109
+ * Gets directory name from path
110
+ */
111
+ dirname(inputPath) {
112
+ return path.dirname(inputPath);
113
+ },
114
+ /**
115
+ * Gets base name from path
116
+ */
117
+ basename(inputPath, ext) {
118
+ return path.basename(inputPath, ext);
119
+ },
120
+ /**
121
+ * Resolve a path relative to the project root
122
+ */
123
+ resolveFromRoot(...segments) {
124
+ return path.resolve(rootDir, ...segments);
125
+ }
126
+ };
127
+ export default pathUtils;
128
+ //# sourceMappingURL=pathUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathUtils.js","sourceRoot":"","sources":["../../src/utils/pathUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,52 @@
1
1
  {
2
2
  "name": "@kadi.build/core",
3
- "version": "0.0.1-alpha.3",
3
+ "version": "0.0.1-alpha.4",
4
4
  "description": "A module that is a comprehensive toolkit for developers integrating with the KADI infrastructure.",
5
- "main": "src/index.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
6
7
  "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./types": {
14
+ "import": "./dist/types/index.js",
15
+ "types": "./dist/types/index.d.ts"
16
+ },
17
+ "./types/protocol": {
18
+ "import": "./dist/types/protocol.js",
19
+ "types": "./dist/types/protocol.d.ts"
20
+ },
21
+ "./types/events": {
22
+ "import": "./dist/types/events.js",
23
+ "types": "./dist/types/events.d.ts"
24
+ },
25
+ "./schemas": {
26
+ "import": "./dist/schemas/index.js",
27
+ "types": "./dist/schemas/index.d.ts"
28
+ },
29
+ "./messages": {
30
+ "import": "./dist/messages/BrokerMessages.js",
31
+ "types": "./dist/messages/BrokerMessages.d.ts"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
7
39
  "scripts": {
40
+ "clean": "rimraf dist",
41
+ "build": "npm run clean && tsc",
42
+ "build:watch": "tsc --watch",
43
+ "typecheck": "tsc --noEmit",
44
+ "lint": "eslint 'src/**/*.{js,ts}'",
45
+ "lint:fix": "eslint 'src/**/*.{js,ts}' --fix",
8
46
  "format": "prettier --write .",
9
- "test": "echo \"Error: no test specified\" && exit 1"
47
+ "format:check": "prettier --check .",
48
+ "prepublishOnly": "npm run build",
49
+ "prepare": "npm run build"
10
50
  },
11
51
  "author": "Corey Clark",
12
52
  "contributors": [
@@ -20,9 +60,20 @@
20
60
  "chalk": "^5.5.0",
21
61
  "debug": "^4.4.1",
22
62
  "events": "^3.3.0",
23
- "ws": "^8.16.0"
63
+ "ws": "^8.16.0",
64
+ "zod": "^4.1.5"
24
65
  },
25
66
  "devDependencies": {
26
- "prettier": "^3.6.2"
67
+ "@types/debug": "^4.1.12",
68
+ "@types/node": "^20.19.11",
69
+ "@types/ws": "^8.18.1",
70
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
71
+ "@typescript-eslint/parser": "^7.18.0",
72
+ "eslint": "^8.57.1",
73
+ "eslint-config-prettier": "^9.1.2",
74
+ "eslint-plugin-prettier": "^5.5.4",
75
+ "prettier": "^3.6.2",
76
+ "rimraf": "^5.0.10",
77
+ "typescript": "^5.9.2"
27
78
  }
28
79
  }
package/agent.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "name": "kadi-core",
3
- "version": "0.0.1",
4
- "license": "MIT",
5
- "description": "base install ability for kadi",
6
- "repo": "https://gitlab.com/humin-game-lab/agent-abilities/kadi-core.git",
7
- "lib": "https://gitlab.com/humin-game-lab/agent-abilities/kadi-core/-/archive/v0.0.1/kadi-core-v0.0.1.zip",
8
- "abilities": {},
9
-
10
- "scripts": {
11
- "preflight": "echo 'kadi-core v0.0.1 is starting...'",
12
- "setup": "echo 'kadi-core v0.0.1 is ready...'",
13
- "start": "npm install",
14
- "stop": "echo 'kadi-core v0.0.1 is ready...'",
15
- "python": "python3 ./node_modules/kadi-core/ipcInterfaces/pythonAbilityIPC.py",
16
- "rust": "cargo run --bin path/to/rustAbilityIPC"
17
- }
18
- }
@@ -1,131 +0,0 @@
1
- # Echo-JS Ability
2
-
3
- A simple echo ability that demonstrates the new **improved KadiAbility architecture**. This ability showcases how easy it is to create powerful abilities with minimal code.
4
-
5
- ## What This Demonstrates
6
-
7
- ### 🏗️ **New Architecture Benefits**
8
-
9
- 1. **Cleaner Code**: The entire ability is ~100 lines vs ~600+ lines with the old architecture
10
- 2. **Transport Abstraction**: Automatically works with stdio and broker modes
11
- 3. **Built-in Discovery**: `__kadi_init` and `__kadi_discover` methods are automatic
12
- 4. **Better Error Handling**: Protocol errors are handled gracefully
13
- 5. **Metadata Support**: Easy to add schemas and descriptions to methods
14
-
15
- ### 🚀 **Simple API**
16
-
17
- ```javascript
18
- const ability = new KadiAbility({ name: 'echo-js' });
19
-
20
- ability
21
- .method('echo', async ({ message }) => {
22
- return { echo: message, timestamp: new Date().toISOString() };
23
- })
24
- .serve();
25
- ```
26
-
27
- That's it! The new architecture handles:
28
-
29
- - LSP framing for stdio communication
30
- - Request/response correlation
31
- - Error handling
32
- - Discovery methods
33
- - Transport selection
34
-
35
- ## Available Methods
36
-
37
- ### `echo`
38
-
39
- Returns your message with metadata:
40
-
41
- ```json
42
- {
43
- "method": "echo",
44
- "params": { "message": "Hello!" }
45
- }
46
- // Returns: { "echo": "Hello!", "timestamp": "2024-...", "length": 6 }
47
- ```
48
-
49
- ### `mirror`
50
-
51
- Returns your entire input object:
52
-
53
- ```json
54
- {
55
- "method": "mirror",
56
- "params": { "foo": "bar", "numbers": [1, 2, 3] }
57
- }
58
- // Returns: { "mirrored": {...}, "metadata": {...} }
59
- ```
60
-
61
- ### `health`
62
-
63
- Returns service health status:
64
-
65
- ```json
66
- {
67
- "method": "health",
68
- "params": {}
69
- }
70
- // Returns: { "status": "healthy", "uptime": 12345, "version": "0.0.1" }
71
- ```
72
-
73
- ## Running
74
-
75
- ### Stdio Mode (default)
76
-
77
- ```bash
78
- node service.js
79
- # Then send JSON-RPC messages via stdin
80
- ```
81
-
82
- ### Broker Mode
83
-
84
- ```bash
85
- KADI_MODE=broker KADI_BROKER_URL=ws://localhost:8080 node service.js
86
- ```
87
-
88
- ### Testing
89
-
90
- ```bash
91
- node test-manual.js
92
- ```
93
-
94
- ## Architecture Comparison
95
-
96
- ### Before (Old KadiAbility)
97
-
98
- ```javascript
99
- // Had to implement:
100
- // - LSP frame reading/writing (~200 lines)
101
- // - Request/response loop (~100 lines)
102
- // - Error handling (~100 lines)
103
- // - Discovery methods (~50 lines)
104
- // - Transport management (~50 lines)
105
- // Total: ~500+ lines before any business logic!
106
- ```
107
-
108
- ### After (New Architecture)
109
-
110
- ```javascript
111
- import { KadiAbility } from '@kadi/core';
112
-
113
- const ability = new KadiAbility({ name: 'my-ability' });
114
- ability.method('myMethod', handler);
115
- ability.serve();
116
-
117
- // Everything else is handled automatically!
118
- // Focus on business logic, not plumbing.
119
- ```
120
-
121
- ## Key Features Demonstrated
122
-
123
- - ✅ **Multiple Methods**: echo, mirror, health
124
- - ✅ **Method Metadata**: Descriptions and schemas
125
- - ✅ **Error Handling**: Graceful error responses
126
- - ✅ **Event Monitoring**: Request/response logging
127
- - ✅ **Discovery**: Built-in `__kadi_init` and `__kadi_discover`
128
- - ✅ **Transport Agnostic**: Works with stdio and broker modes
129
- - ✅ **Clean Shutdown**: Handles SIGINT/SIGTERM
130
-
131
- This is what ability development should feel like! 🎉
@@ -1,63 +0,0 @@
1
- {
2
- "name": "echo-js",
3
- "kind": "ability",
4
- "version": "0.0.1",
5
- "license": "MIT",
6
- "description": "Simple echo ability that returns whatever you send to it - demonstrates the new KadiAbility architecture.",
7
- "repo": "",
8
- "brokers": {
9
- "local": "ws://127.0.0.1:8080",
10
- "remote": "ws://kadi.build:8080"
11
- },
12
- "abilities": {},
13
- "scripts": {
14
- "preflight": "npm uninstall @kadi.build/core && npm cache clean --force && npm pack ../../../../../ && npm install kadi.build-core-0.0.1-alpha.2.tgz && rm kadi.build-core-0.0.1-alpha.2.tgz",
15
- "setup": "npm install",
16
- "start": "node service.js",
17
- "stop": ""
18
- },
19
- "interfaces": {
20
- "native": {
21
- "entry": "service.js"
22
- },
23
- "stdio": {
24
- "discover": true,
25
- "timeoutMs": 10000
26
- },
27
- "broker": {
28
- "discover": true,
29
- "timeoutMs": 15000
30
- }
31
- },
32
- "exports": [
33
- {
34
- "name": "echo",
35
- "title": "Echo",
36
- "description": "Returns the exact input you provide - useful for testing.",
37
- "inputSchema": {
38
- "type": "object",
39
- "properties": {
40
- "message": {
41
- "type": "string",
42
- "description": "Message to echo back"
43
- }
44
- },
45
- "required": ["message"]
46
- },
47
- "outputSchema": {
48
- "type": "object",
49
- "properties": {
50
- "echo": {
51
- "type": "string"
52
- },
53
- "timestamp": {
54
- "type": "string"
55
- },
56
- "length": {
57
- "type": "number"
58
- }
59
- }
60
- }
61
- }
62
- ]
63
- }