ecma state machine: shorten tool names
diff --git a/extensions/ecma262_state_machine/README.md b/extensions/ecma262_state_machine/README.md index c6ebdfd..48e7750 100644 --- a/extensions/ecma262_state_machine/README.md +++ b/extensions/ecma262_state_machine/README.md
@@ -4,18 +4,18 @@ ## Tools -* `ecma262_state_machine_init`: Initializes the state. -* `ecma262_state_machine_push_context`: Pushes a new execution context. -* `ecma262_state_machine_pop_context`: Pops the top execution context. -* `ecma262_state_machine_update_context`: Updates a field in the running context. -* `ecma262_state_machine_new_environment`: Creates a new environment record. -* `ecma262_state_machine_set_binding`: Sets a binding in an environment record. -* `ecma262_state_machine_env_op`: Performs operations on Environment Records. -* `ecma262_state_machine_object_op`: Performs operations on the Heap / Object Model. -* `ecma262_state_machine_enqueue_promise_job`: Enqueues a job in the Promise Job Queue. -* `ecma262_state_machine_get_job_queue`: Returns the current list of pending jobs. -* `ecma262_state_machine_dequeue_job`: Removes and returns the first job from the queue. -* `ecma262_state_machine_get_history`: Returns the history of the state. +* `init`: Initializes the state. +* `push_context`: Pushes a new execution context. +* `pop_context`: Pops the top execution context. +* `update_context`: Updates a field in the running context. +* `new_environment`: Creates a new environment record. +* `set_binding`: Sets a binding in an environment record. +* `env_op`: Performs operations on Environment Records. +* `object_op`: Performs operations on the Heap / Object Model. +* `enqueue_promise_job`: Enqueues a job in the Promise Job Queue. +* `get_job_queue`: Returns the current list of pending jobs. +* `dequeue_job`: Removes and returns the first job from the queue. +* `get_history`: Returns the history of the state. ## Setup
diff --git a/extensions/ecma262_state_machine/server.py b/extensions/ecma262_state_machine/server.py index 5a81d53..9365970 100644 --- a/extensions/ecma262_state_machine/server.py +++ b/extensions/ecma262_state_machine/server.py
@@ -1979,8 +1979,8 @@ # Tool definitions # ... (keep existing tools) -@mcp.tool(name='ecma262_state_machine_init') -def ecma262_state_machine_init() -> str: +@mcp.tool(name='init') +def init() -> str: """Initializes the abstract machine state. Returns the full path to the created state file. @@ -1997,8 +1997,8 @@ }) -@mcp.tool(name='ecma262_state_machine_push_context') -def ecma262_state_machine_push_context(name: str, +@mcp.tool(name='push_context') +def push_context(name: str, realm: str, lexEnv: str, varEnv: str, @@ -2008,15 +2008,15 @@ return sm.ecma262_state_push_context(name, realm, lexEnv, varEnv) -@mcp.tool(name='ecma262_state_machine_pop_context') -def ecma262_state_machine_pop_context(state_id: str = None) -> str: +@mcp.tool(name='pop_context') +def pop_context(state_id: str = None) -> str: """Pops the top execution context from the stack.""" sm = StateManager(_get_state_path(state_id)) return sm.ecma262_state_pop_context() -@mcp.tool(name='ecma262_state_machine_update_context') -def ecma262_state_machine_update_context(key: str, +@mcp.tool(name='update_context') +def update_context(key: str, value: Any, state_id: str = None) -> str: """Updates a field in the running execution context.""" @@ -2024,8 +2024,8 @@ return sm.ecma262_state_update_context(key, value) -@mcp.tool(name='ecma262_state_machine_new_environment') -def ecma262_state_machine_new_environment(type: str, +@mcp.tool(name='new_environment') +def new_environment(type: str, outerEnv: str, bindings: dict = None, state_id: str = None) -> str: @@ -2034,8 +2034,8 @@ return sm.ecma262_state_new_environment(type, outerEnv, bindings) -@mcp.tool(name='ecma262_state_machine_set_binding') -def ecma262_state_machine_set_binding(envId: str, +@mcp.tool(name='set_binding') +def set_binding(envId: str, name: str, value: Any, state_id: str = None) -> str: @@ -2044,8 +2044,8 @@ return sm.ecma262_state_set_binding(envId, name, value) -@mcp.tool(name='ecma262_state_machine_env_op') -def ecma262_state_machine_env_op(env_id: str, +@mcp.tool(name='env_op') +def env_op(env_id: str, operation: str, name: str, value: Any = None, @@ -2063,8 +2063,8 @@ binding_name=binding_name) -@mcp.tool(name='ecma262_state_machine_object_op') -def ecma262_state_machine_object_op(object_id: str, +@mcp.tool(name='object_op') +def object_op(object_id: str, operation: str, property_name: str = None, value: Any = None, @@ -2076,8 +2076,8 @@ descriptor) -@mcp.tool(name='ecma262_state_machine_enqueue_promise_job') -def ecma262_state_machine_enqueue_promise_job(job_name: str, +@mcp.tool(name='enqueue_promise_job') +def enqueue_promise_job(job_name: str, callback_id: str, args: list, state_id: str = None) -> str: @@ -2086,22 +2086,22 @@ return sm.ecma262_state_enqueue_promise_job(job_name, callback_id, args) -@mcp.tool(name='ecma262_state_machine_get_job_queue') -def ecma262_state_machine_get_job_queue(state_id: str = None) -> str: +@mcp.tool(name='get_job_queue') +def get_job_queue(state_id: str = None) -> str: """Returns the current list of pending jobs.""" sm = StateManager(_get_state_path(state_id)) return json.dumps(sm.ecma262_state_get_job_queue()) -@mcp.tool(name='ecma262_state_machine_dequeue_job') -def ecma262_state_machine_dequeue_job(state_id: str = None) -> str: +@mcp.tool(name='dequeue_job') +def dequeue_job(state_id: str = None) -> str: """Removes and returns the first job from the queue.""" sm = StateManager(_get_state_path(state_id)) return json.dumps(sm.ecma262_state_dequeue_job()) -@mcp.tool(name='ecma262_state_machine_get_history') -def ecma262_state_machine_get_history(format_type: str = "full", +@mcp.tool(name='get_history') +def get_history(format_type: str = "full", state_id: str = None) -> str: """Returns the history of the state.""" sm = StateManager(_get_state_path(state_id))
diff --git a/extensions/ecma262_state_machine/test_server.py b/extensions/ecma262_state_machine/test_server.py index fff5392..cb0127e 100644 --- a/extensions/ecma262_state_machine/test_server.py +++ b/extensions/ecma262_state_machine/test_server.py
@@ -16,24 +16,24 @@ class TestEcmabot(unittest.TestCase): def test_state_init(self): - result_json = server.ecma262_state_machine_init() + result_json = server.init() result = json.loads(result_json) self.assertEqual(result.get("status"), "initialized") def test_current_state_tracking(self): # Init without arguments, should generate a unique file - init_res = server.ecma262_state_machine_init() + init_res = server.init() result = json.loads(init_res) state_file = result.get("state_file") self.assertIsNotNone(state_file) self.assertTrue("state_" in state_file) # Call another operation without state_id - server.ecma262_state_machine_push_context("test_current", "ref:Realm:1", + server.push_context("test_current", "ref:Realm:1", "ref:Env:1", "ref:Env:1") # Verify it wrote to the generated file by reading history - history = server.ecma262_state_machine_get_history("full") + history = server.get_history("full") self.assertIn("test_current", history) # Clean up @@ -43,155 +43,155 @@ os.remove(state_file) def test_state_push_context(self): - server.ecma262_state_machine_init() - result = server.ecma262_state_machine_push_context("test_context", + server.init() + result = server.push_context("test_context", "ref:Realm:1", "ref:Env:Test", "ref:Env:Test") self.assertEqual(result, "Pushed context: test_context") def test_state_pop_context(self): - server.ecma262_state_machine_init() - server.ecma262_state_machine_push_context("test_context", "ref:Realm:1", + server.init() + server.push_context("test_context", "ref:Realm:1", "ref:Env:Test", "ref:Env:Test") - result = server.ecma262_state_machine_pop_context() + result = server.pop_context() self.assertEqual(result, "Popped context: test_context") def test_state_update_context(self): - server.ecma262_state_machine_init() - server.ecma262_state_machine_push_context("test_context", "ref:Realm:1", + server.init() + server.push_context("test_context", "ref:Realm:1", "ref:Env:Test", "ref:Env:Test") # Test valid update - result = server.ecma262_state_machine_update_context( + result = server.update_context( "codeEvaluationState", "Suspended") self.assertTrue("Updated top context field" in result) # Test invalid key - result = server.ecma262_state_machine_update_context("invalid_key", "value") + result = server.update_context("invalid_key", "value") self.assertTrue("Error: Invalid execution context key" in result) def test_state_create_env(self): - server.ecma262_state_machine_init() - result = server.ecma262_state_machine_new_environment( + server.init() + result = server.new_environment( "Declarative", "ref:Env:Global") self.assertEqual(result, "Created environment ref:Env:4 of type Declarative") def test_state_set_binding(self): - server.ecma262_state_machine_init() - server.ecma262_state_machine_new_environment("Declarative", + server.init() + server.new_environment("Declarative", "ref:Env:Global") - result = server.ecma262_state_machine_set_binding("ref:Env:4", "x", 42) + result = server.set_binding("ref:Env:4", "x", 42) self.assertEqual(result, "Set binding x = 42 in ref:Env:4") def test_state_env_op(self): - server.ecma262_state_machine_init() - server.ecma262_state_machine_new_environment("Declarative", + server.init() + server.new_environment("Declarative", "ref:Env:Global") # Test CreateMutableBinding - result = server.ecma262_state_machine_env_op("ref:Env:4", + result = server.env_op("ref:Env:4", "CreateMutableBinding", "x") self.assertEqual(result, "Created mutable binding x in ref:Env:4") # Test InitializeBinding - result = server.ecma262_state_machine_env_op("ref:Env:4", + result = server.env_op("ref:Env:4", "InitializeBinding", "x", 42) self.assertEqual(result, "Initialized binding x to 42 in ref:Env:4") # Test GetBindingValue - result = server.ecma262_state_machine_env_op("ref:Env:4", "GetBindingValue", + result = server.env_op("ref:Env:4", "GetBindingValue", "x") self.assertEqual(json.loads(result), 42) def test_state_has_binding_declarative(self): - server.ecma262_state_machine_init() - server.ecma262_state_machine_new_environment("Declarative", + server.init() + server.new_environment("Declarative", "ref:Env:Global") - result = server.ecma262_state_machine_env_op("ref:Env:4", "HasBinding", "x") + result = server.env_op("ref:Env:4", "HasBinding", "x") self.assertFalse(result) - server.ecma262_state_machine_env_op("ref:Env:4", "CreateMutableBinding", + server.env_op("ref:Env:4", "CreateMutableBinding", "x") - result = server.ecma262_state_machine_env_op("ref:Env:4", "HasBinding", "x") + result = server.env_op("ref:Env:4", "HasBinding", "x") self.assertTrue(result) def test_state_has_binding_object(self): - server.ecma262_state_machine_init() + server.init() - result = server.ecma262_state_machine_env_op("ref:Env:GlobalObj", + result = server.env_op("ref:Env:GlobalObj", "HasBinding", "globalProp") self.assertFalse(result) - server.ecma262_state_machine_object_op("ref:Obj:Global", + server.object_op("ref:Obj:Global", "OrdinaryDefineOwnProperty", "globalProp", 100) - result = server.ecma262_state_machine_env_op("ref:Env:GlobalObj", + result = server.env_op("ref:Env:GlobalObj", "HasBinding", "globalProp") self.assertTrue(result) def test_state_has_binding_global(self): - server.ecma262_state_machine_init() + server.init() - result = server.ecma262_state_machine_env_op("ref:Env:Global", "HasBinding", + result = server.env_op("ref:Env:Global", "HasBinding", "x") self.assertFalse(result) - server.ecma262_state_machine_env_op("ref:Env:GlobalDecl", + server.env_op("ref:Env:GlobalDecl", "CreateMutableBinding", "x") - result = server.ecma262_state_machine_env_op("ref:Env:Global", "HasBinding", + result = server.env_op("ref:Env:Global", "HasBinding", "x") self.assertTrue(result) - result = server.ecma262_state_machine_env_op("ref:Env:Global", "HasBinding", + result = server.env_op("ref:Env:Global", "HasBinding", "globalProp") self.assertFalse(result) - server.ecma262_state_machine_object_op("ref:Obj:Global", + server.object_op("ref:Obj:Global", "OrdinaryDefineOwnProperty", "globalProp", 100) - result = server.ecma262_state_machine_env_op("ref:Env:Global", "HasBinding", + result = server.env_op("ref:Env:Global", "HasBinding", "globalProp") self.assertTrue(result) def test_state_object_op(self): - server.ecma262_state_machine_init() + server.init() # Test MakeBasicObject - result = server.ecma262_state_machine_object_op( + result = server.object_op( None, "MakeBasicObject", descriptor={"internalSlots": ["[[CustomSlot]]"]}) self.assertTrue("MakeBasicObject" in result) # Test SetInternalSlot (should succeed because [[CustomSlot]] was declared) - result = server.ecma262_state_machine_object_op("ref:Obj:2", + result = server.object_op("ref:Obj:2", "SetInternalSlot", "[[CustomSlot]]", 123) self.assertEqual(result, "Set internal slot [[CustomSlot]] to 123 in ref:Obj:2") # Test SetInternalSlot (should fail because [[UndeclaredSlot]] was not declared) - result = server.ecma262_state_machine_object_op("ref:Obj:2", + result = server.object_op("ref:Obj:2", "SetInternalSlot", "[[UndeclaredSlot]]", 456) self.assertTrue( "Error: Internal slot [[UndeclaredSlot]] was not declared" in result) # Test OrdinaryDefineOwnProperty - server.ecma262_state_machine_object_op("ref:Obj:3", "MakeBasicObject") - result = server.ecma262_state_machine_object_op( + server.object_op("ref:Obj:3", "MakeBasicObject") + result = server.object_op( "ref:Obj:3", "OrdinaryDefineOwnProperty", "prop", 456) self.assertTrue(result) # Test OrdinaryDefineOwnProperty (reject non-configurable update) - server.ecma262_state_machine_object_op( + server.object_op( "ref:Obj:3", "OrdinaryDefineOwnProperty", "non_conf", @@ -199,7 +199,7 @@ "value": 1, "configurable": False }) - result = server.ecma262_state_machine_object_op( + result = server.object_op( "ref:Obj:3", "OrdinaryDefineOwnProperty", "non_conf", @@ -207,105 +207,105 @@ self.assertFalse(result) # Test OrdinaryGetPrototypeOf (initially None) - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryGetPrototypeOf") self.assertIsNone(result) # Test OrdinarySetPrototypeOf - server.ecma262_state_machine_object_op("ref:ProtoObj", "MakeBasicObject") - result = server.ecma262_state_machine_object_op( + server.object_op("ref:ProtoObj", "MakeBasicObject") + result = server.object_op( "ref:Obj:3", "OrdinarySetPrototypeOf", value="ref:ProtoObj") self.assertTrue(result) # Test OrdinaryGetPrototypeOf (now should be ref:ProtoObj) - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryGetPrototypeOf") self.assertEqual(result, "ref:ProtoObj") # Test OrdinaryIsExtensible - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryIsExtensible") self.assertTrue(result) # Test OrdinaryPreventExtensions - result = server.ecma262_state_machine_object_op( + result = server.object_op( "ref:Obj:3", "OrdinaryPreventExtensions") self.assertTrue(result) # Test OrdinaryIsExtensible (now False) - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryIsExtensible") self.assertFalse(result) # Test OrdinaryGetOwnProperty - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryGetOwnProperty", "prop") desc = json.loads(result) self.assertEqual(desc["value"], 456) # Test OrdinaryHasProperty - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryHasProperty", "prop") self.assertTrue(result) # Test OrdinaryDelete - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryDelete", "prop") self.assertTrue(result) # Test OrdinaryHasProperty (now False) - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryHasProperty", "prop") self.assertFalse(result) # Test OrdinaryOwnPropertyKeys - result = server.ecma262_state_machine_object_op("ref:Obj:3", + result = server.object_op("ref:Obj:3", "OrdinaryOwnPropertyKeys") keys = json.loads(result) self.assertIn("non_conf", keys) # Test OrdinaryGet (data property) - result = server.ecma262_state_machine_object_op("ref:Obj:3", "OrdinaryGet", + result = server.object_op("ref:Obj:3", "OrdinaryGet", "non_conf") res = json.loads(result) self.assertEqual(res["status"], "completed") self.assertEqual(res["value"], 1) # Test OrdinarySet (data property) on a new extensible object - server.ecma262_state_machine_object_op("ref:Obj:5", "MakeBasicObject") - result = server.ecma262_state_machine_object_op("ref:Obj:5", "OrdinarySet", + server.object_op("ref:Obj:5", "MakeBasicObject") + result = server.object_op("ref:Obj:5", "OrdinarySet", "new_prop", 789) res = json.loads(result) self.assertEqual(res["status"], "completed") self.assertTrue(res["success"]) # Test OrdinaryGet (verify new_prop) - result = server.ecma262_state_machine_object_op("ref:Obj:5", "OrdinaryGet", + result = server.object_op("ref:Obj:5", "OrdinaryGet", "new_prop") res = json.loads(result) self.assertEqual(res["status"], "completed") self.assertEqual(res["value"], 789) # Test OrdinaryDefineOwnProperty with getter on a NEW object - server.ecma262_state_machine_object_op("ref:Obj:4", "MakeBasicObject") - server.ecma262_state_machine_object_op( + server.object_op("ref:Obj:4", "MakeBasicObject") + server.object_op( "ref:Obj:4", "OrdinaryDefineOwnProperty", "getter_prop", descriptor={"get": "ref:GetterFunc"}) # Test OrdinaryGet (should return signal) - result = server.ecma262_state_machine_object_op("ref:Obj:4", "OrdinaryGet", + result = server.object_op("ref:Obj:4", "OrdinaryGet", "getter_prop") res = json.loads(result) self.assertEqual(res["status"], "requires_getter_invocation") self.assertEqual(res["getter"], "ref:GetterFunc") # Test OrdinaryCall - result = server.ecma262_state_machine_object_op( + result = server.object_op( "ref:Obj:3", "OrdinaryCall", value="ref:ThisVal", @@ -318,7 +318,7 @@ self.assertEqual(res["argumentsList"], [1, 2]) # Test OrdinaryConstruct - result = server.ecma262_state_machine_object_op( + result = server.object_op( "ref:Obj:2", "OrdinaryConstruct", descriptor={ @@ -333,7 +333,7 @@ self.assertEqual(res["argumentsList"], [3, 4]) # Test OrdinaryObjectCreate - result = server.ecma262_state_machine_object_op( + result = server.object_op( None, "OrdinaryObjectCreate", value="ref:Obj:2") self.assertTrue("OrdinaryObjectCreate" in result)