atabey 0.0.7 → 0.0.8

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 (163) hide show
  1. package/README.md +1 -1
  2. package/dist/src/cli/adapters/core.js +12 -19
  3. package/dist/src/cli/adapters/core.js.map +1 -1
  4. package/dist/src/shared/constants.d.ts +1 -0
  5. package/dist/src/shared/constants.js +1 -0
  6. package/dist/src/shared/constants.js.map +1 -1
  7. package/dist/tests/adapter.test.js +3 -2
  8. package/dist/tests/adapter.test.js.map +1 -1
  9. package/framework-mcp/dist/constants.js +64 -0
  10. package/framework-mcp/dist/framework-mcp/src/constants.js +64 -0
  11. package/framework-mcp/dist/framework-mcp/src/index.js +144 -0
  12. package/framework-mcp/dist/framework-mcp/src/resources/index.js +58 -0
  13. package/framework-mcp/dist/framework-mcp/src/tools/control_plane/locking.js +82 -0
  14. package/framework-mcp/dist/framework-mcp/src/tools/control_plane/registry.js +35 -0
  15. package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +322 -0
  16. package/framework-mcp/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +64 -0
  17. package/framework-mcp/dist/framework-mcp/src/tools/file_system/patch_file.js +34 -0
  18. package/framework-mcp/dist/framework-mcp/src/tools/file_system/read_file.js +51 -0
  19. package/framework-mcp/dist/framework-mcp/src/tools/file_system/replace_text.js +50 -0
  20. package/framework-mcp/dist/framework-mcp/src/tools/file_system/write_file.js +43 -0
  21. package/framework-mcp/dist/framework-mcp/src/tools/framework/audit_deps.js +41 -0
  22. package/framework-mcp/dist/framework-mcp/src/tools/framework/get_status.js +5 -0
  23. package/framework-mcp/dist/framework-mcp/src/tools/framework/orchestrate.js +5 -0
  24. package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +27 -0
  25. package/framework-mcp/dist/framework-mcp/src/tools/framework/submit_plan.js +13 -0
  26. package/framework-mcp/dist/framework-mcp/src/tools/framework/update_contract_hash.js +5 -0
  27. package/framework-mcp/dist/framework-mcp/src/tools/framework/update_memory.js +8 -0
  28. package/framework-mcp/dist/framework-mcp/src/tools/index.js +62 -0
  29. package/framework-mcp/dist/framework-mcp/src/tools/memory/get_insights.js +34 -0
  30. package/framework-mcp/dist/framework-mcp/src/tools/memory/read_memory.js +28 -0
  31. package/framework-mcp/dist/framework-mcp/src/tools/messaging/log_action.js +22 -0
  32. package/framework-mcp/dist/framework-mcp/src/tools/messaging/send_message.js +94 -0
  33. package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +26 -0
  34. package/framework-mcp/dist/framework-mcp/src/tools/observability/get_health.js +19 -0
  35. package/framework-mcp/dist/framework-mcp/src/tools/quality/check_lint.js +30 -0
  36. package/framework-mcp/dist/framework-mcp/src/tools/search/get_gaps.js +48 -0
  37. package/framework-mcp/dist/framework-mcp/src/tools/search/get_map.js +43 -0
  38. package/framework-mcp/dist/framework-mcp/src/tools/search/grep_search.js +75 -0
  39. package/framework-mcp/dist/framework-mcp/src/tools/search/list_dir.js +28 -0
  40. package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +56 -0
  41. package/framework-mcp/dist/framework-mcp/src/tools/types.js +1 -0
  42. package/framework-mcp/dist/framework-mcp/src/utils/cli.js +59 -0
  43. package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +231 -0
  44. package/framework-mcp/dist/framework-mcp/src/utils/fs.js +44 -0
  45. package/framework-mcp/dist/framework-mcp/src/utils/metrics.js +56 -0
  46. package/framework-mcp/dist/framework-mcp/src/utils/permissions.js +71 -0
  47. package/framework-mcp/dist/framework-mcp/src/utils/security.js +60 -0
  48. package/framework-mcp/dist/index.js +144 -0
  49. package/framework-mcp/dist/resources/index.js +58 -0
  50. package/framework-mcp/dist/src/cli/adapters/core.js +71 -0
  51. package/framework-mcp/dist/src/cli/adapters/index.js +5 -0
  52. package/framework-mcp/dist/src/cli/adapters/paths.js +101 -0
  53. package/framework-mcp/dist/src/cli/adapters/scaffold.js +71 -0
  54. package/framework-mcp/dist/src/cli/adapters/utils.js +75 -0
  55. package/framework-mcp/dist/src/cli/commands/approve.js +63 -0
  56. package/framework-mcp/dist/src/cli/commands/check.js +181 -0
  57. package/framework-mcp/dist/src/cli/commands/compliance.js +50 -0
  58. package/framework-mcp/dist/src/cli/commands/contract.js +50 -0
  59. package/framework-mcp/dist/src/cli/commands/dashboard.js +123 -0
  60. package/framework-mcp/dist/src/cli/commands/explorer.js +42 -0
  61. package/framework-mcp/dist/src/cli/commands/git.js +40 -0
  62. package/framework-mcp/dist/src/cli/commands/init/create-agent.js +58 -0
  63. package/framework-mcp/dist/src/cli/commands/init/scaffold-core.js +112 -0
  64. package/framework-mcp/dist/src/cli/commands/init/scaffold-docs.js +34 -0
  65. package/framework-mcp/dist/src/cli/commands/init/scaffold-ops.js +80 -0
  66. package/framework-mcp/dist/src/cli/commands/init/scaffold-standards.js +67 -0
  67. package/framework-mcp/dist/src/cli/commands/init.js +167 -0
  68. package/framework-mcp/dist/src/cli/commands/knowledge.js +42 -0
  69. package/framework-mcp/dist/src/cli/commands/lint.js +22 -0
  70. package/framework-mcp/dist/src/cli/commands/log.js +10 -0
  71. package/framework-mcp/dist/src/cli/commands/memory.js +4 -0
  72. package/framework-mcp/dist/src/cli/commands/orchestrate.js +159 -0
  73. package/framework-mcp/dist/src/cli/commands/plan.js +117 -0
  74. package/framework-mcp/dist/src/cli/commands/script.js +19 -0
  75. package/framework-mcp/dist/src/cli/commands/security.js +36 -0
  76. package/framework-mcp/dist/src/cli/commands/status.js +97 -0
  77. package/framework-mcp/dist/src/cli/commands/trace.js +109 -0
  78. package/framework-mcp/dist/src/cli/index.js +338 -0
  79. package/framework-mcp/dist/src/cli/shims.js +66 -0
  80. package/framework-mcp/dist/src/cli/utils/claude.js +56 -0
  81. package/framework-mcp/dist/src/cli/utils/compliance.js +173 -0
  82. package/framework-mcp/dist/src/cli/utils/config-schema.js +42 -0
  83. package/framework-mcp/dist/src/cli/utils/fs.js +137 -0
  84. package/framework-mcp/dist/src/cli/utils/i18n.js +30 -0
  85. package/framework-mcp/dist/src/cli/utils/memory.js +276 -0
  86. package/framework-mcp/dist/src/cli/utils/pkg.js +282 -0
  87. package/framework-mcp/dist/src/cli/utils/schemas.js +19 -0
  88. package/framework-mcp/dist/src/cli/utils/string.js +49 -0
  89. package/framework-mcp/dist/src/cli/utils/time.js +27 -0
  90. package/framework-mcp/dist/src/cli/utils/ui.js +58 -0
  91. package/framework-mcp/dist/src/contracts/index.js +1 -0
  92. package/framework-mcp/dist/src/contracts/tasks.js +20 -0
  93. package/framework-mcp/dist/src/dashboard/vite.config.js +15 -0
  94. package/framework-mcp/dist/src/modules/adapters/definitions.js +140 -0
  95. package/framework-mcp/dist/src/modules/adapters/registry.js +18 -0
  96. package/framework-mcp/dist/src/modules/adapters/shared.js +104 -0
  97. package/framework-mcp/dist/src/modules/adapters/types.js +1 -0
  98. package/framework-mcp/dist/src/modules/agents/definitions.js +457 -0
  99. package/framework-mcp/dist/src/modules/agents/registry/analyst.js +39 -0
  100. package/framework-mcp/dist/src/modules/agents/registry/architect.js +42 -0
  101. package/framework-mcp/dist/src/modules/agents/registry/backend.js +49 -0
  102. package/framework-mcp/dist/src/modules/agents/registry/database.js +45 -0
  103. package/framework-mcp/dist/src/modules/agents/registry/devops.js +45 -0
  104. package/framework-mcp/dist/src/modules/agents/registry/explorer.js +36 -0
  105. package/framework-mcp/dist/src/modules/agents/registry/frontend.js +51 -0
  106. package/framework-mcp/dist/src/modules/agents/registry/git.js +36 -0
  107. package/framework-mcp/dist/src/modules/agents/registry/manager.js +53 -0
  108. package/framework-mcp/dist/src/modules/agents/registry/mobile.js +39 -0
  109. package/framework-mcp/dist/src/modules/agents/registry/native.js +39 -0
  110. package/framework-mcp/dist/src/modules/agents/registry/quality.js +41 -0
  111. package/framework-mcp/dist/src/modules/agents/registry/security.js +43 -0
  112. package/framework-mcp/dist/src/modules/agents/types.js +1 -0
  113. package/framework-mcp/dist/src/modules/engines/evaluation-engine.js +102 -0
  114. package/framework-mcp/dist/src/modules/engines/health-engine.js +49 -0
  115. package/framework-mcp/dist/src/modules/engines/planning-engine.js +78 -0
  116. package/framework-mcp/dist/src/modules/engines/risk-engine.js +105 -0
  117. package/framework-mcp/dist/src/modules/engines/routing-engine.js +73 -0
  118. package/framework-mcp/dist/src/modules/engines/types.js +1 -0
  119. package/framework-mcp/dist/src/modules/skills/definitions.js +70 -0
  120. package/framework-mcp/dist/src/shared/constants.js +187 -0
  121. package/framework-mcp/dist/src/shared/errors.js +68 -0
  122. package/framework-mcp/dist/src/shared/fs.js +51 -0
  123. package/framework-mcp/dist/src/shared/logger.js +116 -0
  124. package/framework-mcp/dist/src/shared/storage.js +207 -0
  125. package/framework-mcp/dist/src/shared/types.js +12 -0
  126. package/framework-mcp/dist/tools/control_plane/locking.js +82 -0
  127. package/framework-mcp/dist/tools/control_plane/registry.js +35 -0
  128. package/framework-mcp/dist/tools/definitions.js +322 -0
  129. package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +64 -0
  130. package/framework-mcp/dist/tools/file_system/patch_file.js +34 -0
  131. package/framework-mcp/dist/tools/file_system/read_file.js +51 -0
  132. package/framework-mcp/dist/tools/file_system/replace_text.js +50 -0
  133. package/framework-mcp/dist/tools/file_system/write_file.js +43 -0
  134. package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
  135. package/framework-mcp/dist/tools/framework/get_status.js +5 -0
  136. package/framework-mcp/dist/tools/framework/orchestrate.js +5 -0
  137. package/framework-mcp/dist/tools/framework/run_tests.js +27 -0
  138. package/framework-mcp/dist/tools/framework/submit_plan.js +13 -0
  139. package/framework-mcp/dist/tools/framework/update_contract_hash.js +5 -0
  140. package/framework-mcp/dist/tools/framework/update_memory.js +8 -0
  141. package/framework-mcp/dist/tools/index.js +62 -0
  142. package/framework-mcp/dist/tools/memory/get_insights.js +34 -0
  143. package/framework-mcp/dist/tools/memory/read_memory.js +28 -0
  144. package/framework-mcp/dist/tools/messaging/log_action.js +22 -0
  145. package/framework-mcp/dist/tools/messaging/send_message.js +94 -0
  146. package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
  147. package/framework-mcp/dist/tools/observability/get_health.js +19 -0
  148. package/framework-mcp/dist/tools/quality/check_lint.js +30 -0
  149. package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
  150. package/framework-mcp/dist/tools/search/get_map.js +43 -0
  151. package/framework-mcp/dist/tools/search/grep_search.js +75 -0
  152. package/framework-mcp/dist/tools/search/list_dir.js +28 -0
  153. package/framework-mcp/dist/tools/shell/run_command.js +56 -0
  154. package/framework-mcp/dist/tools/types.js +1 -0
  155. package/framework-mcp/dist/utils/cli.js +59 -0
  156. package/framework-mcp/dist/utils/compliance.js +231 -0
  157. package/framework-mcp/dist/utils/fs.js +44 -0
  158. package/framework-mcp/dist/utils/metrics.js +56 -0
  159. package/framework-mcp/dist/utils/permissions.js +71 -0
  160. package/framework-mcp/dist/utils/security.js +60 -0
  161. package/framework-mcp/package.json +35 -0
  162. package/mcp.json +1 -1
  163. package/package.json +6 -3
