@putervision/behavior-mcp 0.1.1
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/CONTRIBUTING.md +7 -0
- package/LICENSE +21 -0
- package/PROJECT_INSTRUCTIONS_TEMPLATE.md +9 -0
- package/README.md +94 -0
- package/SECURITY.md +11 -0
- package/dist/chunk-FXYS43D6.js +291 -0
- package/dist/chunk-FXYS43D6.js.map +1 -0
- package/dist/chunk-L2LJRSDU.js +608 -0
- package/dist/chunk-L2LJRSDU.js.map +1 -0
- package/dist/chunk-MXYFWAJG.js +1176 -0
- package/dist/chunk-MXYFWAJG.js.map +1 -0
- package/dist/chunk-NCJFRFRK.js +399 -0
- package/dist/chunk-NCJFRFRK.js.map +1 -0
- package/dist/chunk-QU5PNQP4.js +266 -0
- package/dist/chunk-QU5PNQP4.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +169 -0
- package/dist/cli.js.map +1 -0
- package/dist/db-ZOU6XEDM.js +35 -0
- package/dist/db-ZOU6XEDM.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/init-QMBHF4FZ.js +15 -0
- package/dist/init-QMBHF4FZ.js.map +1 -0
- package/dist/lib.d.ts +672 -0
- package/dist/lib.js +443 -0
- package/dist/lib.js.map +1 -0
- package/glama.json +44 -0
- package/manifest.json +26 -0
- package/package.json +133 -0
- package/server.json +42 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NotFoundError,
|
|
3
|
+
ValidationError
|
|
4
|
+
} from "./chunk-L2LJRSDU.js";
|
|
5
|
+
|
|
6
|
+
// src/utils/id.ts
|
|
7
|
+
import * as crypto from "crypto";
|
|
8
|
+
var ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
9
|
+
function generateId() {
|
|
10
|
+
let now = Date.now();
|
|
11
|
+
let timeStr = "";
|
|
12
|
+
for (let i = 0; i < 10; i++) {
|
|
13
|
+
const mod = now % 32;
|
|
14
|
+
timeStr = ENCODING.charAt(mod) + timeStr;
|
|
15
|
+
now = Math.floor(now / 32);
|
|
16
|
+
}
|
|
17
|
+
const randomBytes2 = crypto.randomBytes(16);
|
|
18
|
+
let randomStr = "";
|
|
19
|
+
for (let i = 0; i < 16; i++) {
|
|
20
|
+
randomStr += ENCODING.charAt(randomBytes2[i] % 32);
|
|
21
|
+
}
|
|
22
|
+
return timeStr + randomStr;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/utils/time.ts
|
|
26
|
+
function getCurrentIsoString() {
|
|
27
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
28
|
+
}
|
|
29
|
+
function parseIsoString(iso) {
|
|
30
|
+
return new Date(iso);
|
|
31
|
+
}
|
|
32
|
+
function getElapsedTimeMs(startTimeIso) {
|
|
33
|
+
return Date.now() - new Date(startTimeIso).getTime();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/engine/events.ts
|
|
37
|
+
import crypto2 from "crypto";
|
|
38
|
+
|
|
39
|
+
// src/utils/json-validator.ts
|
|
40
|
+
function safeJsonParse(str, fallback) {
|
|
41
|
+
if (!str || typeof str !== "string") return fallback;
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(str);
|
|
44
|
+
} catch {
|
|
45
|
+
return fallback;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function safeJsonStringify(obj, fallback = "{}") {
|
|
49
|
+
try {
|
|
50
|
+
return JSON.stringify(obj);
|
|
51
|
+
} catch {
|
|
52
|
+
return fallback;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/engine/events.ts
|
|
57
|
+
function computeEventHash(params) {
|
|
58
|
+
const data = [
|
|
59
|
+
params.prev_hash,
|
|
60
|
+
params.id,
|
|
61
|
+
params.project,
|
|
62
|
+
params.entity_id,
|
|
63
|
+
params.entity_type,
|
|
64
|
+
params.action,
|
|
65
|
+
params.timestamp,
|
|
66
|
+
JSON.stringify(params.details || {})
|
|
67
|
+
].join("|");
|
|
68
|
+
return crypto2.createHash("sha256").update(data).digest("hex");
|
|
69
|
+
}
|
|
70
|
+
function logRuntimeEvent(db, params) {
|
|
71
|
+
const lastRow = db.prepare("SELECT hash FROM events WHERE project = ? ORDER BY rowid DESC LIMIT 1").get(params.project);
|
|
72
|
+
const prevHash = lastRow?.hash || "0".repeat(64);
|
|
73
|
+
const eventId = generateId();
|
|
74
|
+
const timestamp = getCurrentIsoString();
|
|
75
|
+
const hash = computeEventHash({
|
|
76
|
+
prev_hash: prevHash,
|
|
77
|
+
id: eventId,
|
|
78
|
+
project: params.project,
|
|
79
|
+
entity_id: params.entity_id,
|
|
80
|
+
entity_type: params.entity_type,
|
|
81
|
+
action: params.action,
|
|
82
|
+
timestamp,
|
|
83
|
+
details: params.details
|
|
84
|
+
});
|
|
85
|
+
db.prepare(
|
|
86
|
+
`
|
|
87
|
+
INSERT INTO events (id, project, entity_id, entity_type, action, prev_hash, hash, details_json, timestamp)
|
|
88
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
89
|
+
`
|
|
90
|
+
).run(
|
|
91
|
+
eventId,
|
|
92
|
+
params.project,
|
|
93
|
+
params.entity_id,
|
|
94
|
+
params.entity_type,
|
|
95
|
+
params.action,
|
|
96
|
+
prevHash,
|
|
97
|
+
hash,
|
|
98
|
+
JSON.stringify(params.details || {}),
|
|
99
|
+
timestamp
|
|
100
|
+
);
|
|
101
|
+
return {
|
|
102
|
+
id: eventId,
|
|
103
|
+
project: params.project,
|
|
104
|
+
entity_id: params.entity_id,
|
|
105
|
+
entity_type: params.entity_type,
|
|
106
|
+
action: params.action,
|
|
107
|
+
prev_hash: prevHash,
|
|
108
|
+
hash,
|
|
109
|
+
details: params.details,
|
|
110
|
+
timestamp
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function verifyEventChain(db, project) {
|
|
114
|
+
const rows = db.prepare("SELECT * FROM events WHERE project = ? ORDER BY rowid ASC").all(project);
|
|
115
|
+
if (rows.length === 0) {
|
|
116
|
+
return { valid: true, total_events: 0 };
|
|
117
|
+
}
|
|
118
|
+
let expectedPrevHash = "0".repeat(64);
|
|
119
|
+
for (const row of rows) {
|
|
120
|
+
if (row.prev_hash !== expectedPrevHash) {
|
|
121
|
+
return {
|
|
122
|
+
valid: false,
|
|
123
|
+
total_events: rows.length,
|
|
124
|
+
corrupted_event_id: row.id,
|
|
125
|
+
error: `Prev hash mismatch at event ${row.id}: expected ${expectedPrevHash}, found ${row.prev_hash}`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const calculatedHash = computeEventHash({
|
|
129
|
+
prev_hash: row.prev_hash,
|
|
130
|
+
id: row.id,
|
|
131
|
+
project: row.project,
|
|
132
|
+
entity_id: row.entity_id,
|
|
133
|
+
entity_type: row.entity_type,
|
|
134
|
+
action: row.action,
|
|
135
|
+
timestamp: row.timestamp,
|
|
136
|
+
details: safeJsonParse(row.details_json, {})
|
|
137
|
+
});
|
|
138
|
+
if (calculatedHash !== row.hash) {
|
|
139
|
+
return {
|
|
140
|
+
valid: false,
|
|
141
|
+
total_events: rows.length,
|
|
142
|
+
corrupted_event_id: row.id,
|
|
143
|
+
error: `Data tamper detected at event ${row.id}: hash mismatch`
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
expectedPrevHash = row.hash;
|
|
147
|
+
}
|
|
148
|
+
return { valid: true, total_events: rows.length };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/engine/behaviors.ts
|
|
152
|
+
import crypto3 from "crypto";
|
|
153
|
+
function computeTreeHash(treeJson) {
|
|
154
|
+
return crypto3.createHash("sha256").update(treeJson.trim()).digest("hex");
|
|
155
|
+
}
|
|
156
|
+
var BehaviorRegistry = class {
|
|
157
|
+
static registerBehavior(db, params) {
|
|
158
|
+
if (!params.name) throw new ValidationError("Behavior name is required.");
|
|
159
|
+
if (!params.tree) throw new ValidationError("Behavior tree definition is required.");
|
|
160
|
+
if (params.client_request_id) {
|
|
161
|
+
const existing = db.prepare("SELECT * FROM behavior_definitions WHERE project = ? AND client_request_id = ?").get(params.project, params.client_request_id);
|
|
162
|
+
if (existing) {
|
|
163
|
+
return this.mapRowToBehavior(existing);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const treeJson = safeJsonStringify(params.tree);
|
|
167
|
+
const treeHash = computeTreeHash(treeJson);
|
|
168
|
+
const version = params.version || 1;
|
|
169
|
+
const now = getCurrentIsoString();
|
|
170
|
+
const id = generateId();
|
|
171
|
+
db.prepare(
|
|
172
|
+
`
|
|
173
|
+
INSERT INTO behavior_definitions (
|
|
174
|
+
id, project, name, version, description, tree_json, tree_hash,
|
|
175
|
+
is_active, client_request_id, created_at
|
|
176
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?)
|
|
177
|
+
ON CONFLICT(project, name, version) DO UPDATE SET
|
|
178
|
+
description = excluded.description,
|
|
179
|
+
tree_json = excluded.tree_json,
|
|
180
|
+
tree_hash = excluded.tree_hash,
|
|
181
|
+
created_at = excluded.created_at
|
|
182
|
+
`
|
|
183
|
+
).run(
|
|
184
|
+
id,
|
|
185
|
+
params.project,
|
|
186
|
+
params.name,
|
|
187
|
+
version,
|
|
188
|
+
params.description ?? null,
|
|
189
|
+
treeJson,
|
|
190
|
+
treeHash,
|
|
191
|
+
params.client_request_id ?? null,
|
|
192
|
+
now
|
|
193
|
+
);
|
|
194
|
+
logRuntimeEvent(db, {
|
|
195
|
+
project: params.project,
|
|
196
|
+
entity_id: id,
|
|
197
|
+
entity_type: "behavior",
|
|
198
|
+
action: "register",
|
|
199
|
+
details: { name: params.name, version, tree_hash: treeHash }
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
id,
|
|
203
|
+
project: params.project,
|
|
204
|
+
name: params.name,
|
|
205
|
+
version,
|
|
206
|
+
description: params.description,
|
|
207
|
+
tree_json: treeJson,
|
|
208
|
+
tree_hash: treeHash,
|
|
209
|
+
is_active: true,
|
|
210
|
+
client_request_id: params.client_request_id,
|
|
211
|
+
created_at: now
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
static getBehavior(db, params) {
|
|
215
|
+
let sql = "SELECT * FROM behavior_definitions WHERE project = ? AND name = ?";
|
|
216
|
+
const sqlParams = [params.project, params.name];
|
|
217
|
+
if (params.version) {
|
|
218
|
+
sql += " AND version = ?";
|
|
219
|
+
sqlParams.push(params.version);
|
|
220
|
+
} else {
|
|
221
|
+
sql += " ORDER BY version DESC LIMIT 1";
|
|
222
|
+
}
|
|
223
|
+
const row = db.prepare(sql).get(...sqlParams);
|
|
224
|
+
if (!row)
|
|
225
|
+
throw new NotFoundError(
|
|
226
|
+
`Behavior "${params.name}" (v${params.version || "latest"}) not found.`
|
|
227
|
+
);
|
|
228
|
+
return this.mapRowToBehavior(row);
|
|
229
|
+
}
|
|
230
|
+
static listBehaviors(db, project) {
|
|
231
|
+
const rows = db.prepare(
|
|
232
|
+
"SELECT * FROM behavior_definitions WHERE project = ? ORDER BY name ASC, version DESC"
|
|
233
|
+
).all(project);
|
|
234
|
+
return rows.map((r) => this.mapRowToBehavior(r));
|
|
235
|
+
}
|
|
236
|
+
static mapRowToBehavior(row) {
|
|
237
|
+
return {
|
|
238
|
+
id: row.id,
|
|
239
|
+
project: row.project,
|
|
240
|
+
name: row.name,
|
|
241
|
+
version: row.version,
|
|
242
|
+
description: row.description,
|
|
243
|
+
tree_json: row.tree_json,
|
|
244
|
+
tree_hash: row.tree_hash,
|
|
245
|
+
is_active: row.is_active === 1,
|
|
246
|
+
metadata: safeJsonParse(row.metadata_json, void 0),
|
|
247
|
+
client_request_id: row.client_request_id,
|
|
248
|
+
created_at: row.created_at
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export {
|
|
254
|
+
generateId,
|
|
255
|
+
getCurrentIsoString,
|
|
256
|
+
parseIsoString,
|
|
257
|
+
getElapsedTimeMs,
|
|
258
|
+
safeJsonParse,
|
|
259
|
+
safeJsonStringify,
|
|
260
|
+
computeEventHash,
|
|
261
|
+
logRuntimeEvent,
|
|
262
|
+
verifyEventChain,
|
|
263
|
+
computeTreeHash,
|
|
264
|
+
BehaviorRegistry
|
|
265
|
+
};
|
|
266
|
+
//# sourceMappingURL=chunk-QU5PNQP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/id.ts","../src/utils/time.ts","../src/engine/events.ts","../src/utils/json-validator.ts","../src/engine/behaviors.ts"],"sourcesContent":["import * as crypto from 'crypto';\n\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\nexport function generateId(): string {\n let now = Date.now();\n let timeStr = '';\n for (let i = 0; i < 10; i++) {\n const mod = now % 32;\n timeStr = ENCODING.charAt(mod) + timeStr;\n now = Math.floor(now / 32);\n }\n\n const randomBytes = crypto.randomBytes(16);\n let randomStr = '';\n for (let i = 0; i < 16; i++) {\n randomStr += ENCODING.charAt(randomBytes[i] % 32);\n }\n\n return timeStr + randomStr;\n}\n","export function getCurrentIsoString(): string {\n return new Date().toISOString();\n}\n\nexport function parseIsoString(iso: string): Date {\n return new Date(iso);\n}\n\nexport function getElapsedTimeMs(startTimeIso: string): number {\n return Date.now() - new Date(startTimeIso).getTime();\n}\n","import crypto from 'crypto';\nimport Database from 'better-sqlite3';\nimport { RuntimeEvent, EventId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse } from '../utils/json-validator.js';\n\nexport function computeEventHash(params: {\n prev_hash: string;\n id: string;\n project: string;\n entity_id: string;\n entity_type: string;\n action: string;\n timestamp: string;\n details?: Record<string, unknown>;\n}): string {\n const data = [\n params.prev_hash,\n params.id,\n params.project,\n params.entity_id,\n params.entity_type,\n params.action,\n params.timestamp,\n JSON.stringify(params.details || {}),\n ].join('|');\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function logRuntimeEvent(\n db: Database.Database,\n params: {\n project: string;\n entity_id: string;\n entity_type: 'behavior' | 'execution' | 'trigger' | 'recording' | 'safety';\n action: string;\n details?: Record<string, unknown>;\n }\n): RuntimeEvent {\n const lastRow = db\n .prepare('SELECT hash FROM events WHERE project = ? ORDER BY rowid DESC LIMIT 1')\n .get(params.project) as { hash?: string } | undefined;\n const prevHash = lastRow?.hash || '0'.repeat(64);\n\n const eventId = generateId() as EventId;\n const timestamp = getCurrentIsoString();\n const hash = computeEventHash({\n prev_hash: prevHash,\n id: eventId,\n project: params.project,\n entity_id: params.entity_id,\n entity_type: params.entity_type,\n action: params.action,\n timestamp,\n details: params.details,\n });\n\n db.prepare(\n `\n INSERT INTO events (id, project, entity_id, entity_type, action, prev_hash, hash, details_json, timestamp)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n ).run(\n eventId,\n params.project,\n params.entity_id,\n params.entity_type,\n params.action,\n prevHash,\n hash,\n JSON.stringify(params.details || {}),\n timestamp\n );\n\n return {\n id: eventId,\n project: params.project,\n entity_id: params.entity_id,\n entity_type: params.entity_type,\n action: params.action,\n prev_hash: prevHash,\n hash,\n details: params.details,\n timestamp,\n };\n}\n\nexport function verifyEventChain(\n db: Database.Database,\n project: string\n): { valid: boolean; total_events: number; corrupted_event_id?: string; error?: string } {\n const rows = db\n .prepare('SELECT * FROM events WHERE project = ? ORDER BY rowid ASC')\n .all(project) as any[];\n\n if (rows.length === 0) {\n return { valid: true, total_events: 0 };\n }\n\n let expectedPrevHash = '0'.repeat(64);\n for (const row of rows) {\n if (row.prev_hash !== expectedPrevHash) {\n return {\n valid: false,\n total_events: rows.length,\n corrupted_event_id: row.id,\n error: `Prev hash mismatch at event ${row.id}: expected ${expectedPrevHash}, found ${row.prev_hash}`,\n };\n }\n\n const calculatedHash = computeEventHash({\n prev_hash: row.prev_hash,\n id: row.id,\n project: row.project,\n entity_id: row.entity_id,\n entity_type: row.entity_type,\n action: row.action,\n timestamp: row.timestamp,\n details: safeJsonParse(row.details_json, {}),\n });\n\n if (calculatedHash !== row.hash) {\n return {\n valid: false,\n total_events: rows.length,\n corrupted_event_id: row.id,\n error: `Data tamper detected at event ${row.id}: hash mismatch`,\n };\n }\n\n expectedPrevHash = row.hash;\n }\n\n return { valid: true, total_events: rows.length };\n}\n","export function safeJsonParse<T = any>(str: string | null | undefined, fallback: T): T {\n if (!str || typeof str !== 'string') return fallback;\n try {\n return JSON.parse(str) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function safeJsonStringify(obj: unknown, fallback = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch {\n return fallback;\n }\n}\n","import crypto from 'crypto';\nimport Database from 'better-sqlite3';\nimport { BehaviorDefinition, BehaviorId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse, safeJsonStringify } from '../utils/json-validator.js';\nimport { ValidationError, NotFoundError } from '../utils/errors.js';\nimport { logRuntimeEvent } from './events.js';\n\nexport function computeTreeHash(treeJson: string): string {\n return crypto.createHash('sha256').update(treeJson.trim()).digest('hex');\n}\n\nexport class BehaviorRegistry {\n static registerBehavior(\n db: Database.Database,\n params: {\n project: string;\n name: string;\n version?: number;\n description?: string;\n tree: unknown;\n client_request_id?: string;\n }\n ): BehaviorDefinition {\n if (!params.name) throw new ValidationError('Behavior name is required.');\n if (!params.tree) throw new ValidationError('Behavior tree definition is required.');\n\n if (params.client_request_id) {\n const existing = db\n .prepare('SELECT * FROM behavior_definitions WHERE project = ? AND client_request_id = ?')\n .get(params.project, params.client_request_id) as any;\n if (existing) {\n return this.mapRowToBehavior(existing);\n }\n }\n\n const treeJson = safeJsonStringify(params.tree);\n const treeHash = computeTreeHash(treeJson);\n const version = params.version || 1;\n const now = getCurrentIsoString();\n const id = generateId() as BehaviorId;\n\n db.prepare(\n `\n INSERT INTO behavior_definitions (\n id, project, name, version, description, tree_json, tree_hash,\n is_active, client_request_id, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?)\n ON CONFLICT(project, name, version) DO UPDATE SET\n description = excluded.description,\n tree_json = excluded.tree_json,\n tree_hash = excluded.tree_hash,\n created_at = excluded.created_at\n `\n ).run(\n id,\n params.project,\n params.name,\n version,\n params.description ?? null,\n treeJson,\n treeHash,\n params.client_request_id ?? null,\n now\n );\n\n logRuntimeEvent(db, {\n project: params.project,\n entity_id: id,\n entity_type: 'behavior',\n action: 'register',\n details: { name: params.name, version, tree_hash: treeHash },\n });\n\n return {\n id,\n project: params.project,\n name: params.name,\n version,\n description: params.description,\n tree_json: treeJson,\n tree_hash: treeHash,\n is_active: true,\n client_request_id: params.client_request_id,\n created_at: now,\n };\n }\n\n static getBehavior(\n db: Database.Database,\n params: { project: string; name: string; version?: number }\n ): BehaviorDefinition {\n let sql = 'SELECT * FROM behavior_definitions WHERE project = ? AND name = ?';\n const sqlParams: any[] = [params.project, params.name];\n\n if (params.version) {\n sql += ' AND version = ?';\n sqlParams.push(params.version);\n } else {\n sql += ' ORDER BY version DESC LIMIT 1';\n }\n\n const row = db.prepare(sql).get(...sqlParams) as any;\n if (!row)\n throw new NotFoundError(\n `Behavior \"${params.name}\" (v${params.version || 'latest'}) not found.`\n );\n return this.mapRowToBehavior(row);\n }\n\n static listBehaviors(db: Database.Database, project: string): BehaviorDefinition[] {\n const rows = db\n .prepare(\n 'SELECT * FROM behavior_definitions WHERE project = ? ORDER BY name ASC, version DESC'\n )\n .all(project) as any[];\n return rows.map((r) => this.mapRowToBehavior(r));\n }\n\n private static mapRowToBehavior(row: any): BehaviorDefinition {\n return {\n id: row.id as BehaviorId,\n project: row.project,\n name: row.name,\n version: row.version,\n description: row.description,\n tree_json: row.tree_json,\n tree_hash: row.tree_hash,\n is_active: row.is_active === 1,\n metadata: safeJsonParse(row.metadata_json, undefined),\n client_request_id: row.client_request_id,\n created_at: row.created_at,\n };\n }\n}\n"],"mappings":"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","names":["randomBytes","crypto","crypto","crypto","crypto"]}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ExecutionEngine,
|
|
4
|
+
TriggerRegistry,
|
|
5
|
+
getVersion
|
|
6
|
+
} from "./chunk-FXYS43D6.js";
|
|
7
|
+
import {
|
|
8
|
+
runInit
|
|
9
|
+
} from "./chunk-NCJFRFRK.js";
|
|
10
|
+
import {
|
|
11
|
+
BehaviorRegistry,
|
|
12
|
+
verifyEventChain
|
|
13
|
+
} from "./chunk-QU5PNQP4.js";
|
|
14
|
+
import {
|
|
15
|
+
getDb,
|
|
16
|
+
getProjectSlug,
|
|
17
|
+
resolveProjectRoot
|
|
18
|
+
} from "./chunk-L2LJRSDU.js";
|
|
19
|
+
|
|
20
|
+
// src/cli.ts
|
|
21
|
+
import fs from "fs";
|
|
22
|
+
import path from "path";
|
|
23
|
+
function showHelp() {
|
|
24
|
+
console.log(`
|
|
25
|
+
behavior-mcp CLI Tool v${getVersion()}
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
behavior-mcp <command> [options]
|
|
29
|
+
|
|
30
|
+
Commands:
|
|
31
|
+
run Start the MCP server on stdio transport (Default)
|
|
32
|
+
init Scaffold the workspace, database, seed behaviors, and IDE agent rules
|
|
33
|
+
init-global Re-initialize across all projects registered in ~/.behavior-mcp/projects.json
|
|
34
|
+
doctor Run environment and database health checks
|
|
35
|
+
inspect Display tables of behaviors, active execution, and triggers
|
|
36
|
+
audit Audit cryptographic SHA-256 event ledger hash chain
|
|
37
|
+
view Open interactive behavior tree visualizer (viewer.html)
|
|
38
|
+
update Check npm registry for package updates
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
-p, --project Target specific project slug
|
|
42
|
+
-v, --version Show version number
|
|
43
|
+
-h, --help Show this help menu
|
|
44
|
+
`);
|
|
45
|
+
}
|
|
46
|
+
async function main() {
|
|
47
|
+
const rawArgs = process.argv.slice(2);
|
|
48
|
+
if (rawArgs.includes("--help") || rawArgs.includes("-h")) {
|
|
49
|
+
showHelp();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
if (rawArgs.includes("--version") || rawArgs.includes("-v")) {
|
|
53
|
+
console.log(getVersion());
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
let project;
|
|
57
|
+
const pIndex = rawArgs.findIndex((a) => a === "-p" || a === "--project");
|
|
58
|
+
if (pIndex !== -1 && rawArgs[pIndex + 1]) {
|
|
59
|
+
project = rawArgs[pIndex + 1];
|
|
60
|
+
}
|
|
61
|
+
const positional = rawArgs.filter((a, idx) => {
|
|
62
|
+
if (a.startsWith("-")) return false;
|
|
63
|
+
if (idx > 0 && (rawArgs[idx - 1] === "-p" || rawArgs[idx - 1] === "--project" || rawArgs[idx - 1] === "-o" || rawArgs[idx - 1] === "--out")) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
});
|
|
68
|
+
const command = positional[0] || "run";
|
|
69
|
+
switch (command) {
|
|
70
|
+
case "run": {
|
|
71
|
+
await import("./index.js");
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case "init": {
|
|
75
|
+
runInit({ project });
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case "init-global": {
|
|
79
|
+
const { runInitGlobal } = await import("./init-QMBHF4FZ.js");
|
|
80
|
+
await runInitGlobal();
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case "doctor": {
|
|
84
|
+
const root = resolveProjectRoot(project);
|
|
85
|
+
const slug = getProjectSlug(project);
|
|
86
|
+
console.log(`Running diagnostic doctor for "${slug}" in ${root}...`);
|
|
87
|
+
try {
|
|
88
|
+
const db = getDb(slug);
|
|
89
|
+
const integrity = db.pragma("integrity_check");
|
|
90
|
+
const journal = db.pragma("journal_mode");
|
|
91
|
+
const eventAudit = verifyEventChain(db, slug);
|
|
92
|
+
console.log(`\u2714 SQLite database accessibility: OK`);
|
|
93
|
+
console.log(`\u2714 Journal mode: ${JSON.stringify(journal)}`);
|
|
94
|
+
console.log(`\u2714 Database integrity: ${JSON.stringify(integrity)}`);
|
|
95
|
+
console.log(`\u2714 Event chain verification: ${eventAudit.valid ? "VALID (unbroken)" : "FAILED"}`);
|
|
96
|
+
console.log("\nDoctor diagnostic check PASSED.");
|
|
97
|
+
} catch (err) {
|
|
98
|
+
console.error(`\u2716 Doctor check failed: ${err.message}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case "doctor-global": {
|
|
104
|
+
const { getRegistry } = await import("./db-ZOU6XEDM.js");
|
|
105
|
+
const registry = getRegistry();
|
|
106
|
+
const entries = Object.entries(registry);
|
|
107
|
+
console.log(`Running global diagnostic doctor across ${entries.length} registered project(s)...`);
|
|
108
|
+
let allPassed = true;
|
|
109
|
+
for (const [slug, projectRoot] of entries) {
|
|
110
|
+
if (!fs.existsSync(projectRoot)) {
|
|
111
|
+
console.log(`\u26A0\uFE0F ${slug}: Missing project root directory (${projectRoot})`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const db = getDb(slug, projectRoot);
|
|
116
|
+
const integrity = db.pragma("integrity_check");
|
|
117
|
+
const eventAudit = verifyEventChain(db, slug);
|
|
118
|
+
const ok = integrity && eventAudit.valid;
|
|
119
|
+
console.log(` ${ok ? "\u2714" : "\u2716"} ${slug}: ${ok ? "HEALTHY" : "ANOMALY DETECTED"}`);
|
|
120
|
+
if (!ok) allPassed = false;
|
|
121
|
+
} catch (err) {
|
|
122
|
+
console.log(` \u2716 ${slug}: ${err.message}`);
|
|
123
|
+
allPassed = false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
console.log(`
|
|
127
|
+
Global doctor check ${allPassed ? "PASSED" : "COMPLETED WITH WARNINGS"}.`);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case "inspect": {
|
|
131
|
+
const slug = getProjectSlug(project);
|
|
132
|
+
const db = getDb(slug);
|
|
133
|
+
console.log(`
|
|
134
|
+
=== Registered Behaviors for ${slug} ===`);
|
|
135
|
+
console.table(BehaviorRegistry.listBehaviors(db, slug), ["id", "name", "version", "tree_hash"]);
|
|
136
|
+
console.log(`
|
|
137
|
+
=== Active Executions for ${slug} ===`);
|
|
138
|
+
console.table(ExecutionEngine.listExecutions(db, { project: slug, limit: 10 }), ["id", "behavior_name", "status", "current_tick", "active_node_path"]);
|
|
139
|
+
console.log(`
|
|
140
|
+
=== Reactive Triggers for ${slug} ===`);
|
|
141
|
+
console.table(TriggerRegistry.listTriggers(db, slug), ["id", "name", "behavior_name", "condition_type", "priority", "is_enabled"]);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case "audit": {
|
|
145
|
+
const slug = getProjectSlug(project);
|
|
146
|
+
const db = getDb(slug);
|
|
147
|
+
const audit = verifyEventChain(db, slug);
|
|
148
|
+
console.log(`Audit result for "${slug}":`, audit);
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "view": {
|
|
152
|
+
console.log(`Interactive visualizer available at: ${path.resolve(process.cwd(), "viewer.html")}`);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case "update": {
|
|
156
|
+
console.log(`@putervision/behavior-mcp is up to date (v${getVersion()}).`);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
default:
|
|
160
|
+
console.error(`Unknown command: ${command}`);
|
|
161
|
+
showHelp();
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
main().catch((err) => {
|
|
166
|
+
console.error("Fatal CLI error:", err);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs';\nimport path from 'path';\nimport { runInit } from './cli/init.js';\nimport { getDb, resolveProjectRoot, getProjectSlug } from './engine/db.js';\nimport { BehaviorRegistry } from './engine/behaviors.js';\nimport { ExecutionEngine } from './engine/executor.js';\nimport { TriggerRegistry } from './engine/triggers.js';\nimport { MetricsEngine } from './engine/metrics.js';\nimport { verifyEventChain } from './engine/events.js';\nimport { getVersion } from './utils/version.js';\n\nfunction showHelp() {\n console.log(`\nbehavior-mcp CLI Tool v${getVersion()}\n\nUsage:\n behavior-mcp <command> [options]\n\nCommands:\n run Start the MCP server on stdio transport (Default)\n init Scaffold the workspace, database, seed behaviors, and IDE agent rules\n init-global Re-initialize across all projects registered in ~/.behavior-mcp/projects.json\n doctor Run environment and database health checks\n inspect Display tables of behaviors, active execution, and triggers\n audit Audit cryptographic SHA-256 event ledger hash chain\n view Open interactive behavior tree visualizer (viewer.html)\n update Check npm registry for package updates\n\nOptions:\n -p, --project Target specific project slug\n -v, --version Show version number\n -h, --help Show this help menu\n`);\n}\n\nasync function main() {\n const rawArgs = process.argv.slice(2);\n\n if (rawArgs.includes('--help') || rawArgs.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n if (rawArgs.includes('--version') || rawArgs.includes('-v')) {\n console.log(getVersion());\n process.exit(0);\n }\n\n let project: string | undefined;\n const pIndex = rawArgs.findIndex((a) => a === '-p' || a === '--project');\n if (pIndex !== -1 && rawArgs[pIndex + 1]) {\n project = rawArgs[pIndex + 1];\n }\n\n // Filter out options and their paired values for command determination\n const positional = rawArgs.filter((a, idx) => {\n if (a.startsWith('-')) return false;\n if (idx > 0 && (rawArgs[idx - 1] === '-p' || rawArgs[idx - 1] === '--project' || rawArgs[idx - 1] === '-o' || rawArgs[idx - 1] === '--out')) {\n return false;\n }\n return true;\n });\n\n const command = positional[0] || 'run';\n\n switch (command) {\n case 'run': {\n await import('./index.js');\n break;\n }\n\n case 'init': {\n runInit({ project });\n break;\n }\n\n case 'init-global': {\n const { runInitGlobal } = await import('./cli/init.js');\n await runInitGlobal();\n break;\n }\n\n case 'doctor': {\n const root = resolveProjectRoot(project);\n const slug = getProjectSlug(project);\n console.log(`Running diagnostic doctor for \"${slug}\" in ${root}...`);\n try {\n const db = getDb(slug);\n const integrity = db.pragma('integrity_check');\n const journal = db.pragma('journal_mode');\n const eventAudit = verifyEventChain(db, slug);\n console.log(`✔ SQLite database accessibility: OK`);\n console.log(`✔ Journal mode: ${JSON.stringify(journal)}`);\n console.log(`✔ Database integrity: ${JSON.stringify(integrity)}`);\n console.log(`✔ Event chain verification: ${eventAudit.valid ? 'VALID (unbroken)' : 'FAILED'}`);\n console.log('\\nDoctor diagnostic check PASSED.');\n } catch (err: any) {\n console.error(`✖ Doctor check failed: ${err.message}`);\n process.exit(1);\n }\n break;\n }\n\n case 'doctor-global': {\n const { getRegistry } = await import('./engine/db.js');\n const registry = getRegistry();\n const entries = Object.entries(registry);\n console.log(`Running global diagnostic doctor across ${entries.length} registered project(s)...`);\n let allPassed = true;\n\n for (const [slug, projectRoot] of entries) {\n if (!fs.existsSync(projectRoot)) {\n console.log(`⚠️ ${slug}: Missing project root directory (${projectRoot})`);\n continue;\n }\n try {\n const db = getDb(slug, projectRoot);\n const integrity = db.pragma('integrity_check');\n const eventAudit = verifyEventChain(db, slug);\n const ok = integrity && eventAudit.valid;\n console.log(` ${ok ? '✔' : '✖'} ${slug}: ${ok ? 'HEALTHY' : 'ANOMALY DETECTED'}`);\n if (!ok) allPassed = false;\n } catch (err: any) {\n console.log(` ✖ ${slug}: ${err.message}`);\n allPassed = false;\n }\n }\n console.log(`\\nGlobal doctor check ${allPassed ? 'PASSED' : 'COMPLETED WITH WARNINGS'}.`);\n break;\n }\n\n case 'inspect': {\n const slug = getProjectSlug(project);\n const db = getDb(slug);\n console.log(`\\n=== Registered Behaviors for ${slug} ===`);\n console.table(BehaviorRegistry.listBehaviors(db, slug), ['id', 'name', 'version', 'tree_hash']);\n\n console.log(`\\n=== Active Executions for ${slug} ===`);\n console.table(ExecutionEngine.listExecutions(db, { project: slug, limit: 10 }), ['id', 'behavior_name', 'status', 'current_tick', 'active_node_path']);\n\n console.log(`\\n=== Reactive Triggers for ${slug} ===`);\n console.table(TriggerRegistry.listTriggers(db, slug), ['id', 'name', 'behavior_name', 'condition_type', 'priority', 'is_enabled']);\n break;\n }\n\n case 'audit': {\n const slug = getProjectSlug(project);\n const db = getDb(slug);\n const audit = verifyEventChain(db, slug);\n console.log(`Audit result for \"${slug}\":`, audit);\n break;\n }\n\n case 'view': {\n console.log(`Interactive visualizer available at: ${path.resolve(process.cwd(), 'viewer.html')}`);\n break;\n }\n\n case 'update': {\n console.log(`@putervision/behavior-mcp is up to date (v${getVersion()}).`);\n break;\n }\n\n default:\n console.error(`Unknown command: ${command}`);\n showHelp();\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('Fatal CLI error:', err);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
closeAllDbs,
|
|
3
|
+
closeDb,
|
|
4
|
+
getBaseDir,
|
|
5
|
+
getDb,
|
|
6
|
+
getDbPath,
|
|
7
|
+
getProjectDbDir,
|
|
8
|
+
getProjectSlug,
|
|
9
|
+
getReadOnlyDb,
|
|
10
|
+
getRegistry,
|
|
11
|
+
getRegistryPath,
|
|
12
|
+
registerProject,
|
|
13
|
+
resolveProjectRoot,
|
|
14
|
+
sanitizeSlug,
|
|
15
|
+
unregisterProject,
|
|
16
|
+
validatePath
|
|
17
|
+
} from "./chunk-L2LJRSDU.js";
|
|
18
|
+
export {
|
|
19
|
+
closeAllDbs,
|
|
20
|
+
closeDb,
|
|
21
|
+
getBaseDir,
|
|
22
|
+
getDb,
|
|
23
|
+
getDbPath,
|
|
24
|
+
getProjectDbDir,
|
|
25
|
+
getProjectSlug,
|
|
26
|
+
getReadOnlyDb,
|
|
27
|
+
getRegistry,
|
|
28
|
+
getRegistryPath,
|
|
29
|
+
registerProject,
|
|
30
|
+
resolveProjectRoot,
|
|
31
|
+
sanitizeSlug,
|
|
32
|
+
unregisterProject,
|
|
33
|
+
validatePath
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=db-ZOU6XEDM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
server
|
|
3
|
+
} from "./chunk-MXYFWAJG.js";
|
|
4
|
+
import {
|
|
5
|
+
getVersion
|
|
6
|
+
} from "./chunk-FXYS43D6.js";
|
|
7
|
+
import {
|
|
8
|
+
runAutoInit
|
|
9
|
+
} from "./chunk-NCJFRFRK.js";
|
|
10
|
+
import "./chunk-QU5PNQP4.js";
|
|
11
|
+
import {
|
|
12
|
+
closeAllDbs,
|
|
13
|
+
getProjectSlug,
|
|
14
|
+
logger,
|
|
15
|
+
resolveProjectRoot
|
|
16
|
+
} from "./chunk-L2LJRSDU.js";
|
|
17
|
+
|
|
18
|
+
// src/index.ts
|
|
19
|
+
import * as path from "path";
|
|
20
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
21
|
+
var isShuttingDown = false;
|
|
22
|
+
async function shutdown(signal) {
|
|
23
|
+
if (isShuttingDown) return;
|
|
24
|
+
isShuttingDown = true;
|
|
25
|
+
logger.info(`Received ${signal}. Shutting down behavior-mcp...`);
|
|
26
|
+
const forceTimer = setTimeout(() => {
|
|
27
|
+
logger.warn("Shutdown timed out. Forcing exit.");
|
|
28
|
+
process.exit(signal === "uncaughtException" || signal === "unhandledRejection" ? 1 : 0);
|
|
29
|
+
}, 1e3);
|
|
30
|
+
forceTimer.unref();
|
|
31
|
+
try {
|
|
32
|
+
await server.close();
|
|
33
|
+
logger.info("MCP server connection closed.");
|
|
34
|
+
} catch (err) {
|
|
35
|
+
logger.error("Error closing MCP server:", err.message);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
closeAllDbs();
|
|
39
|
+
logger.info("Database connections closed.");
|
|
40
|
+
} catch (err) {
|
|
41
|
+
logger.error("Error closing databases:", err.message);
|
|
42
|
+
}
|
|
43
|
+
if (signal === "uncaughtException" || signal === "unhandledRejection") {
|
|
44
|
+
process.exit(1);
|
|
45
|
+
} else {
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function main() {
|
|
50
|
+
const version = getVersion();
|
|
51
|
+
logger.info(`Starting behavior-mcp server v${version}...`);
|
|
52
|
+
try {
|
|
53
|
+
const root = resolveProjectRoot();
|
|
54
|
+
const projectName = path.basename(root);
|
|
55
|
+
const projectSlug = getProjectSlug(projectName);
|
|
56
|
+
await runAutoInit(root, projectSlug);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
logger.warn(`Auto-initialization skipped: ${err.message}`);
|
|
59
|
+
}
|
|
60
|
+
const transport = new StdioServerTransport();
|
|
61
|
+
await server.connect(transport);
|
|
62
|
+
logger.info("behavior-mcp server connected over stdio.");
|
|
63
|
+
}
|
|
64
|
+
process.stdin.on("close", () => {
|
|
65
|
+
shutdown("stdin close").catch((err) => {
|
|
66
|
+
logger.error("Error during stdin close shutdown:", err);
|
|
67
|
+
process.exit(0);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
process.on("SIGINT", () => {
|
|
71
|
+
shutdown("SIGINT").catch((err) => {
|
|
72
|
+
logger.error("Error during SIGINT shutdown:", err);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
process.on("SIGTERM", () => {
|
|
77
|
+
shutdown("SIGTERM").catch((err) => {
|
|
78
|
+
logger.error("Error during SIGTERM shutdown:", err);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
process.on("uncaughtException", (error) => {
|
|
83
|
+
logger.error("Uncaught Exception:", error);
|
|
84
|
+
shutdown("uncaughtException").catch((err) => {
|
|
85
|
+
logger.error("Error during shutdown:", err);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
90
|
+
logger.error("Unhandled Rejection at:", promise, "reason:", reason);
|
|
91
|
+
shutdown("unhandledRejection").catch((err) => {
|
|
92
|
+
logger.error("Error during shutdown:", err);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
main().catch((error) => {
|
|
97
|
+
logger.error("Fatal error starting server:", error);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import * as path from 'path';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { server } from './server.js';\nimport { logger } from './utils/logger.js';\nimport { closeAllDbs, resolveProjectRoot, getProjectSlug } from './engine/db.js';\nimport { runAutoInit } from './cli/init.js';\nimport { getVersion } from './utils/version.js';\n\nlet isShuttingDown = false;\n\nasync function shutdown(signal: string) {\n if (isShuttingDown) return;\n isShuttingDown = true;\n logger.info(`Received ${signal}. Shutting down behavior-mcp...`);\n\n const forceTimer = setTimeout(() => {\n logger.warn('Shutdown timed out. Forcing exit.');\n process.exit(signal === 'uncaughtException' || signal === 'unhandledRejection' ? 1 : 0);\n }, 1000);\n forceTimer.unref();\n\n try {\n await server.close();\n logger.info('MCP server connection closed.');\n } catch (err: any) {\n logger.error('Error closing MCP server:', err.message);\n }\n\n try {\n closeAllDbs();\n logger.info('Database connections closed.');\n } catch (err: any) {\n logger.error('Error closing databases:', err.message);\n }\n\n if (signal === 'uncaughtException' || signal === 'unhandledRejection') {\n process.exit(1);\n } else {\n process.exit(0);\n }\n}\n\nasync function main() {\n const version = getVersion();\n logger.info(`Starting behavior-mcp server v${version}...`);\n\n // Run fast non-destructive auto-initialization\n try {\n const root = resolveProjectRoot();\n const projectName = path.basename(root);\n const projectSlug = getProjectSlug(projectName);\n await runAutoInit(root, projectSlug);\n } catch (err: any) {\n logger.warn(`Auto-initialization skipped: ${err.message}`);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('behavior-mcp server connected over stdio.');\n}\n\nprocess.stdin.on('close', () => {\n shutdown('stdin close').catch((err) => {\n logger.error('Error during stdin close shutdown:', err);\n process.exit(0);\n });\n});\n\nprocess.on('SIGINT', () => {\n shutdown('SIGINT').catch((err) => {\n logger.error('Error during SIGINT shutdown:', err);\n process.exit(1);\n });\n});\n\nprocess.on('SIGTERM', () => {\n shutdown('SIGTERM').catch((err) => {\n logger.error('Error during SIGTERM shutdown:', err);\n process.exit(1);\n });\n});\n\nprocess.on('uncaughtException', (error) => {\n logger.error('Uncaught Exception:', error);\n shutdown('uncaughtException').catch((err) => {\n logger.error('Error during shutdown:', err);\n process.exit(1);\n });\n});\n\nprocess.on('unhandledRejection', (reason, promise) => {\n logger.error('Unhandled Rejection at:', promise, 'reason:', reason);\n shutdown('unhandledRejection').catch((err) => {\n logger.error('Error during shutdown:', err);\n process.exit(1);\n });\n});\n\nmain().catch((error) => {\n logger.error('Fatal error starting server:', error);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,YAAY,UAAU;AACtB,SAAS,4BAA4B;AAOrC,IAAI,iBAAiB;AAErB,eAAe,SAAS,QAAgB;AACtC,MAAI,eAAgB;AACpB,mBAAiB;AACjB,SAAO,KAAK,YAAY,MAAM,iCAAiC;AAE/D,QAAM,aAAa,WAAW,MAAM;AAClC,WAAO,KAAK,mCAAmC;AAC/C,YAAQ,KAAK,WAAW,uBAAuB,WAAW,uBAAuB,IAAI,CAAC;AAAA,EACxF,GAAG,GAAI;AACP,aAAW,MAAM;AAEjB,MAAI;AACF,UAAM,OAAO,MAAM;AACnB,WAAO,KAAK,+BAA+B;AAAA,EAC7C,SAAS,KAAU;AACjB,WAAO,MAAM,6BAA6B,IAAI,OAAO;AAAA,EACvD;AAEA,MAAI;AACF,gBAAY;AACZ,WAAO,KAAK,8BAA8B;AAAA,EAC5C,SAAS,KAAU;AACjB,WAAO,MAAM,4BAA4B,IAAI,OAAO;AAAA,EACtD;AAEA,MAAI,WAAW,uBAAuB,WAAW,sBAAsB;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB,OAAO;AACL,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,OAAO;AACpB,QAAM,UAAU,WAAW;AAC3B,SAAO,KAAK,iCAAiC,OAAO,KAAK;AAGzD,MAAI;AACF,UAAM,OAAO,mBAAmB;AAChC,UAAM,cAAmB,cAAS,IAAI;AACtC,UAAM,cAAc,eAAe,WAAW;AAC9C,UAAM,YAAY,MAAM,WAAW;AAAA,EACrC,SAAS,KAAU;AACjB,WAAO,KAAK,gCAAgC,IAAI,OAAO,EAAE;AAAA,EAC3D;AAEA,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,SAAO,KAAK,2CAA2C;AACzD;AAEA,QAAQ,MAAM,GAAG,SAAS,MAAM;AAC9B,WAAS,aAAa,EAAE,MAAM,CAAC,QAAQ;AACrC,WAAO,MAAM,sCAAsC,GAAG;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAED,QAAQ,GAAG,UAAU,MAAM;AACzB,WAAS,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAChC,WAAO,MAAM,iCAAiC,GAAG;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAED,QAAQ,GAAG,WAAW,MAAM;AAC1B,WAAS,SAAS,EAAE,MAAM,CAAC,QAAQ;AACjC,WAAO,MAAM,kCAAkC,GAAG;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAED,QAAQ,GAAG,qBAAqB,CAAC,UAAU;AACzC,SAAO,MAAM,uBAAuB,KAAK;AACzC,WAAS,mBAAmB,EAAE,MAAM,CAAC,QAAQ;AAC3C,WAAO,MAAM,0BAA0B,GAAG;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAED,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,YAAY;AACpD,SAAO,MAAM,2BAA2B,SAAS,WAAW,MAAM;AAClE,WAAS,oBAAoB,EAAE,MAAM,CAAC,QAAQ;AAC5C,WAAO,MAAM,0BAA0B,GAAG;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,CAAC;AAED,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,SAAO,MAAM,gCAAgC,KAAK;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runAutoInit,
|
|
3
|
+
runInit,
|
|
4
|
+
runInitGlobal,
|
|
5
|
+
upsertInstructionBlock
|
|
6
|
+
} from "./chunk-NCJFRFRK.js";
|
|
7
|
+
import "./chunk-QU5PNQP4.js";
|
|
8
|
+
import "./chunk-L2LJRSDU.js";
|
|
9
|
+
export {
|
|
10
|
+
runAutoInit,
|
|
11
|
+
runInit,
|
|
12
|
+
runInitGlobal,
|
|
13
|
+
upsertInstructionBlock
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=init-QMBHF4FZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|