diff --git a/frontends/conductor.py b/frontends/conductor.py index 316b86c8..a92f289e 100644 --- a/frontends/conductor.py +++ b/frontends/conductor.py @@ -431,7 +431,17 @@ API: {base};requests,GET /readme查用法,GET /chat读未读对话,GET / conductor = Conductor() # ---- IM poller: 探测conductor_im_plugins/下各插件,信号变化→唤醒总管 ---- -IM_DIR, IM_COOLDOWN = os.path.join(os.path.dirname(__file__), "conductor_im_plugins"), 300 +def _resolve_im_dir() -> str: + # 方案三: conductor.py itself is bundle-owned, but IM plugins are user/environment + # integrations. Prefer the external core's plugins when GA_ROOT points at one; fall back + # to the bundle templates/examples when the external core has no plugin directory. + external = os.path.join(ROOT, "frontends", "conductor_im_plugins") + if os.path.isdir(external): + return external + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "conductor_im_plugins") + + +IM_DIR, IM_COOLDOWN = _resolve_im_dir(), 300 IM_PROMPTS: Dict[str, str] = {} # source -> 采集prompt(派采集subagent时按需取) def im_poll_loop(): diff --git a/frontends/ga_contract_probe.py b/frontends/ga_contract_probe.py index 6fa5da65..ffa8dd36 100644 --- a/frontends/ga_contract_probe.py +++ b/frontends/ga_contract_probe.py @@ -3,11 +3,15 @@ Given a target ga_root, verify the external核 satisfies the symbol/signature contract that the desktop bridge + conductor + cost_tracker rely on — WITHOUT instantiating GenericAgent -(that would read mykey, build LLM clients, and mutate the核). We only: +(that would read mykey and build LLM clients). We only: - import the核 modules against `ga_root` (this doubles as a dependency check: if the bundle python can't import the核's deps, the import fails and we report incompatible), and - introspect the GenericAgent class + module-level functions via `inspect`. +Note: importing agentmain/llmcore can still run module top-level create-if-missing +initializers in the target核 (for example seeding default memory/config files). The probe +does not intentionally overwrite existing files and never constructs a GenericAgent instance. + Runtime-only surface (instance attrs like llmclient.backend.history, llmclients, task_queue, handler.working, backend.current_name) cannot be checked statically and is intentionally not probed here; it is covered by the "核 ≈ upstream" compatibility and graceful degrade.