@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/metrics.ts","../src/engine/snapshots.ts","../src/engine/watchdog.ts","../src/engine/rate-limiter.ts","../src/engine/policy-gate.ts","../src/engine/safety.ts","../src/engine/stuck-detector.ts","../src/server.ts","../src/tools/handlers.ts","../src/tools/definitions.ts","../src/engine/recordings.ts","../src/engine/blackboard.ts","../src/engine/advisor.ts","../src/tools/prompts.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport { ExecutionMetrics } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse, safeJsonStringify } from '../utils/json-validator.js';\n\nexport class MetricsEngine {\n static recordMetrics(\n db: Database.Database,\n params: {\n project: string;\n execution_id: string;\n session_id?: string;\n intention_id?: string;\n behavior_name: string;\n status: any;\n tick_count: number;\n duration_ms: number;\n avg_tick_ms?: number;\n max_tick_ms?: number;\n stuck_count?: number;\n interrupt_count?: number;\n category_metrics?: Record<string, unknown>;\n }\n ): ExecutionMetrics {\n const id = generateId();\n const now = getCurrentIsoString();\n\n db.prepare(\n `\n INSERT INTO execution_metrics (\n id, project, execution_id, session_id, intention_id, behavior_name,\n status, tick_count, duration_ms, avg_tick_ms, max_tick_ms, stuck_count,\n interrupt_count, category_metrics_json, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n ).run(\n id,\n params.project,\n params.execution_id,\n params.session_id ?? null,\n params.intention_id ?? null,\n params.behavior_name,\n params.status,\n params.tick_count,\n params.duration_ms,\n params.avg_tick_ms ?? 16.6,\n params.max_tick_ms ?? 25.0,\n params.stuck_count ?? 0,\n params.interrupt_count ?? 0,\n safeJsonStringify(params.category_metrics || {}),\n now\n );\n\n return {\n id,\n project: params.project,\n execution_id: params.execution_id as any,\n session_id: params.session_id,\n intention_id: params.intention_id,\n behavior_name: params.behavior_name,\n status: params.status,\n tick_count: params.tick_count,\n duration_ms: params.duration_ms,\n avg_tick_ms: params.avg_tick_ms ?? 16.6,\n max_tick_ms: params.max_tick_ms ?? 25.0,\n stuck_count: params.stuck_count ?? 0,\n interrupt_count: params.interrupt_count ?? 0,\n category_metrics: params.category_metrics,\n created_at: now,\n };\n }\n\n static getMetrics(\n db: Database.Database,\n params: { project: string; execution_id?: string; behavior_name?: string; limit?: number }\n ): ExecutionMetrics[] {\n let sql = 'SELECT * FROM execution_metrics WHERE project = ?';\n const sqlParams: any[] = [params.project];\n\n if (params.execution_id) {\n sql += ' AND execution_id = ?';\n sqlParams.push(params.execution_id);\n }\n if (params.behavior_name) {\n sql += ' AND behavior_name = ?';\n sqlParams.push(params.behavior_name);\n }\n\n sql += ' ORDER BY created_at DESC LIMIT ?';\n sqlParams.push(params.limit || 50);\n\n const rows = db.prepare(sql).all(...sqlParams) as any[];\n return rows.map((r) => ({\n id: r.id,\n project: r.project,\n execution_id: r.execution_id,\n session_id: r.session_id,\n intention_id: r.intention_id,\n behavior_name: r.behavior_name,\n status: r.status,\n tick_count: r.tick_count,\n duration_ms: r.duration_ms,\n avg_tick_ms: r.avg_tick_ms,\n max_tick_ms: r.max_tick_ms,\n stuck_count: r.stuck_count,\n interrupt_count: r.interrupt_count,\n category_metrics: safeJsonParse(r.category_metrics_json, undefined),\n created_at: r.created_at,\n }));\n }\n}\n","import Database from 'better-sqlite3';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { ValidationError } from '../utils/errors.js';\nimport { safeJsonParse } from '../utils/json-validator.js';\n\nexport class SnapshotEngine {\n static saveSnapshot(\n db: Database.Database,\n params: { project: string; name: string; description?: string }\n ): { snapshot_id: string; name: string; timestamp: string } {\n if (!params.name || typeof params.name !== 'string') {\n throw new ValidationError('Snapshot name is required.');\n }\n\n const behaviors = db\n .prepare('SELECT * FROM behavior_definitions WHERE project = ?')\n .all(params.project);\n const triggers = db.prepare('SELECT * FROM triggers WHERE project = ?').all(params.project);\n const executions = db\n .prepare('SELECT * FROM execution_state WHERE project = ?')\n .all(params.project);\n\n const data = { behaviors, triggers, executions };\n const id = generateId();\n const now = getCurrentIsoString();\n\n db.prepare(\n `\n INSERT INTO snapshots (id, project, name, description, data_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(project, name) DO UPDATE SET\n description = excluded.description,\n data_json = excluded.data_json,\n created_at = excluded.created_at\n `\n ).run(id, params.project, params.name, params.description ?? null, JSON.stringify(data), now);\n\n return { snapshot_id: id, name: params.name, timestamp: now };\n }\n\n static restoreSnapshot(\n db: Database.Database,\n params: { project: string; name: string }\n ): { restored_behaviors: number; restored_triggers: number } {\n const row = db\n .prepare('SELECT * FROM snapshots WHERE project = ? AND name = ?')\n .get(params.project, params.name) as any;\n\n if (!row) {\n throw new ValidationError(\n `Snapshot \"${params.name}\" not found for project \"${params.project}\".`\n );\n }\n\n const data = safeJsonParse(row.data_json, { behaviors: [], triggers: [] });\n\n db.transaction(() => {\n db.prepare('DELETE FROM triggers WHERE project = ?').run(params.project);\n db.prepare('DELETE FROM behavior_definitions WHERE project = ?').run(params.project);\n\n if (Array.isArray(data.behaviors)) {\n const stmt = db.prepare(`\n INSERT INTO behavior_definitions (id, project, name, version, description, tree_json, tree_hash, is_active, metadata_json, client_request_id, created_at)\n VALUES (@id, @project, @name, @version, @description, @tree_json, @tree_hash, @is_active, @metadata_json, @client_request_id, @created_at)\n `);\n for (const b of data.behaviors) stmt.run(b);\n }\n\n if (Array.isArray(data.triggers)) {\n const stmt = db.prepare(`\n INSERT INTO triggers (id, project, name, behavior_name, condition_type, condition_params_json, priority, cooldown_ms, last_fired_at, is_enabled, metadata_json, created_at, updated_at)\n VALUES (@id, @project, @name, @behavior_name, @condition_type, @condition_params_json, @priority, @cooldown_ms, @last_fired_at, @is_enabled, @metadata_json, @created_at, @updated_at)\n `);\n for (const t of data.triggers) stmt.run(t);\n }\n })();\n\n return {\n restored_behaviors: data.behaviors?.length || 0,\n restored_triggers: data.triggers?.length || 0,\n };\n }\n\n static listSnapshots(\n db: Database.Database,\n params: { project: string; limit?: number }\n ): Array<{ id: string; name: string; description?: string; created_at: string }> {\n return db\n .prepare(\n 'SELECT id, name, description, created_at FROM snapshots WHERE project = ? ORDER BY created_at DESC LIMIT ?'\n )\n .all(params.project, params.limit || 50) as any[];\n }\n}\n","export class WatchdogTimer {\n private lastTickTime: number = Date.now();\n private maxAllowedDeltaMs: number;\n\n constructor(maxAllowedDeltaMs = 5000) {\n this.maxAllowedDeltaMs = maxAllowedDeltaMs;\n }\n\n public feed(): void {\n this.lastTickTime = Date.now();\n }\n\n public isExpired(): boolean {\n return Date.now() - this.lastTickTime > this.maxAllowedDeltaMs;\n }\n}\n","export class ActionRateLimiter {\n private actionTimestamps: number[] = [];\n private maxPerSecond: number;\n\n constructor(maxPerSecond = 60) {\n this.maxPerSecond = maxPerSecond;\n }\n\n public allowAction(): boolean {\n const now = Date.now();\n this.actionTimestamps = this.actionTimestamps.filter((t) => now - t < 1000);\n if (this.actionTimestamps.length >= this.maxPerSecond) {\n return false;\n }\n this.actionTimestamps.push(now);\n return true;\n }\n}\n","export class PolicyGate {\n private deniedActions = new Set(['delete_item', 'spend_currency', 'irreversible_trade']);\n\n public isAllowed(actionName: string): boolean {\n return !this.deniedActions.has(actionName);\n }\n}\n","export class EmergencySafety {\n private static killSwitchEngaged = false;\n\n public static engageKillSwitch(): void {\n this.killSwitchEngaged = true;\n }\n\n public static isSafe(): boolean {\n return !this.killSwitchEngaged;\n }\n\n public static resetSafety(): void {\n this.killSwitchEngaged = false;\n }\n}\n","export class StuckDetector {\n private lastNodes: string[] = [];\n private maxHistory: number = 50;\n\n public checkStuck(currentNodePath: string): { isStuck: boolean; score: number } {\n this.lastNodes.push(currentNodePath);\n if (this.lastNodes.length > this.maxHistory) {\n this.lastNodes.shift();\n }\n\n if (this.lastNodes.length >= 30) {\n const allSame = this.lastNodes.every((p) => p === currentNodePath);\n if (allSame) {\n return { isStuck: true, score: 1.0 };\n }\n }\n\n return { isStuck: false, score: 0.0 };\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { getVersion } from './utils/version.js';\nimport { registerAllTools } from './tools/handlers.js';\nimport { registerAllPrompts } from './tools/prompts.js';\nimport { getReadOnlyDb, 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 { RecordingEngine } from './engine/recordings.js';\n\nexport const server = new McpServer({\n name: 'io.github.putervision/behavior-mcp',\n version: getVersion(),\n});\n\nfunction getVarString(val: string | string[] | undefined): string | undefined {\n if (Array.isArray(val)) return val[0];\n return val;\n}\n\n// 1. runtime-status\nserver.registerResource(\n 'runtime-status',\n new ResourceTemplate('runtime:///{project}/status', { list: undefined }),\n {\n title: 'Runtime Status Template',\n description: 'Current execution status, active behavior, and tick counter',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const execs = ExecutionEngine.listExecutions(db, { project, limit: 1 });\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(execs[0] || { status: 'idle' }, null, 2) }],\n };\n }\n);\n\n// 2. runtime-active-tree\nserver.registerResource(\n 'runtime-active-tree',\n new ResourceTemplate('runtime:///{project}/active_tree', { list: undefined }),\n {\n title: 'Runtime Active Behavior Tree Template',\n description: 'Active behavior tree node hierarchy and current active path',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const exec = ExecutionEngine.listExecutions(db, { project, status: 'running', limit: 1 })[0];\n const behavior = exec ? BehaviorRegistry.getBehavior(db, { project, name: exec.behavior_name, version: exec.behavior_version }) : null;\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ exec, behavior }, null, 2) }],\n };\n }\n);\n\n// 3. runtime-metrics\nserver.registerResource(\n 'runtime-metrics',\n new ResourceTemplate('runtime:///{project}/metrics', { list: undefined }),\n {\n title: 'Runtime Metrics Template',\n description: 'Telemetry and tick performance aggregations',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const metrics = MetricsEngine.getMetrics(db, { project, limit: 50 });\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(metrics, null, 2) }],\n };\n }\n);\n\n// 4. runtime-triggers\nserver.registerResource(\n 'runtime-triggers',\n new ResourceTemplate('runtime:///{project}/triggers', { list: undefined }),\n {\n title: 'Runtime Triggers Template',\n description: 'Registered reactive triggers and fire history',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const triggers = TriggerRegistry.listTriggers(db, project);\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(triggers, null, 2) }],\n };\n }\n);\n\n// 5. runtime-recordings\nserver.registerResource(\n 'runtime-recordings',\n new ResourceTemplate('runtime:///{project}/recordings', { list: undefined }),\n {\n title: 'Runtime Recordings Template',\n description: 'Saved action recordings for replay',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const recordings = RecordingEngine.listRecordings(db, project);\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(recordings, null, 2) }],\n };\n }\n);\n\n// 6. runtime-behaviors\nserver.registerResource(\n 'runtime-behaviors',\n new ResourceTemplate('runtime:///{project}/behaviors', { list: undefined }),\n {\n title: 'Runtime Behavior Registry Template',\n description: 'Registered behavior tree definitions and tree hashes',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const behaviors = BehaviorRegistry.listBehaviors(db, project);\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(behaviors, null, 2) }],\n };\n }\n);\n\n// 7. runtime-blackboard\nserver.registerResource(\n 'runtime-blackboard',\n new ResourceTemplate('runtime:///{project}/blackboard', { list: undefined }),\n {\n title: 'Runtime Blackboard State Template',\n description: 'Current behavior tree blackboard variable state',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const exec = ExecutionEngine.listExecutions(db, { project, limit: 1 })[0];\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(exec?.blackboard_json || '{}', null, 2) }],\n };\n }\n);\n\n// 8. runtime-watchdog\nserver.registerResource(\n 'runtime-watchdog',\n new ResourceTemplate('runtime:///{project}/watchdog', { list: undefined }),\n {\n title: 'Runtime Watchdog Health Template',\n description: 'Watchdog status, stuck detection counters, and rate limit metrics',\n mimeType: 'application/json',\n },\n async (uri: URL, variables) => {\n const project = getProjectSlug(getVarString(variables.project));\n const db = getReadOnlyDb(project);\n const exec = ExecutionEngine.listExecutions(db, { project, limit: 1 })[0];\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ project, stuck_score: exec?.stuck_score || 0.0, current_status: exec?.status || 'idle' }, null, 2),\n },\n ],\n };\n }\n);\n\nserver.registerResource(\n 'runtime-health',\n 'runtime:///health',\n {\n title: 'Behavior Runtime Health',\n description: 'Server health status, version, and timestamp',\n mimeType: 'application/json',\n },\n async (uri: URL) => {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n status: 'healthy',\n version: getVersion(),\n timestamp: new Date().toISOString(),\n }, null, 2),\n },\n ],\n };\n }\n);\n\n// Register Tools & Prompts\nregisterAllTools(server);\nregisterAllPrompts(server);\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { toolDefinitions, READ_ONLY_TOOLS } from './definitions.js';\nimport { getDb, getReadOnlyDb, 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 { RecordingEngine } from '../engine/recordings.js';\nimport { BlackboardEngine } from '../engine/blackboard.js';\nimport { SnapshotEngine } from '../engine/snapshots.js';\nimport { verifyEventChain } from '../engine/events.js';\nimport { SchemaAdvisor } from '../engine/advisor.js';\nimport { ValidationError } from '../utils/errors.js';\nimport { WatchdogTimer } from '../engine/watchdog.js';\nimport { ActionRateLimiter } from '../engine/rate-limiter.js';\nimport { PolicyGate } from '../engine/policy-gate.js';\nimport { EmergencySafety } from '../engine/safety.js';\nimport { StuckDetector } from '../engine/stuck-detector.js';\n\nconst rateLimiter = new ActionRateLimiter(60);\nconst policyGate = new PolicyGate();\nconst stuckDetector = new StuckDetector();\nconst watchdog = new WatchdogTimer(5000);\n\ninterface JsonSchemaProperty {\n type?: string;\n enum?: string[];\n items?: JsonSchemaProperty;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n description?: string;\n [key: string]: unknown;\n}\n\nexport function jsonSchemaToZod(schema: JsonSchemaProperty | unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object') return z.unknown();\n const s = schema as JsonSchemaProperty;\n\n if (s.type === 'string') {\n if (s.enum && Array.isArray(s.enum) && s.enum.length > 0) {\n return z.enum(s.enum as [string, ...string[]]);\n }\n return z.string();\n }\n if (s.type === 'number') return z.number();\n if (s.type === 'boolean') return z.boolean();\n if (s.type === 'array') {\n const itemSchema = s.items ? jsonSchemaToZod(s.items) : z.unknown();\n return z.array(itemSchema);\n }\n if (s.type === 'object' || s.properties) {\n const shape: Record<string, z.ZodTypeAny> = {};\n const requiredKeys = new Set(s.required || []);\n if (s.properties) {\n for (const [key, prop] of Object.entries(s.properties)) {\n let fieldSchema = jsonSchemaToZod(prop);\n if (!requiredKeys.has(key)) {\n fieldSchema = fieldSchema.optional();\n }\n shape[key] = fieldSchema;\n }\n }\n return z.object(shape).passthrough();\n }\n return z.unknown();\n}\n\nexport function registerAllTools(server: McpServer): void {\n const toolNames = toolDefinitions.map((t) => t.name);\n\n for (const def of toolDefinitions) {\n const zodShape: Record<string, z.ZodTypeAny> = {};\n const schemaProps = (def.inputSchema.properties || {}) as Record<string, JsonSchemaProperty>;\n const requiredList = new Set((def.inputSchema.required as string[]) || []);\n\n for (const [key, prop] of Object.entries(schemaProps)) {\n let fieldSchema = jsonSchemaToZod(prop);\n if (!requiredList.has(key)) {\n fieldSchema = fieldSchema.optional();\n }\n zodShape[key] = fieldSchema;\n }\n\n server.tool(def.name, def.description, zodShape, async (args: any) => {\n try {\n const project = getProjectSlug(args.project);\n const isReadOnly = READ_ONLY_TOOLS.has(def.name);\n const db = isReadOnly ? getReadOnlyDb(project) : getDb(project);\n\n if (!EmergencySafety.isSafe()) {\n throw new ValidationError('Emergency safety kill switch is engaged. Execution blocked.');\n }\n\n let result: any;\n\n switch (def.name) {\n case 'load_behavior': {\n if (!rateLimiter.allowAction()) {\n throw new ValidationError('Action rate limit exceeded (>60 actions/sec).');\n }\n if (!policyGate.isAllowed(args.behavior_name)) {\n throw new ValidationError(\n `PolicyGate blocked loading disallowed behavior \"${args.behavior_name}\".`\n );\n }\n watchdog.feed();\n\n result = ExecutionEngine.startExecution(db, { project, ...args });\n result._suggestions = [\n {\n tool: 'get_status',\n args: { execution_id: result.id, action: 'current' },\n reason: 'Inspect live behavior execution traversal path',\n },\n {\n tool: 'get_metrics',\n args: { execution_id: result.id, action: 'current' },\n reason: 'Query runtime tick durations and telemetry',\n },\n ];\n break;\n }\n\n case 'set_parameters': {\n if (args.action === 'set' && args.execution_id) {\n result = BlackboardEngine.setBlackboardKey(db, {\n project,\n execution_id: args.execution_id,\n key: 'parameters',\n value: args.parameters,\n });\n } else if (args.action === 'get' && args.execution_id) {\n result = BlackboardEngine.getBlackboard(db, {\n project,\n execution_id: args.execution_id,\n });\n } else if (args.action === 'reset' && args.execution_id) {\n result = BlackboardEngine.setBlackboardKey(db, {\n project,\n execution_id: args.execution_id,\n key: 'parameters',\n value: {},\n });\n } else {\n throw new ValidationError(`Unsupported set_parameters action: \"${args.action}\".`);\n }\n break;\n }\n\n case 'get_status': {\n watchdog.feed();\n if (args.execution_id) {\n result = ExecutionEngine.getExecution(db, { project, id: args.execution_id });\n } else {\n const list = ExecutionEngine.listExecutions(db, { project, limit: 1 });\n result = list[0] || { status: 'idle', message: 'No active execution found.' };\n }\n if (result.active_node_path) {\n const stuckCheck = stuckDetector.checkStuck(result.active_node_path);\n if (stuckCheck.isStuck) {\n result.stuck_detected = true;\n result._suggestions = [\n {\n tool: 'abort_behavior',\n args: {\n execution_id: result.id,\n action: 'abort',\n reason: 'Stuck in node path',\n },\n reason: 'Abort stuck execution',\n },\n ];\n }\n }\n break;\n }\n\n case 'abort_behavior': {\n const execs = ExecutionEngine.listExecutions(db, {\n project,\n status: 'running',\n limit: 1,\n });\n const execId = args.execution_id || execs[0]?.id;\n if (!execId) throw new ValidationError('No active running execution to abort.');\n result = ExecutionEngine.stopExecution(db, {\n project,\n execution_id: execId,\n status: args.action === 'pause' ? 'paused' : 'aborted',\n error_message: args.reason,\n });\n result._suggestions = [\n {\n tool: 'get_metrics',\n args: { execution_id: execId, action: 'history' },\n reason: 'Inspect post-abort telemetry',\n },\n ];\n break;\n }\n\n case 'register_trigger': {\n const action = args.action;\n if (action === 'register') {\n result = TriggerRegistry.registerTrigger(db, { project, ...args });\n } else if (action === 'list') {\n result = TriggerRegistry.listTriggers(db, project);\n } else {\n throw new ValidationError(\n `Unsupported register_trigger action: \"${action}\". Supported actions: register, list.`\n );\n }\n break;\n }\n\n case 'replay_recording': {\n if (args.action === 'capture' && args.execution_id) {\n result = RecordingEngine.saveRecording(db, {\n project,\n execution_id: args.execution_id,\n behavior_name: args.name || 'behavior',\n frames: args.frames || [],\n });\n } else if (args.action === 'list') {\n result = RecordingEngine.listRecordings(db, project);\n } else {\n throw new ValidationError(\n `Unsupported replay_recording action: \"${args.action}\". Supported actions: capture, list.`\n );\n }\n break;\n }\n\n case 'get_metrics': {\n result = MetricsEngine.getMetrics(db, { project, ...args });\n break;\n }\n\n case 'manage_behaviors': {\n const action = args.action;\n if (action === 'register') {\n result = BehaviorRegistry.registerBehavior(db, {\n project,\n name: args.name,\n version: args.version,\n description: args.description,\n tree: args.tree || JSON.parse(args.tree_json || '{}'),\n });\n } else if (action === 'get') {\n result = BehaviorRegistry.getBehavior(db, {\n project,\n name: args.name,\n version: args.version,\n });\n } else if (action === 'list') {\n result = BehaviorRegistry.listBehaviors(db, project);\n } else {\n throw new ValidationError(\n `Unsupported manage_behaviors action: \"${action}\". Supported actions: register, get, list.`\n );\n }\n break;\n }\n\n case 'manage_blackboard': {\n const action = args.action;\n if (action === 'get' && args.execution_id) {\n result = BlackboardEngine.getBlackboard(db, {\n project,\n execution_id: args.execution_id,\n });\n } else if (action === 'set' && args.execution_id && args.key) {\n result = BlackboardEngine.setBlackboardKey(db, {\n project,\n execution_id: args.execution_id,\n key: args.key,\n value: args.value,\n });\n } else {\n throw new ValidationError(\n `Unsupported manage_blackboard action or missing execution_id: \"${action}\". Supported actions: get, set.`\n );\n }\n break;\n }\n\n case 'manage_runtime_db': {\n const action = args.action;\n if (action === 'stats') {\n const behaviorsCount = (\n db\n .prepare('SELECT COUNT(*) as c FROM behavior_definitions WHERE project = ?')\n .get(project) as any\n ).c;\n const executionsCount = (\n db\n .prepare('SELECT COUNT(*) as c FROM execution_state WHERE project = ?')\n .get(project) as any\n ).c;\n const triggersCount = (\n db\n .prepare('SELECT COUNT(*) as c FROM triggers WHERE project = ?')\n .get(project) as any\n ).c;\n result = { behaviorsCount, executionsCount, triggersCount, project };\n } else if (action === 'audit') {\n result = verifyEventChain(db, project);\n } else if (action === 'snapshot') {\n result = SnapshotEngine.saveSnapshot(db, {\n project,\n name: args.name || `snap_${Date.now()}`,\n description: args.description,\n });\n } else if (action === 'restore') {\n result = SnapshotEngine.restoreSnapshot(db, { project, name: args.name });\n } else if (action === 'diff') {\n result = SnapshotEngine.listSnapshots(db, { project });\n } else {\n throw new ValidationError(\n `Unsupported manage_runtime_db action: \"${action}\". Supported actions: stats, audit, snapshot, restore, diff.`\n );\n }\n break;\n }\n\n default:\n throw new ValidationError(`Unrecognized tool \"${def.name}\".`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error: any) {\n const advice = SchemaAdvisor.getAdvice(def.name, error.message, toolNames);\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n error: error.message,\n code: error.code || 'EXECUTION_ERROR',\n advice,\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n });\n }\n}\n","export interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport const READ_ONLY_TOOLS = new Set(['get_status', 'get_metrics']);\n\nexport const toolDefinitions: ToolDefinition[] = [\n {\n name: 'load_behavior',\n description: 'Inject, initialize, or hot-swap a behavior tree instance in the browser runtime.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['load', 'unload', 'swap'],\n description: 'Behavior loading operation',\n },\n behavior_name: { type: 'string', description: 'Name of the behavior tree to load' },\n behavior_version: {\n type: 'number',\n description: 'Version of behavior tree (defaults to latest)',\n },\n parameters: { type: 'object', description: 'Initial execution parameters' },\n session_id: { type: 'string', description: 'Linked state-memory session ID' },\n intention_id: { type: 'string', description: 'Linked agent-reasoning intention ID' },\n trace_id: {\n type: 'string',\n description: 'Distributed trace ID for cross-server correlation',\n },\n client_request_id: { type: 'string', description: 'Idempotency key' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action', 'behavior_name'],\n },\n },\n {\n name: 'set_parameters',\n description:\n 'Dynamically update or query execution parameters for the active behavior runtime.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['set', 'get', 'reset'],\n description: 'Parameter operation',\n },\n execution_id: { type: 'string', description: 'Target execution instance ID' },\n parameters: { type: 'object', description: 'Key-value parameters map to apply' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'get_status',\n description:\n 'Query active behavior execution status, current node path, tick count, duration, and error state.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['current', 'history', 'tree_state'],\n description: 'Status query mode',\n },\n execution_id: { type: 'string', description: 'Target execution ID (or latest if omitted)' },\n limit: { type: 'number', description: 'Max history entries' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'abort_behavior',\n description:\n 'Immediately halt, pause, or resume behavior execution and disengage active inputs.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['abort', 'pause', 'resume'],\n description: 'Execution control operation',\n },\n execution_id: { type: 'string', description: 'Target execution ID' },\n reason: { type: 'string', description: 'Reason for abort or pause' },\n trace_id: { type: 'string', description: 'Distributed trace ID' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'register_trigger',\n description:\n 'Configure and manage reactive interrupt triggers with priority preemption and cooldown guards.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['register', 'list'],\n description: 'Trigger operation',\n },\n name: { type: 'string', description: 'Trigger name' },\n behavior_name: {\n type: 'string',\n description: 'Behavior tree to activate when condition fires',\n },\n condition_type: {\n type: 'string',\n description: 'Condition type (e.g. hp_threshold, enemy_proximity)',\n },\n condition_params: { type: 'object', description: 'Condition evaluation parameters' },\n priority: { type: 'number', description: 'Preemption priority' },\n cooldown_ms: { type: 'number', description: 'Minimum cooldown interval between fires' },\n trigger_id: { type: 'string', description: 'Trigger ID' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'replay_recording',\n description: 'Capture or replay deterministic browser action sequences with adaptive timing.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['capture', 'list'],\n description: 'Recording operation',\n },\n name: { type: 'string', description: 'Recording name' },\n recording_id: { type: 'string', description: 'Recording ID' },\n execution_id: { type: 'string', description: 'Target execution ID' },\n frames: {\n type: 'array',\n items: { type: 'object' },\n description: 'Captured frame sequence',\n },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'get_metrics',\n description:\n 'Retrieve runtime execution telemetry, tick durations, stuck events, and category statistics.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['current', 'history', 'aggregate', 'compare'],\n description: 'Metrics query mode',\n },\n execution_id: { type: 'string', description: 'Filter metrics by execution ID' },\n behavior_name: { type: 'string', description: 'Filter metrics by behavior tree name' },\n limit: { type: 'number', description: 'Max records' },\n trace_id: { type: 'string', description: 'Distributed trace ID' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'manage_behaviors',\n description:\n 'CRUD operations for immutable JSON behavior tree definitions with SHA-256 tree hash verification.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['register', 'list', 'get'],\n description: 'Behavior definition management operation',\n },\n name: { type: 'string', description: 'Behavior tree name' },\n version: { type: 'number', description: 'Tree version' },\n description: { type: 'string', description: 'Tree description' },\n tree: { type: 'object', description: 'Behavior tree JSON object' },\n tree_json: { type: 'string', description: 'Raw behavior tree JSON string' },\n client_request_id: { type: 'string', description: 'Idempotency key' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'manage_blackboard',\n description: 'Read, write, or query shared behavior tree blackboard state variables.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['get', 'set'],\n description: 'Blackboard operation',\n },\n execution_id: { type: 'string', description: 'Target execution ID' },\n key: { type: 'string', description: 'Blackboard variable key' },\n value: { description: 'Blackboard variable value' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n {\n name: 'manage_runtime_db',\n description:\n 'Database maintenance, diagnostics, SHA-256 Merkle audit verification, checkpoints save/restore, and diffs.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['stats', 'audit', 'snapshot', 'diff', 'restore'],\n description: 'Database maintenance operation',\n },\n name: { type: 'string', description: 'Snapshot name' },\n description: { type: 'string', description: 'Snapshot description' },\n project: { type: 'string', description: 'Target project slug' },\n },\n required: ['action'],\n },\n },\n];\n","import Database from 'better-sqlite3';\nimport { ExecutionRecording, RecordingId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonStringify } from '../utils/json-validator.js';\n\nexport class RecordingEngine {\n static saveRecording(\n db: Database.Database,\n params: {\n project: string;\n execution_id: string;\n behavior_name: string;\n frames: any[];\n duration_ms?: number;\n }\n ): ExecutionRecording {\n const id = generateId() as RecordingId;\n const now = getCurrentIsoString();\n const durationMs = params.duration_ms || Math.round(params.frames.length * 16.6);\n\n db.prepare(\n `\n INSERT INTO recordings (id, project, execution_id, behavior_name, total_frames, frames_json, duration_ms, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `\n ).run(\n id,\n params.project,\n params.execution_id,\n params.behavior_name,\n params.frames.length,\n safeJsonStringify(params.frames),\n durationMs,\n now\n );\n\n return {\n id,\n project: params.project,\n execution_id: params.execution_id as any,\n behavior_name: params.behavior_name,\n total_frames: params.frames.length,\n frames_json: safeJsonStringify(params.frames),\n duration_ms: durationMs,\n created_at: now,\n };\n }\n\n static listRecordings(db: Database.Database, project: string): ExecutionRecording[] {\n const rows = db\n .prepare('SELECT * FROM recordings WHERE project = ? ORDER BY created_at DESC LIMIT 50')\n .all(project) as any[];\n return rows.map((r) => ({\n id: r.id as RecordingId,\n project: r.project,\n execution_id: r.execution_id,\n behavior_name: r.behavior_name,\n total_frames: r.total_frames,\n frames_json: r.frames_json,\n duration_ms: r.duration_ms,\n created_at: r.created_at,\n }));\n }\n}\n","import Database from 'better-sqlite3';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse, safeJsonStringify } from '../utils/json-validator.js';\nimport { NotFoundError } from '../utils/errors.js';\n\nexport class BlackboardEngine {\n static getBlackboard(\n db: Database.Database,\n params: { project: string; execution_id: string }\n ): Record<string, unknown> {\n const row = db\n .prepare('SELECT blackboard_json FROM execution_state WHERE project = ? AND id = ?')\n .get(params.project, params.execution_id) as any;\n if (!row) throw new NotFoundError(`Execution state \"${params.execution_id}\" not found.`);\n return safeJsonParse(row.blackboard_json, {});\n }\n\n static setBlackboardKey(\n db: Database.Database,\n params: { project: string; execution_id: string; key: string; value: unknown }\n ): Record<string, unknown> {\n const bb = this.getBlackboard(db, params);\n bb[params.key] = params.value;\n db.prepare('UPDATE execution_state SET blackboard_json = ?, updated_at = ? WHERE id = ?').run(\n safeJsonStringify(bb),\n getCurrentIsoString(),\n params.execution_id\n );\n return bb;\n }\n}\n","export const TOOL_ALIASES: Record<string, string> = {\n load: 'load_behavior',\n load_tree: 'load_behavior',\n run_tree: 'load_behavior',\n step: 'step_behavior',\n tick: 'step_behavior',\n pause: 'pause_behavior',\n resume: 'pause_behavior',\n abort: 'abort_behavior',\n stop: 'abort_behavior',\n cancel: 'abort_behavior',\n trigger: 'register_trigger',\n add_trigger: 'register_trigger',\n record: 'manage_recordings',\n replay: 'manage_recordings',\n metrics: 'query_execution_metrics',\n telemetry: 'query_execution_metrics',\n status: 'get_runtime_status',\n blackboard: 'manage_blackboard',\n safety: 'emergency_kill_switch',\n kill: 'emergency_kill_switch',\n};\n\nfunction levenshtein(a: string, b: string): number {\n const matrix: number[][] = [];\n for (let i = 0; i <= b.length; i++) matrix[i] = [i];\n for (let j = 0; j <= a.length; j++) matrix[0][j] = j;\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n return matrix[b.length][a.length];\n}\n\nexport class SchemaAdvisor {\n static resolveAlias(toolName: string): string | undefined {\n return TOOL_ALIASES[toolName.toLowerCase()];\n }\n\n static getAdvice(toolName: string, error: string, availableTools: string[]): string {\n const alias = this.resolveAlias(toolName);\n if (alias) {\n return `Tool \"${toolName}\" is an alias. Did you mean to call \"${alias}\"?`;\n }\n\n let closest = '';\n let minDistance = Infinity;\n for (const tool of availableTools) {\n const dist = levenshtein(toolName.toLowerCase(), tool.toLowerCase());\n if (dist < minDistance && dist <= 3) {\n minDistance = dist;\n closest = tool;\n }\n }\n\n if (closest) {\n return `Tool \"${toolName}\" not found. Did you mean \"${closest}\"? (${error})`;\n }\n\n return `Invalid tool call \"${toolName}\": ${error}`;\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerAllPrompts(server: McpServer): void {\n server.prompt(\n 'behavior-design',\n 'Design a robust, composable behavior tree with sequences, selectors, guards, and decorators',\n {\n goal: z.string().describe('Target goal or behavior objective'),\n environment: z.string().optional().describe('Operating environment constraints'),\n },\n async (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Design a behavior tree to accomplish \"${args.goal}\". Constraints: \"${args.environment || 'Standard browser automation'}\". Output valid JSON conforming to the PuterVision behavior tree schema with sequence, selector, and condition/action nodes. Register with \\`manage_behaviors(register)\\`.`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n 'debug-stuck',\n 'Investigate and resolve stuck behavior execution instances and infinite node loops',\n {\n execution_id: z.string().describe('Stuck execution instance ID'),\n },\n async (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Diagnose stuck execution \"${args.execution_id}\". Inspect active node path with \\`get_status(current)\\`, inspect blackboard state with \\`manage_blackboard(get)\\`, and analyze metrics via \\`get_metrics(current)\\`.`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n 'optimize-behavior',\n 'Optimize behavior tree node ordering and conditions for 60Hz tick efficiency',\n {\n behavior_name: z.string().describe('Behavior tree name to optimize'),\n },\n async (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Analyze telemetry metrics for behavior tree \"${args.behavior_name}\" via \\`get_metrics(history)\\`. Identify slow condition evaluations and reorder selector branches to maximize early exits.`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n 'trigger-design',\n 'Create reactive interrupt triggers with priority preemption and cooldown guards',\n {\n behavior_name: z.string().describe('Emergency behavior to trigger'),\n emergency_condition: z.string().describe('Trigger condition description'),\n },\n async (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Configure a reactive interrupt trigger for emergency behavior \"${args.behavior_name}\". Condition: \"${args.emergency_condition}\". Register with \\`register_trigger(register)\\` setting high priority (0.9+) and appropriate cooldown.`,\n },\n },\n ],\n };\n }\n );\n}\n"],"mappings":"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","names":["server","z","server"]}
@@ -0,0 +1,399 @@
1
+ import {
2
+ BehaviorRegistry,
3
+ verifyEventChain
4
+ } from "./chunk-QU5PNQP4.js";
5
+ import {
6
+ getDb,
7
+ getProjectSlug,
8
+ logger,
9
+ registerProject,
10
+ resolveProjectRoot
11
+ } from "./chunk-L2LJRSDU.js";
12
+
13
+ // src/cli/init.ts
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ import * as os from "os";
17
+
18
+ // src/cli/templates.ts
19
+ function getAgentsMdTemplate(projectSlug = "default") {
20
+ return `<!-- behavior-mcp:start -->
21
+ # Behavior Runtime Engine (behavior-mcp)
22
+
23
+ This project uses \`behavior-mcp\` with project slug "${projectSlug}" to execute deterministic behavior trees at ~60Hz in browser runtimes with reactive triggers and safety guardrails.
24
+
25
+ ## Mandatory Runtime Workflow
26
+ 1. **Load Behavior**: Call \`load_behavior(action: "load", behavior_name: "...")\` to activate execution.
27
+ 2. **Monitor Execution**: Check \`get_status(action: "current")\` and inspect active node traversal paths.
28
+ 3. **Reactive Triggers**: Register high-priority emergency interrupts via \`register_trigger(action: "register", ...)\`.
29
+ 4. **Safety & Abort**: Call \`abort_behavior(action: "abort")\` to immediately halt execution if anomalous behavior occurs.
30
+
31
+ ## 10 Core MCP Tools
32
+ - \`load_behavior\`: Inject and start behavior tree execution.
33
+ - \`set_parameters\`: Update execution parameters on the fly.
34
+ - \`get_status\`: Query active status, current node path, and tick counters.
35
+ - \`abort_behavior\`: Immediately halt, pause, or resume execution.
36
+ - \`register_trigger\`: Configure priority interrupts with cooldown guards.
37
+ - \`replay_recording\`: Capture and replay deterministic frame actions.
38
+ - \`get_metrics\`: Query execution telemetry and duration statistics.
39
+ - \`manage_behaviors\`: Register and version behavior tree definitions with SHA-256 tree hashes.
40
+ - \`manage_blackboard\`: Read and write behavior tree blackboard state variables.
41
+ - \`manage_runtime_db\`: Database maintenance, diagnostics, and SHA-256 Merkle audit verification.
42
+ <!-- behavior-mcp:end -->
43
+ `;
44
+ }
45
+ function getInstructionsTemplate(projectSlug) {
46
+ return getAgentsMdTemplate(projectSlug);
47
+ }
48
+ function getGlobalRulesTemplate(projectSlug) {
49
+ return `<!-- behavior-mcp:start -->
50
+ # Behavior Runtime Engine (behavior-mcp)
51
+
52
+ This project uses behavior-mcp with project slug "${projectSlug}" for high-frequency in-browser behavior execution.
53
+ ALWAYS check active node paths and register reactive triggers for emergency state changes.
54
+
55
+ ## Mandatory Workflow
56
+ 1. **Load**: Call \`load_behavior\` to inject and step tree loops.
57
+ 2. **Monitor**: Check execution health with \`get_status\`.
58
+ 3. **Triggers**: Register interrupts with \`register_trigger\`.
59
+ 4. **Abort**: Use \`abort_behavior\` on stuck states.
60
+ <!-- behavior-mcp:end -->
61
+ `;
62
+ }
63
+ function getMcpConfigCursor(projectSlug) {
64
+ return {
65
+ mcpServers: {
66
+ "behavior-mcp": {
67
+ command: "behavior-mcp",
68
+ args: ["run"],
69
+ env: {
70
+ BEHAVIOR_PROJECT: projectSlug
71
+ }
72
+ }
73
+ }
74
+ };
75
+ }
76
+ function getMcpConfigVscode(projectSlug) {
77
+ return {
78
+ servers: {
79
+ "behavior-mcp": {
80
+ type: "stdio",
81
+ command: "behavior-mcp",
82
+ args: ["run"],
83
+ env: {
84
+ BEHAVIOR_PROJECT: projectSlug
85
+ }
86
+ }
87
+ }
88
+ };
89
+ }
90
+ function getMcpConfigAntigravity() {
91
+ return {
92
+ mcpServers: {
93
+ "behavior-mcp": {
94
+ command: "behavior-mcp",
95
+ args: ["run"]
96
+ }
97
+ }
98
+ };
99
+ }
100
+ function getSkillTemplate(projectSlug) {
101
+ return `---
102
+ name: behavior-mcp
103
+ description: Teaches the agent to use the Behavior MCP server for ~60Hz in-browser behavior trees, triggers, and recordings.
104
+ ---
105
+
106
+ # Behavior Runtime Engine (behavior-mcp)
107
+
108
+ This skill provides step-by-step guidance and operational patterns for interacting with \`@putervision/behavior-mcp\` with project slug \`"${projectSlug}"\`.
109
+
110
+ ---
111
+
112
+ ## 1. Role in the PuterVision Pentad
113
+ - **Workflow State** (\`state-memory-mcp\`): Persistent task DAGs, decisions, milestones, and blockers.
114
+ - **Perception** (\`vision-memory-mcp\`): Visual layout caching, screenshots, and visual specifications.
115
+ - **Spatial World** (\`world-model-mcp\`): Persistent 3D/2D coordinates, bounding boxes, and topological relations.
116
+ - **Strategic Reasoning** (\`agent-reasoning-mcp\`): Strategic BDI goals, utility scoring, and intention dispatch.
117
+ - **Tactical Execution** (\`behavior-mcp\`): High-frequency (~60Hz) deterministic behavior tree execution directly in browser runtimes with reactive interrupts.
118
+
119
+ ---
120
+
121
+ ## 2. Core Operational Sequence
122
+ 1. **Define or Load Behavior**: Call \`load_behavior\` with \`action: "load"\` to inject and start tree execution.
123
+ 2. **Register Reactive Triggers**: Configure emergency preemption using \`register_trigger\` with priority and cooldown guards.
124
+ 3. **Monitor Telemetry**: Poll execution health, tick rates, and active traversal nodes with \`get_status\`.
125
+ 4. **Runtime Blackboard**: Read and mutate execution variables via \`manage_blackboard\`.
126
+ 5. **Safety Guardrails**: Immediately halt or pause rogue states using \`abort_behavior\`.
127
+
128
+ ---
129
+
130
+ ## 3. Complete 10 Consolidated MCP Tools Reference
131
+
132
+ | Tool Name | Key Actions | Key Parameters | Description |
133
+ |---|---|---|---|
134
+ | \`load_behavior\` | \`load\`, \`unload\`, \`swap\` | \`behavior_name\`, \`behavior_version\`, \`parameters\`, \`intention_id\` | Hot-swap, inject, or initialize behavior tree instances in browser runtime. |
135
+ | \`set_parameters\` | \`set\`, \`get\`, \`reset\` | \`execution_id\`, \`parameters\` | Dynamically update or query execution parameters for the active tree. |
136
+ | \`get_status\` | \`current\`, \`history\`, \`tree_state\` | \`execution_id\`, \`limit\` | Query active behavior status, current node path, tick count, duration, and errors. |
137
+ | \`abort_behavior\` | \`abort\`, \`pause\`, \`resume\` | \`execution_id\`, \`reason\` | Immediately halt, pause, or resume execution and disengage active inputs. |
138
+ | \`register_trigger\` | \`register\`, \`list\` | \`name\`, \`condition_type\`, \`priority\`, \`cooldown_ms\`, \`behavior_name\` | Configure reactive interrupt triggers with priority preemption and cooldowns. |
139
+ | \`replay_recording\` | \`capture\`, \`list\` | \`recording_id\`, \`execution_id\`, \`frames\`, \`name\` | Capture or replay deterministic browser action sequences with adaptive timing. |
140
+ | \`get_metrics\` | \`current\`, \`history\`, \`aggregate\`, \`compare\` | \`execution_id\`, \`behavior_name\`, \`limit\` | Retrieve execution telemetry, tick durations, stuck events, and statistics. |
141
+ | \`manage_behaviors\` | \`register\`, \`list\`, \`get\` | \`name\`, \`version\`, \`tree\`, \`tree_json\`, \`description\` | CRUD operations for immutable JSON behavior trees with SHA-256 tree hash verification. |
142
+ | \`manage_blackboard\` | \`get\`, \`set\` | \`execution_id\`, \`key\`, \`value\` | Read or write shared behavior tree blackboard state variables. |
143
+ | \`manage_runtime_db\` | \`stats\`, \`audit\`, \`snapshot\`, \`diff\`, \`restore\` | \`action\`, \`name\`, \`description\` | Database maintenance, diagnostics, and SHA-256 Merkle audit verification. |
144
+ `;
145
+ }
146
+
147
+ // src/cli/init.ts
148
+ function upsertInstructionBlock(content, newBlock, startMarker = "<!-- behavior-mcp:start -->", endMarker = "<!-- behavior-mcp:end -->") {
149
+ let startIndex = content.indexOf(startMarker);
150
+ let endIndex = content.indexOf(endMarker);
151
+ let matchedEndMarker = endMarker;
152
+ if (startIndex === -1) {
153
+ const legacyStart = "<!-- behavior-runtime-mcp:start -->";
154
+ const legacyEnd = "<!-- behavior-runtime-mcp:end -->";
155
+ startIndex = content.indexOf(legacyStart);
156
+ endIndex = content.indexOf(legacyEnd);
157
+ matchedEndMarker = legacyEnd;
158
+ }
159
+ if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
160
+ const before = content.substring(0, startIndex);
161
+ const after = content.substring(endIndex + matchedEndMarker.length);
162
+ const existingBlock = content.substring(startIndex, endIndex + matchedEndMarker.length);
163
+ if (existingBlock.trim() === newBlock.trim()) {
164
+ return { updatedContent: content, status: "unchanged" };
165
+ }
166
+ return { updatedContent: `${before}${newBlock.trim()}${after}`, status: "updated" };
167
+ }
168
+ const separator = content.endsWith("\n") ? "\n" : "\n\n";
169
+ return { updatedContent: `${content}${separator}${newBlock.trim()}
170
+ `, status: "appended" };
171
+ }
172
+ function mergeMcpConfig(root, relativePath, label, template, serversKey) {
173
+ const filePath = path.join(root, relativePath);
174
+ const dir = path.dirname(filePath);
175
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
176
+ if (fs.existsSync(filePath)) {
177
+ try {
178
+ const raw = fs.readFileSync(filePath, "utf-8");
179
+ const existing = JSON.parse(raw);
180
+ if (existing[serversKey]?.["behavior-mcp"]) {
181
+ return;
182
+ }
183
+ if (!existing[serversKey]) existing[serversKey] = {};
184
+ existing[serversKey]["behavior-mcp"] = template[serversKey]["behavior-mcp"];
185
+ fs.writeFileSync(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
186
+ } catch {
187
+ fs.writeFileSync(filePath, JSON.stringify(template, null, 2) + "\n", "utf-8");
188
+ }
189
+ } else {
190
+ fs.writeFileSync(filePath, JSON.stringify(template, null, 2) + "\n", "utf-8");
191
+ }
192
+ }
193
+ function runInit(options = {}) {
194
+ const cwd = options.cwd || process.cwd();
195
+ const root = options.project ? resolveProjectRoot(options.project, cwd) : path.resolve(cwd);
196
+ const slug = options.project ? getProjectSlug(options.project, cwd) : getProjectSlug(void 0, root);
197
+ console.log("\n\u26A1 Initializing behavior-mcp...\n");
198
+ registerProject(slug, root);
199
+ console.log(` \u{1F4C1} Registered project "${slug}" in global registry (${root})`);
200
+ const dataDir = path.join(root, ".behavior-mcp", slug);
201
+ if (!fs.existsSync(dataDir)) {
202
+ fs.mkdirSync(dataDir, { recursive: true, mode: 448 });
203
+ }
204
+ console.log(` \u{1F4E6} Created local storage directory: .behavior-mcp/${slug}`);
205
+ const gitignorePath = path.join(root, ".gitignore");
206
+ const ignoreEntry = ".behavior-mcp";
207
+ if (fs.existsSync(gitignorePath)) {
208
+ const content = fs.readFileSync(gitignorePath, "utf-8");
209
+ if (!content.includes(ignoreEntry)) {
210
+ fs.appendFileSync(gitignorePath, `
211
+ ${ignoreEntry}
212
+ `, "utf-8");
213
+ console.log(` \u{1F6E1}\uFE0F Updated .gitignore (${ignoreEntry})`);
214
+ }
215
+ }
216
+ const instructions = getInstructionsTemplate(slug);
217
+ const targets = [
218
+ ".agents/AGENTS.md",
219
+ "CLAUDE.md",
220
+ ".windsurfrules",
221
+ ".cursor/rules/behavior-mcp.mdc",
222
+ ".gemini/instructions.md",
223
+ ".vscode/instructions.md",
224
+ ".github/copilot-instructions.md"
225
+ ];
226
+ console.log(" \u{1F4DD} Scaffolding agent instruction contracts:");
227
+ for (const t of targets) {
228
+ const fullPath = path.join(root, t);
229
+ const dir = path.dirname(fullPath);
230
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
231
+ if (fs.existsSync(fullPath)) {
232
+ const content = fs.readFileSync(fullPath, "utf-8");
233
+ const { updatedContent, status } = upsertInstructionBlock(content, instructions);
234
+ fs.writeFileSync(fullPath, updatedContent, "utf-8");
235
+ console.log(` - ${t} (${status})`);
236
+ } else {
237
+ fs.writeFileSync(fullPath, instructions.trim() + "\n", "utf-8");
238
+ console.log(` - ${t} (created)`);
239
+ }
240
+ }
241
+ const skillContent = getSkillTemplate(slug);
242
+ const localSkillDir = path.join(root, ".agents/skills/behavior-mcp");
243
+ if (!fs.existsSync(localSkillDir)) fs.mkdirSync(localSkillDir, { recursive: true });
244
+ fs.writeFileSync(path.join(localSkillDir, "SKILL.md"), skillContent, "utf-8");
245
+ const homedir2 = os.homedir();
246
+ const globalSkillDir = path.join(homedir2, ".gemini/config/skills/behavior-mcp");
247
+ try {
248
+ if (!fs.existsSync(globalSkillDir)) fs.mkdirSync(globalSkillDir, { recursive: true });
249
+ fs.writeFileSync(path.join(globalSkillDir, "SKILL.md"), skillContent, "utf-8");
250
+ } catch {
251
+ }
252
+ console.log(" \u26A1 Installed Antigravity agent skill at: .agents/skills/behavior-mcp");
253
+ mergeMcpConfig(root, ".cursor/mcp.json", "Cursor", getMcpConfigCursor(slug), "mcpServers");
254
+ mergeMcpConfig(root, ".vscode/mcp.json", "VS Code", getMcpConfigVscode(slug), "servers");
255
+ const windsurfDir = path.join(root, ".windsurf");
256
+ if (fs.existsSync(windsurfDir)) {
257
+ mergeMcpConfig(root, ".windsurf/mcp.json", "Windsurf", getMcpConfigCursor(slug), "mcpServers");
258
+ }
259
+ const claudeDir = process.platform === "darwin" ? path.join(homedir2, "Library", "Application Support", "Claude") : process.platform === "win32" ? path.join(process.env.APPDATA || path.join(homedir2, "AppData", "Roaming"), "Claude") : path.join(homedir2, ".config", "Claude");
260
+ if (fs.existsSync(claudeDir)) {
261
+ mergeMcpConfig(
262
+ claudeDir,
263
+ "claude_desktop_config.json",
264
+ "Claude Desktop",
265
+ getMcpConfigCursor(slug),
266
+ "mcpServers"
267
+ );
268
+ }
269
+ const globalMcpConfig = path.join(homedir2, ".gemini/config/mcp_config.json");
270
+ try {
271
+ if (fs.existsSync(path.dirname(globalMcpConfig))) {
272
+ mergeMcpConfig(
273
+ homedir2,
274
+ ".gemini/config/mcp_config.json",
275
+ "Antigravity",
276
+ getMcpConfigAntigravity(),
277
+ "mcpServers"
278
+ );
279
+ }
280
+ const geminiConfigJson = path.join(homedir2, ".gemini/config/config.json");
281
+ if (fs.existsSync(geminiConfigJson)) {
282
+ try {
283
+ const raw = fs.readFileSync(geminiConfigJson, "utf-8");
284
+ const data = JSON.parse(raw);
285
+ if (data.userSettings?.globalPermissionGrants?.allow) {
286
+ let updated = false;
287
+ for (const perm of ["command(behavior-mcp)"]) {
288
+ if (!data.userSettings.globalPermissionGrants.allow.includes(perm)) {
289
+ data.userSettings.globalPermissionGrants.allow.push(perm);
290
+ updated = true;
291
+ }
292
+ }
293
+ if (updated) {
294
+ fs.writeFileSync(geminiConfigJson, JSON.stringify(data, null, 2) + "\n", "utf-8");
295
+ console.log(
296
+ " \u2705 Google Antigravity (config.json) \u2014 granted command(behavior-mcp)"
297
+ );
298
+ }
299
+ }
300
+ } catch {
301
+ }
302
+ }
303
+ } catch {
304
+ }
305
+ console.log(
306
+ " \u{1F50C} Configured IDE MCP Servers (Cursor, VS Code, Windsurf, Claude Desktop, Antigravity)"
307
+ );
308
+ const globalTargets = [
309
+ { path: path.join(homedir2, ".cursorrules"), label: "Global Cursor Rules (~/.cursorrules)" },
310
+ {
311
+ path: path.join(homedir2, ".gemini/GEMINI.md"),
312
+ label: "Global Gemini Rules (~/.gemini/GEMINI.md)"
313
+ }
314
+ ];
315
+ const globalRulesText = getGlobalRulesTemplate(slug);
316
+ for (const target of globalTargets) {
317
+ if (target.path.includes(".gemini") && !fs.existsSync(path.dirname(target.path))) {
318
+ continue;
319
+ }
320
+ if (fs.existsSync(target.path)) {
321
+ const content = fs.readFileSync(target.path, "utf-8");
322
+ const { updatedContent, status } = upsertInstructionBlock(content, globalRulesText);
323
+ if (status !== "unchanged") {
324
+ fs.writeFileSync(target.path, updatedContent, "utf-8");
325
+ console.log(` \u2705 ${target.label} \u2014 ${status} rules`);
326
+ }
327
+ } else {
328
+ fs.writeFileSync(target.path, globalRulesText, "utf-8");
329
+ console.log(` \u2705 ${target.label} \u2014 created`);
330
+ }
331
+ }
332
+ const db = getDb(slug, root);
333
+ console.log(" \u{1F4BE} Initialized SQLite database with WAL mode & SHA-256 Merkle audit chain");
334
+ const coreDir = path.resolve(root, "src", "behaviors", "core");
335
+ const gameDir = path.resolve(root, "src", "behaviors", "game");
336
+ let seededCount = 0;
337
+ for (const d of [coreDir, gameDir]) {
338
+ if (fs.existsSync(d)) {
339
+ for (const f of fs.readdirSync(d)) {
340
+ if (f.endsWith(".json")) {
341
+ try {
342
+ const raw = fs.readFileSync(path.join(d, f), "utf-8");
343
+ const tree = JSON.parse(raw);
344
+ BehaviorRegistry.registerBehavior(db, {
345
+ project: slug,
346
+ name: tree.id || path.basename(f, ".json"),
347
+ tree
348
+ });
349
+ seededCount++;
350
+ } catch {
351
+ }
352
+ }
353
+ }
354
+ }
355
+ }
356
+ if (seededCount > 0) {
357
+ console.log(` \u{1F331} Seeded ${seededCount} built-in behavior trees with SHA-256 tree hashes`);
358
+ }
359
+ const audit = verifyEventChain(db, slug);
360
+ console.log(
361
+ ` \u{1F50D} Audited cryptographic event ledger: ${audit.valid ? "\u2705 Unbroken SHA-256 chain" : "\u26A0\uFE0F Verification anomaly"}`
362
+ );
363
+ console.log(`
364
+ \u2728 behavior-mcp initialized successfully for "${slug}"!`);
365
+ console.log(' Run "behavior-mcp doctor" to verify runtime health.');
366
+ console.log(' Run "behavior-mcp inspect" to view active behavior executions.\n');
367
+ }
368
+ async function runAutoInit(root, projectSlug) {
369
+ const originalLog = console.log;
370
+ console.log = (...args) => console.error(...args);
371
+ try {
372
+ runInit({ project: projectSlug, cwd: root });
373
+ } catch (err) {
374
+ logger.warn(`Auto-init skipped: ${err.message}`);
375
+ } finally {
376
+ console.log = originalLog;
377
+ }
378
+ }
379
+ async function runInitGlobal() {
380
+ const { getRegistry } = await import("./db-ZOU6XEDM.js");
381
+ const registry = getRegistry();
382
+ const entries = Object.entries(registry);
383
+ console.log(`Running global init across ${entries.length} registered project(s)...`);
384
+ for (const [slug, projectRoot] of entries) {
385
+ if (fs.existsSync(projectRoot)) {
386
+ console.log(` - ${slug}: ${projectRoot}`);
387
+ runInit({ project: slug, cwd: projectRoot });
388
+ }
389
+ }
390
+ console.log("Global init complete.");
391
+ }
392
+
393
+ export {
394
+ upsertInstructionBlock,
395
+ runInit,
396
+ runAutoInit,
397
+ runInitGlobal
398
+ };
399
+ //# sourceMappingURL=chunk-NCJFRFRK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/init.ts","../src/cli/templates.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { logger } from '../utils/logger.js';\nimport {\n getAgentsMdTemplate,\n getInstructionsTemplate,\n getGlobalRulesTemplate,\n getMcpConfigCursor,\n getMcpConfigVscode,\n getMcpConfigAntigravity,\n getSkillTemplate,\n} from './templates.js';\nimport { registerProject, resolveProjectRoot, getProjectSlug, getDb } from '../engine/db.js';\nimport { BehaviorRegistry } from '../engine/behaviors.js';\nimport { verifyEventChain } from '../engine/events.js';\n\nexport function upsertInstructionBlock(\n content: string,\n newBlock: string,\n startMarker = '<!-- behavior-mcp:start -->',\n endMarker = '<!-- behavior-mcp:end -->'\n): { updatedContent: string; status: 'updated' | 'appended' | 'unchanged' } {\n // Check for new marker or legacy behavior-runtime-mcp marker\n let startIndex = content.indexOf(startMarker);\n let endIndex = content.indexOf(endMarker);\n let matchedEndMarker = endMarker;\n\n if (startIndex === -1) {\n const legacyStart = '<!-- behavior-runtime-mcp:start -->';\n const legacyEnd = '<!-- behavior-runtime-mcp:end -->';\n startIndex = content.indexOf(legacyStart);\n endIndex = content.indexOf(legacyEnd);\n matchedEndMarker = legacyEnd;\n }\n\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n const before = content.substring(0, startIndex);\n const after = content.substring(endIndex + matchedEndMarker.length);\n const existingBlock = content.substring(startIndex, endIndex + matchedEndMarker.length);\n if (existingBlock.trim() === newBlock.trim()) {\n return { updatedContent: content, status: 'unchanged' };\n }\n return { updatedContent: `${before}${newBlock.trim()}${after}`, status: 'updated' };\n }\n\n const separator = content.endsWith('\\n') ? '\\n' : '\\n\\n';\n return { updatedContent: `${content}${separator}${newBlock.trim()}\\n`, status: 'appended' };\n}\n\nfunction mergeMcpConfig(\n root: string,\n relativePath: string,\n label: string,\n template: Record<string, any>,\n serversKey: string\n): void {\n const filePath = path.join(root, relativePath);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n if (fs.existsSync(filePath)) {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const existing = JSON.parse(raw);\n if (existing[serversKey]?.['behavior-mcp']) {\n return;\n }\n if (!existing[serversKey]) existing[serversKey] = {};\n existing[serversKey]['behavior-mcp'] = template[serversKey]['behavior-mcp'];\n fs.writeFileSync(filePath, JSON.stringify(existing, null, 2) + '\\n', 'utf-8');\n } catch {\n fs.writeFileSync(filePath, JSON.stringify(template, null, 2) + '\\n', 'utf-8');\n }\n } else {\n fs.writeFileSync(filePath, JSON.stringify(template, null, 2) + '\\n', 'utf-8');\n }\n}\n\nexport function runInit(options: { project?: string; cwd?: string } = {}): void {\n const cwd = options.cwd || process.cwd();\n const root = options.project ? resolveProjectRoot(options.project, cwd) : path.resolve(cwd);\n const slug = options.project\n ? getProjectSlug(options.project, cwd)\n : getProjectSlug(undefined, root);\n\n console.log('\\n⚔ Initializing behavior-mcp...\\n');\n\n // 1. Register project\n registerProject(slug, root);\n console.log(` šŸ“ Registered project \"${slug}\" in global registry (${root})`);\n\n // 2. Create data directory\n const dataDir = path.join(root, '.behavior-mcp', slug);\n if (!fs.existsSync(dataDir)) {\n fs.mkdirSync(dataDir, { recursive: true, mode: 0o700 });\n }\n console.log(` šŸ“¦ Created local storage directory: .behavior-mcp/${slug}`);\n\n // 3. Update .gitignore\n const gitignorePath = path.join(root, '.gitignore');\n const ignoreEntry = '.behavior-mcp';\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes(ignoreEntry)) {\n fs.appendFileSync(gitignorePath, `\\n${ignoreEntry}\\n`, 'utf-8');\n console.log(` šŸ›”ļø Updated .gitignore (${ignoreEntry})`);\n }\n }\n\n // 4. Scaffold Agent Instructions\n const instructions = getInstructionsTemplate(slug);\n const targets = [\n '.agents/AGENTS.md',\n 'CLAUDE.md',\n '.windsurfrules',\n '.cursor/rules/behavior-mcp.mdc',\n '.gemini/instructions.md',\n '.vscode/instructions.md',\n '.github/copilot-instructions.md',\n ];\n\n console.log(' šŸ“ Scaffolding agent instruction contracts:');\n for (const t of targets) {\n const fullPath = path.join(root, t);\n const dir = path.dirname(fullPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n if (fs.existsSync(fullPath)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const { updatedContent, status } = upsertInstructionBlock(content, instructions);\n fs.writeFileSync(fullPath, updatedContent, 'utf-8');\n console.log(` - ${t} (${status})`);\n } else {\n fs.writeFileSync(fullPath, instructions.trim() + '\\n', 'utf-8');\n console.log(` - ${t} (created)`);\n }\n }\n\n // 5. Scaffold Antigravity Skill\n const skillContent = getSkillTemplate(slug);\n const localSkillDir = path.join(root, '.agents/skills/behavior-mcp');\n if (!fs.existsSync(localSkillDir)) fs.mkdirSync(localSkillDir, { recursive: true });\n fs.writeFileSync(path.join(localSkillDir, 'SKILL.md'), skillContent, 'utf-8');\n\n const homedir = os.homedir();\n const globalSkillDir = path.join(homedir, '.gemini/config/skills/behavior-mcp');\n try {\n if (!fs.existsSync(globalSkillDir)) fs.mkdirSync(globalSkillDir, { recursive: true });\n fs.writeFileSync(path.join(globalSkillDir, 'SKILL.md'), skillContent, 'utf-8');\n } catch {}\n console.log(' ⚔ Installed Antigravity agent skill at: .agents/skills/behavior-mcp');\n\n // 6. Merge IDE MCP Configs\n mergeMcpConfig(root, '.cursor/mcp.json', 'Cursor', getMcpConfigCursor(slug), 'mcpServers');\n mergeMcpConfig(root, '.vscode/mcp.json', 'VS Code', getMcpConfigVscode(slug), 'servers');\n\n const windsurfDir = path.join(root, '.windsurf');\n if (fs.existsSync(windsurfDir)) {\n mergeMcpConfig(root, '.windsurf/mcp.json', 'Windsurf', getMcpConfigCursor(slug), 'mcpServers');\n }\n\n const claudeDir =\n process.platform === 'darwin'\n ? path.join(homedir, 'Library', 'Application Support', 'Claude')\n : process.platform === 'win32'\n ? path.join(process.env.APPDATA || path.join(homedir, 'AppData', 'Roaming'), 'Claude')\n : path.join(homedir, '.config', 'Claude');\n\n if (fs.existsSync(claudeDir)) {\n mergeMcpConfig(\n claudeDir,\n 'claude_desktop_config.json',\n 'Claude Desktop',\n getMcpConfigCursor(slug),\n 'mcpServers'\n );\n }\n\n const globalMcpConfig = path.join(homedir, '.gemini/config/mcp_config.json');\n try {\n if (fs.existsSync(path.dirname(globalMcpConfig))) {\n mergeMcpConfig(\n homedir,\n '.gemini/config/mcp_config.json',\n 'Antigravity',\n getMcpConfigAntigravity(),\n 'mcpServers'\n );\n }\n\n const geminiConfigJson = path.join(homedir, '.gemini/config/config.json');\n if (fs.existsSync(geminiConfigJson)) {\n try {\n const raw = fs.readFileSync(geminiConfigJson, 'utf-8');\n const data = JSON.parse(raw);\n if (data.userSettings?.globalPermissionGrants?.allow) {\n let updated = false;\n for (const perm of ['command(behavior-mcp)']) {\n if (!data.userSettings.globalPermissionGrants.allow.includes(perm)) {\n data.userSettings.globalPermissionGrants.allow.push(perm);\n updated = true;\n }\n }\n if (updated) {\n fs.writeFileSync(geminiConfigJson, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n console.log(\n ' āœ… Google Antigravity (config.json) — granted command(behavior-mcp)'\n );\n }\n }\n } catch {}\n }\n } catch {}\n console.log(\n ' šŸ”Œ Configured IDE MCP Servers (Cursor, VS Code, Windsurf, Claude Desktop, Antigravity)'\n );\n\n // Global Rules\n const globalTargets = [\n { path: path.join(homedir, '.cursorrules'), label: 'Global Cursor Rules (~/.cursorrules)' },\n {\n path: path.join(homedir, '.gemini/GEMINI.md'),\n label: 'Global Gemini Rules (~/.gemini/GEMINI.md)',\n },\n ];\n const globalRulesText = getGlobalRulesTemplate(slug);\n for (const target of globalTargets) {\n if (target.path.includes('.gemini') && !fs.existsSync(path.dirname(target.path))) {\n continue;\n }\n if (fs.existsSync(target.path)) {\n const content = fs.readFileSync(target.path, 'utf-8');\n const { updatedContent, status } = upsertInstructionBlock(content, globalRulesText);\n if (status !== 'unchanged') {\n fs.writeFileSync(target.path, updatedContent, 'utf-8');\n console.log(` āœ… ${target.label} — ${status} rules`);\n }\n } else {\n fs.writeFileSync(target.path, globalRulesText, 'utf-8');\n console.log(` āœ… ${target.label} — created`);\n }\n }\n\n // 7. Initialize Database & Seed Built-in Behaviors\n const db = getDb(slug, root);\n console.log(' šŸ’¾ Initialized SQLite database with WAL mode & SHA-256 Merkle audit chain');\n\n const coreDir = path.resolve(root, 'src', 'behaviors', 'core');\n const gameDir = path.resolve(root, 'src', 'behaviors', 'game');\n let seededCount = 0;\n\n for (const d of [coreDir, gameDir]) {\n if (fs.existsSync(d)) {\n for (const f of fs.readdirSync(d)) {\n if (f.endsWith('.json')) {\n try {\n const raw = fs.readFileSync(path.join(d, f), 'utf-8');\n const tree = JSON.parse(raw);\n BehaviorRegistry.registerBehavior(db, {\n project: slug,\n name: tree.id || path.basename(f, '.json'),\n tree,\n });\n seededCount++;\n } catch {}\n }\n }\n }\n }\n if (seededCount > 0) {\n console.log(` 🌱 Seeded ${seededCount} built-in behavior trees with SHA-256 tree hashes`);\n }\n\n // 8. Health Audit\n const audit = verifyEventChain(db, slug);\n console.log(\n ` šŸ” Audited cryptographic event ledger: ${audit.valid ? 'āœ… Unbroken SHA-256 chain' : 'āš ļø Verification anomaly'}`\n );\n\n console.log(`\\n✨ behavior-mcp initialized successfully for \"${slug}\"!`);\n console.log(' Run \"behavior-mcp doctor\" to verify runtime health.');\n console.log(' Run \"behavior-mcp inspect\" to view active behavior executions.\\n');\n}\n\nexport async function runAutoInit(root?: string, projectSlug?: string): Promise<void> {\n const originalLog = console.log;\n console.log = (...args) => console.error(...args);\n try {\n runInit({ project: projectSlug, cwd: root });\n } catch (err: any) {\n logger.warn(`Auto-init skipped: ${err.message}`);\n } finally {\n console.log = originalLog;\n }\n}\n\nexport async function runInitGlobal(): Promise<void> {\n const { getRegistry } = await import('../engine/db.js');\n const registry = getRegistry();\n const entries = Object.entries(registry);\n console.log(`Running global init across ${entries.length} registered project(s)...`);\n\n for (const [slug, projectRoot] of entries) {\n if (fs.existsSync(projectRoot)) {\n console.log(` - ${slug}: ${projectRoot}`);\n runInit({ project: slug, cwd: projectRoot });\n }\n }\n console.log('Global init complete.');\n}\n","export function getAgentsMdTemplate(projectSlug = 'default'): string {\n return `<!-- behavior-mcp:start -->\n# Behavior Runtime Engine (behavior-mcp)\n\nThis project uses \\`behavior-mcp\\` with project slug \"${projectSlug}\" to execute deterministic behavior trees at ~60Hz in browser runtimes with reactive triggers and safety guardrails.\n\n## Mandatory Runtime Workflow\n1. **Load Behavior**: Call \\`load_behavior(action: \"load\", behavior_name: \"...\")\\` to activate execution.\n2. **Monitor Execution**: Check \\`get_status(action: \"current\")\\` and inspect active node traversal paths.\n3. **Reactive Triggers**: Register high-priority emergency interrupts via \\`register_trigger(action: \"register\", ...)\\`.\n4. **Safety & Abort**: Call \\`abort_behavior(action: \"abort\")\\` to immediately halt execution if anomalous behavior occurs.\n\n## 10 Core MCP Tools\n- \\`load_behavior\\`: Inject and start behavior tree execution.\n- \\`set_parameters\\`: Update execution parameters on the fly.\n- \\`get_status\\`: Query active status, current node path, and tick counters.\n- \\`abort_behavior\\`: Immediately halt, pause, or resume execution.\n- \\`register_trigger\\`: Configure priority interrupts with cooldown guards.\n- \\`replay_recording\\`: Capture and replay deterministic frame actions.\n- \\`get_metrics\\`: Query execution telemetry and duration statistics.\n- \\`manage_behaviors\\`: Register and version behavior tree definitions with SHA-256 tree hashes.\n- \\`manage_blackboard\\`: Read and write behavior tree blackboard state variables.\n- \\`manage_runtime_db\\`: Database maintenance, diagnostics, and SHA-256 Merkle audit verification.\n<!-- behavior-mcp:end -->\n`;\n}\n\nexport function getInstructionsTemplate(projectSlug: string): string {\n return getAgentsMdTemplate(projectSlug);\n}\n\nexport function getGlobalRulesTemplate(projectSlug: string): string {\n return `<!-- behavior-mcp:start -->\n# Behavior Runtime Engine (behavior-mcp)\n\nThis project uses behavior-mcp with project slug \"${projectSlug}\" for high-frequency in-browser behavior execution.\nALWAYS check active node paths and register reactive triggers for emergency state changes.\n\n## Mandatory Workflow\n1. **Load**: Call \\`load_behavior\\` to inject and step tree loops.\n2. **Monitor**: Check execution health with \\`get_status\\`.\n3. **Triggers**: Register interrupts with \\`register_trigger\\`.\n4. **Abort**: Use \\`abort_behavior\\` on stuck states.\n<!-- behavior-mcp:end -->\n`;\n}\n\nexport function getMcpConfigCursor(projectSlug: string): Record<string, unknown> {\n return {\n mcpServers: {\n 'behavior-mcp': {\n command: 'behavior-mcp',\n args: ['run'],\n env: {\n BEHAVIOR_PROJECT: projectSlug,\n },\n },\n },\n };\n}\n\nexport function getMcpConfigVscode(projectSlug: string): Record<string, unknown> {\n return {\n servers: {\n 'behavior-mcp': {\n type: 'stdio',\n command: 'behavior-mcp',\n args: ['run'],\n env: {\n BEHAVIOR_PROJECT: projectSlug,\n },\n },\n },\n };\n}\n\nexport function getMcpConfigAntigravity(): Record<string, unknown> {\n return {\n mcpServers: {\n 'behavior-mcp': {\n command: 'behavior-mcp',\n args: ['run'],\n },\n },\n };\n}\n\nexport function getSkillTemplate(projectSlug: string): string {\n return `---\nname: behavior-mcp\ndescription: Teaches the agent to use the Behavior MCP server for ~60Hz in-browser behavior trees, triggers, and recordings.\n---\n\n# Behavior Runtime Engine (behavior-mcp)\n\nThis skill provides step-by-step guidance and operational patterns for interacting with \\`@putervision/behavior-mcp\\` with project slug \\`\"${projectSlug}\"\\`.\n\n---\n\n## 1. Role in the PuterVision Pentad\n- **Workflow State** (\\`state-memory-mcp\\`): Persistent task DAGs, decisions, milestones, and blockers.\n- **Perception** (\\`vision-memory-mcp\\`): Visual layout caching, screenshots, and visual specifications.\n- **Spatial World** (\\`world-model-mcp\\`): Persistent 3D/2D coordinates, bounding boxes, and topological relations.\n- **Strategic Reasoning** (\\`agent-reasoning-mcp\\`): Strategic BDI goals, utility scoring, and intention dispatch.\n- **Tactical Execution** (\\`behavior-mcp\\`): High-frequency (~60Hz) deterministic behavior tree execution directly in browser runtimes with reactive interrupts.\n\n---\n\n## 2. Core Operational Sequence\n1. **Define or Load Behavior**: Call \\`load_behavior\\` with \\`action: \"load\"\\` to inject and start tree execution.\n2. **Register Reactive Triggers**: Configure emergency preemption using \\`register_trigger\\` with priority and cooldown guards.\n3. **Monitor Telemetry**: Poll execution health, tick rates, and active traversal nodes with \\`get_status\\`.\n4. **Runtime Blackboard**: Read and mutate execution variables via \\`manage_blackboard\\`.\n5. **Safety Guardrails**: Immediately halt or pause rogue states using \\`abort_behavior\\`.\n\n---\n\n## 3. Complete 10 Consolidated MCP Tools Reference\n\n| Tool Name | Key Actions | Key Parameters | Description |\n|---|---|---|---|\n| \\`load_behavior\\` | \\`load\\`, \\`unload\\`, \\`swap\\` | \\`behavior_name\\`, \\`behavior_version\\`, \\`parameters\\`, \\`intention_id\\` | Hot-swap, inject, or initialize behavior tree instances in browser runtime. |\n| \\`set_parameters\\` | \\`set\\`, \\`get\\`, \\`reset\\` | \\`execution_id\\`, \\`parameters\\` | Dynamically update or query execution parameters for the active tree. |\n| \\`get_status\\` | \\`current\\`, \\`history\\`, \\`tree_state\\` | \\`execution_id\\`, \\`limit\\` | Query active behavior status, current node path, tick count, duration, and errors. |\n| \\`abort_behavior\\` | \\`abort\\`, \\`pause\\`, \\`resume\\` | \\`execution_id\\`, \\`reason\\` | Immediately halt, pause, or resume execution and disengage active inputs. |\n| \\`register_trigger\\` | \\`register\\`, \\`list\\` | \\`name\\`, \\`condition_type\\`, \\`priority\\`, \\`cooldown_ms\\`, \\`behavior_name\\` | Configure reactive interrupt triggers with priority preemption and cooldowns. |\n| \\`replay_recording\\` | \\`capture\\`, \\`list\\` | \\`recording_id\\`, \\`execution_id\\`, \\`frames\\`, \\`name\\` | Capture or replay deterministic browser action sequences with adaptive timing. |\n| \\`get_metrics\\` | \\`current\\`, \\`history\\`, \\`aggregate\\`, \\`compare\\` | \\`execution_id\\`, \\`behavior_name\\`, \\`limit\\` | Retrieve execution telemetry, tick durations, stuck events, and statistics. |\n| \\`manage_behaviors\\` | \\`register\\`, \\`list\\`, \\`get\\` | \\`name\\`, \\`version\\`, \\`tree\\`, \\`tree_json\\`, \\`description\\` | CRUD operations for immutable JSON behavior trees with SHA-256 tree hash verification. |\n| \\`manage_blackboard\\` | \\`get\\`, \\`set\\` | \\`execution_id\\`, \\`key\\`, \\`value\\` | Read or write shared behavior tree blackboard state variables. |\n| \\`manage_runtime_db\\` | \\`stats\\`, \\`audit\\`, \\`snapshot\\`, \\`diff\\`, \\`restore\\` | \\`action\\`, \\`name\\`, \\`description\\` | Database maintenance, diagnostics, and SHA-256 Merkle audit verification. |\n`;\n}\n"],"mappings":"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","names":["homedir"]}