@@ -0,0 +1,116 @@
1
+ import chalk from "chalk";
2
+ import path from "path";
3
+ import { ensureDir, appendFile } from "./fs.js";
4
+ export var LogLevel;
5
+ (function (LogLevel) {
6
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
7
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
8
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
9
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
10
+ LogLevel[LogLevel["FATAL"] = 4] = "FATAL";
11
+ })(LogLevel || (LogLevel = {}));
12
+ export class EnterpriseLogger {
13
+ config;
14
+ static instance;
15
+ constructor() {
16
+ const isProd = process.env.NODE_ENV === "production";
17
+ this.config = {
18
+ minLevel: isProd ? LogLevel.INFO : LogLevel.DEBUG,
19
+ enableColors: !isProd,
20
+ jsonFormat: isProd,
21
+ };
22
+ }
23
+ static getInstance() {
24
+ if (!EnterpriseLogger.instance) {
25
+ EnterpriseLogger.instance = new EnterpriseLogger();
26
+ }
27
+ return EnterpriseLogger.instance;
28
+ }
29
+ configure(config) {
30
+ this.config = { ...this.config, ...config };
31
+ if (this.config.logFile) {
32
+ try {
33
+ ensureDir(path.dirname(this.config.logFile));
34
+ }
35
+ catch (err) {
36
+ // Directly write to stderr — using console here would be circular
37
+ process.stderr.write(`[Logger] Failed to create log directory: ${err}\n`);
38
+ }
39
+ }
40
+ }
41
+ formatMessage(level, message, meta) {
42
+ const timestamp = new Date().toISOString();
43
+ const pid = process.pid;
44
+ if (this.config.jsonFormat) {
45
+ return JSON.stringify({
46
+ timestamp,
47
+ level: LogLevel[level],
48
+ pid,
49
+ message,
50
+ meta,
51
+ });
52
+ }
53
+ const levelName = LogLevel[level].padEnd(5);
54
+ let coloredLevel = levelName;
55
+ if (this.config.enableColors) {
56
+ switch (level) {
57
+ case LogLevel.DEBUG:
58
+ coloredLevel = chalk.blue(levelName);
59
+ break;
60
+ case LogLevel.INFO:
61
+ coloredLevel = chalk.green(levelName);
62
+ break;
63
+ case LogLevel.WARN:
64
+ coloredLevel = chalk.yellow(levelName);
65
+ break;
66
+ case LogLevel.ERROR:
67
+ coloredLevel = chalk.red(levelName);
68
+ break;
69
+ case LogLevel.FATAL:
70
+ coloredLevel = chalk.bgRed.white.bold(levelName);
71
+ break;
72
+ }
73
+ }
74
+ const metaStr = meta ? ` | Meta: ${JSON.stringify(meta)}` : "";
75
+ return `[${timestamp}] [PID:${pid}] [${coloredLevel}]: ${message}${metaStr}`;
76
+ }
77
+ log(level, message, meta) {
78
+ if (level < this.config.minLevel)
79
+ return;
80
+ const formatted = this.formatMessage(level, message, meta);
81
+ // Route to stderr for ERROR/FATAL, stdout otherwise.
82
+ // Using process.write directly here is intentional — this IS the logger.
83
+ if (level >= LogLevel.ERROR) {
84
+ process.stderr.write(formatted + "\n");
85
+ }
86
+ else {
87
+ process.stdout.write(formatted + "\n");
88
+ }
89
+ // Output to file if configured
90
+ if (this.config.logFile) {
91
+ try {
92
+ appendFile(this.config.logFile, formatted + "\n");
93
+ }
94
+ catch (err) {
95
+ // Directly write to stderr — using console here would be circular
96
+ process.stderr.write(`[Logger] Failed to write to log file: ${err}\n`);
97
+ }
98
+ }
99
+ }
100
+ debug(message, meta) {
101
+ this.log(LogLevel.DEBUG, message, meta);
102
+ }
103
+ info(message, meta) {
104
+ this.log(LogLevel.INFO, message, meta);
105
+ }
106
+ warn(message, meta) {
107
+ this.log(LogLevel.WARN, message, meta);
108
+ }
109
+ error(message, meta) {
110
+ this.log(LogLevel.ERROR, message, meta);
111
+ }
112
+ fatal(message, meta) {
113
+ this.log(LogLevel.FATAL, message, meta);
114
+ }
115
+ }
116
+ export const logger = EnterpriseLogger.getInstance();
@@ -0,0 +1,207 @@
1
+ import Database from "better-sqlite3";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { getFrameworkDir } from "../cli/utils/memory.js";
5
+ /**
6
+ * [DB] Atabey Storage Engine
7
+ * Central SQLite database for enterprise-scale agent state management.
8
+ */
9
+ export class Storage {
10
+ static db = null;
11
+ static getDB() {
12
+ if (!this.db) {
13
+ const frameworkDir = getFrameworkDir();
14
+ if (!fs.existsSync(frameworkDir)) {
15
+ fs.mkdirSync(frameworkDir, { recursive: true });
16
+ }
17
+ const dbPath = path.join(frameworkDir, "atabey.db");
18
+ this.db = new Database(dbPath);
19
+ this.initializeSchema();
20
+ }
21
+ return this.db;
22
+ }
23
+ static initializeSchema() {
24
+ const db = this.db;
25
+ // Agents Table
26
+ db.exec(`
27
+ CREATE TABLE IF NOT EXISTS agents (
28
+ name TEXT PRIMARY KEY,
29
+ state TEXT DEFAULT 'READY',
30
+ task TEXT DEFAULT 'Idle',
31
+ last_updated DATETIME DEFAULT CURRENT_TIMESTAMP
32
+ )
33
+ `);
34
+ // Messages (Hermes) Table
35
+ db.exec(`
36
+ CREATE TABLE IF NOT EXISTS messages (
37
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
38
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
39
+ sender TEXT,
40
+ receiver TEXT,
41
+ category TEXT,
42
+ content TEXT,
43
+ trace_id TEXT,
44
+ parent_id TEXT,
45
+ status TEXT DEFAULT 'PENDING',
46
+ priority TEXT DEFAULT 'NORMAL',
47
+ requires_approval BOOLEAN DEFAULT 0
48
+ )
49
+ `);
50
+ // Tasks Table
51
+ db.exec(`
52
+ CREATE TABLE IF NOT EXISTS tasks (
53
+ id TEXT PRIMARY KEY,
54
+ trace_id TEXT,
55
+ description TEXT,
56
+ agent TEXT,
57
+ status TEXT DEFAULT 'PENDING',
58
+ priority TEXT DEFAULT 'NORMAL',
59
+ dependencies TEXT, -- JSON Array
60
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
61
+ )
62
+ `);
63
+ // Logs Table
64
+ db.exec(`
65
+ CREATE TABLE IF NOT EXISTS logs (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
68
+ agent TEXT,
69
+ action TEXT,
70
+ trace_id TEXT,
71
+ status TEXT,
72
+ summary TEXT,
73
+ findings TEXT
74
+ )
75
+ `);
76
+ // Metadata (State) Table
77
+ db.exec(`
78
+ CREATE TABLE IF NOT EXISTS metadata (
79
+ key TEXT PRIMARY KEY,
80
+ value TEXT
81
+ )
82
+ `);
83
+ }
84
+ // --- Agent Operations ---
85
+ static updateAgentStatus(name, state, task, lastUpdated) {
86
+ const db = this.getDB();
87
+ const cleanName = name.replace("@", "");
88
+ const timestamp = lastUpdated || new Date().toISOString();
89
+ db.prepare(`
90
+ INSERT INTO agents (name, state, task, last_updated)
91
+ VALUES (?, ?, ?, ?)
92
+ ON CONFLICT(name) DO UPDATE SET
93
+ state = excluded.state,
94
+ task = excluded.task,
95
+ last_updated = excluded.last_updated
96
+ `).run(cleanName, state, task, timestamp);
97
+ }
98
+ static getAllAgents() {
99
+ return this.getDB().prepare("SELECT * FROM agents").all();
100
+ }
101
+ // --- Message Operations ---
102
+ static saveMessage(msg) {
103
+ const db = this.getDB();
104
+ db.prepare(`
105
+ INSERT INTO messages (sender, receiver, category, content, trace_id, parent_id, status, priority, requires_approval)
106
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
107
+ `).run(msg.from, msg.to, msg.category, msg.content, msg.traceId, msg.parentId || null, msg.status || "PENDING", msg.priority || "NORMAL", msg.requiresApproval ? 1 : 0);
108
+ }
109
+ static getPendingMessages() {
110
+ const rows = this.getDB().prepare("SELECT * FROM messages WHERE status IN ('PENDING', 'APPROVED') ORDER BY priority DESC, timestamp ASC").all();
111
+ return rows.map(r => ({
112
+ id: r.id,
113
+ timestamp: r.timestamp,
114
+ from: r.sender,
115
+ to: r.receiver,
116
+ category: r.category,
117
+ content: r.content,
118
+ traceId: r.trace_id,
119
+ parentId: r.parent_id || undefined,
120
+ status: r.status,
121
+ priority: r.priority,
122
+ requiresApproval: r.requires_approval === 1
123
+ }));
124
+ }
125
+ static updateMessageStatus(id, status) {
126
+ this.getDB().prepare("UPDATE messages SET status = ? WHERE id = ?").run(status, id);
127
+ }
128
+ // --- Task Operations ---
129
+ static saveTask(task) {
130
+ const db = this.getDB();
131
+ db.prepare(`
132
+ INSERT INTO tasks (id, trace_id, description, agent, status, priority, dependencies)
133
+ VALUES (?, ?, ?, ?, ?, ?, ?)
134
+ ON CONFLICT(id) DO UPDATE SET
135
+ status = excluded.status,
136
+ description = excluded.description
137
+ `).run(task.id, task.traceId, task.description, task.agent, task.status, task.priority, JSON.stringify(task.dependencies || []));
138
+ }
139
+ static getTasks(traceId) {
140
+ const db = this.getDB();
141
+ let rows;
142
+ if (traceId) {
143
+ rows = db.prepare("SELECT * FROM tasks WHERE trace_id = ?").all(traceId);
144
+ }
145
+ else {
146
+ rows = db.prepare("SELECT * FROM tasks").all();
147
+ }
148
+ return rows.map(r => {
149
+ let deps = [];
150
+ try {
151
+ const parsed = JSON.parse(r.dependencies || "[]");
152
+ // Handle cases where dependencies might be double-stringified or are raw JSON strings
153
+ deps = Array.isArray(parsed) ? parsed : JSON.parse(parsed);
154
+ }
155
+ catch {
156
+ // Keep empty array
157
+ }
158
+ return {
159
+ id: r.id,
160
+ traceId: r.trace_id,
161
+ description: r.description,
162
+ agent: r.agent,
163
+ status: r.status,
164
+ priority: r.priority,
165
+ dependencies: deps
166
+ };
167
+ });
168
+ }
169
+ static getLogs(agentName) {
170
+ const db = this.getDB();
171
+ let rows;
172
+ const cleanName = agentName ? agentName.replace("@", "") : undefined;
173
+ if (cleanName) {
174
+ rows = db.prepare("SELECT * FROM logs WHERE agent = ? ORDER BY timestamp DESC").all(cleanName);
175
+ }
176
+ else {
177
+ rows = db.prepare("SELECT * FROM logs ORDER BY timestamp DESC").all();
178
+ }
179
+ return rows.map(r => ({
180
+ id: r.id,
181
+ timestamp: r.timestamp,
182
+ agent: r.agent,
183
+ action: r.action,
184
+ trace_id: r.trace_id || undefined,
185
+ status: r.status,
186
+ summary: r.summary,
187
+ findings: r.findings || undefined
188
+ }));
189
+ }
190
+ // --- Metadata Operations ---
191
+ static setMetadata(key, value) {
192
+ this.getDB().prepare(`
193
+ INSERT INTO metadata (key, value) VALUES (?, ?)
194
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
195
+ `).run(key, value);
196
+ }
197
+ static getMetadata(key) {
198
+ const row = this.getDB().prepare("SELECT value FROM metadata WHERE key = ?").get(key);
199
+ return row ? row.value : null;
200
+ }
201
+ static reset() {
202
+ if (this.db) {
203
+ this.db.close();
204
+ this.db = null;
205
+ }
206
+ }
207
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Agent Atabey Framework — Internal Branded Types
3
+ * Used to enforce absolute type safety within the core orchestration logic.
4
+ */
5
+ /**
6
+ * Casts a raw string to a Branded Type.
7
+ * Use this only at the boundaries of the system.
8
+ */
9
+ export function asTraceID(val) { return val; }
10
+ export function asAgentID(val) { return val; }
11
+ export function asPhaseID(val) { return val; }
12
+ export function asProjectPath(val) { return val; }
@@ -0,0 +1,82 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { resolveFrameworkDir } from "../../utils/security.js";
4
+ /**
5
+ * Handles acquiring a stateful lock on a resource.
6
+ */
7
+ export async function handleAcquireLock(projectRoot, args) {
8
+ const { resource, agent, ttl = 60 } = args;
9
+ const frameworkDir = resolveFrameworkDir(projectRoot);
10
+ const lockDir = path.join(projectRoot, frameworkDir, "locks");
11
+ const lockPath = path.join(lockDir, `${resource}.lock`);
12
+ try {
13
+ if (!fs.existsSync(lockDir))
14
+ fs.mkdirSync(lockDir, { recursive: true });
15
+ // Check for stale lock first
16
+ if (fs.existsSync(lockPath)) {
17
+ const stat = fs.statSync(lockPath);
18
+ const now = new Date().getTime();
19
+ const age = (now - stat.mtimeMs) / 1000;
20
+ if (age < ttl) {
21
+ return {
22
+ isError: true,
23
+ content: [{ type: "text", text: `Resource '${resource}' is currently locked by another agent.` }]
24
+ };
25
+ }
26
+ // Lock expired, safe to override by renaming first (POSIX atomic operation)
27
+ const tempLockPath = `${lockPath}.${Math.random().toString(36).substring(2)}.old`;
28
+ try {
29
+ fs.renameSync(lockPath, tempLockPath);
30
+ fs.unlinkSync(tempLockPath);
31
+ }
32
+ catch {
33
+ // If rename failed, it means another agent already evicting/deleting it.
34
+ // Do not delete anything else; proceed and let writeFileSync (wx flag) fail if a new lock exists.
35
+ }
36
+ }
37
+ // Use 'wx' flag for atomic file creation
38
+ const lockData = JSON.stringify({ agent, timestamp: new Date().toISOString() });
39
+ fs.writeFileSync(lockPath, lockData, { flag: "wx" });
40
+ return {
41
+ content: [{ type: "text", text: `[OK] Lock acquired for resource '${resource}' by ${agent}.` }]
42
+ };
43
+ }
44
+ catch (e) {
45
+ const error = e;
46
+ if (error.code === "EEXIST") {
47
+ return {
48
+ isError: true,
49
+ content: [{ type: "text", text: `Resource '${resource}' was just acquired by another agent.` }]
50
+ };
51
+ }
52
+ return {
53
+ isError: true,
54
+ content: [{ type: "text", text: `Failed to acquire lock: ${String(e)}` }]
55
+ };
56
+ }
57
+ }
58
+ /**
59
+ * Handles releasing a lock.
60
+ */
61
+ export async function handleReleaseLock(projectRoot, args) {
62
+ const { resource, agent } = args;
63
+ const frameworkDir = resolveFrameworkDir(projectRoot);
64
+ const lockPath = path.join(projectRoot, frameworkDir, "locks", `${resource}.lock`);
65
+ try {
66
+ if (!fs.existsSync(lockPath)) {
67
+ return { content: [{ type: "text", text: `ℹ️ No lock found for resource '${resource}'.` }] };
68
+ }
69
+ const lockData = JSON.parse(fs.readFileSync(lockPath, "utf8"));
70
+ if (lockData.agent !== agent) {
71
+ return {
72
+ isError: true,
73
+ content: [{ type: "text", text: `[ERROR] Denied: You do not own the lock for '${resource}'. Owned by ${lockData.agent}.` }]
74
+ };
75
+ }
76
+ fs.unlinkSync(lockPath);
77
+ return { content: [{ type: "text", text: `[OK] Lock released for resource '${resource}' by ${agent}.` }] };
78
+ }
79
+ catch (e) {
80
+ return { isError: true, content: [{ type: "text", text: `Failed to release lock: ${String(e)}` }] };
81
+ }
82
+ }
@@ -0,0 +1,35 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { resolveFrameworkDir } from "../../utils/security.js";
4
+ /**
5
+ * Handles agent registration with the Control Plane.
6
+ * This can be used to validate permissions and active status.
7
+ */
8
+ export async function handleRegisterAgent(projectRoot, args) {
9
+ const { agent, role, capability = 5, specialties } = args;
10
+ const frameworkDir = resolveFrameworkDir(projectRoot);
11
+ const registryDir = path.join(projectRoot, frameworkDir, "registry");
12
+ const agentFile = path.join(registryDir, `${agent.replace("@", "")}_active.json`);
13
+ try {
14
+ if (!fs.existsSync(registryDir))
15
+ fs.mkdirSync(registryDir, { recursive: true });
16
+ const agentData = {
17
+ agent,
18
+ role,
19
+ capability,
20
+ specialties,
21
+ last_seen: new Date().toISOString(),
22
+ status: "ACTIVE"
23
+ };
24
+ fs.writeFileSync(agentFile, JSON.stringify(agentData, null, 2));
25
+ return {
26
+ content: [{ type: "text", text: `[ATABEY] Agent ${agent} (${role}) registered successfully in the Atabey Control Plane.` }]
27
+ };
28
+ }
29
+ catch (e) {
30
+ return {
31
+ isError: true,
32
+ content: [{ type: "text", text: `Failed to register agent: ${String(e)}` }]
33
+ };
34
+ }
35
+ }