Skip to content

fix(plugin): skip non-function exports in getLegacyPlugins - #1943

Closed
Cipher208 wants to merge 688 commits into
XiaomiMiMo:devfrom
Cipher208:fix/plugin-legacy-load-skip-non-function-exports
Closed

fix(plugin): skip non-function exports in getLegacyPlugins#1943
Cipher208 wants to merge 688 commits into
XiaomiMiMo:devfrom
Cipher208:fix/plugin-legacy-load-skip-non-function-exports

Conversation

@Cipher208

Copy link
Copy Markdown

Fix: getLegacyPlugins throws TypeError on non-function exports, silently skipping plugins. Change throw→continue.

wqymi and others added 30 commits July 14, 2026 01:33
…reflect real progress

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 6ced0ae183fd491c07bc3d939eea59810ace6de4)
(cherry picked from commit cfd30c1)
…or mode (was duplicated)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit ef9e4bd1cd4ae130062c9a97e38f823bc17cb9a0)
(cherry picked from commit 36ad4d6)
…ome (T36 follow-up)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 2288eb72bce75b6180698257a99da10b23bcd4f5)
(cherry picked from commit 4d0fb8b)
…r reflex (T45)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit cdf861cd278e76c920523100727d5f22ac2ca8b5)
(cherry picked from commit d8e811c)
…ressable immediately (T42)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 54ad612030ba8b51ed02c1b027e954bc9c0f6877)
(cherry picked from commit 5c8d9d1)
… render)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 6274e46371e285a10e5a4554675f7f02402008fe)
(cherry picked from commit 5316daf)
…ever-run peers

The T12 woken-turn notification test polled only the raw InboxTable row, which
races the parent main runner: inbox.send fork-wakes parent main, whose runLoop
drains the actor_notification row into a synthetic message before the poll sees
it (observed 6/10 flaky failures). Assert delivery on EITHER surface — the raw
inbox row or the drained synthetic <actor-notification> message in the parent
main slice. Notification delivery itself was always correct; only the assertion
was racy. Now 12/12 stable.

Co-authored-by: wqymi <wangqiying@xiaomi.com>
(cherry picked from commit 1f6cddd768a65801143d011c2aff541c4890b1c2)
(cherry picked from commit 47734de)
… bridge (T41)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 4de816861cc2454c820f64db27681b136d4b7fe7)
(cherry picked from commit bf33001)
…e child (T43)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit fd39c9b)
…erb + list split (T39)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 248a0ef)
…ated result when all children terminal (T38)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit a5c20d2)
… the parent (T40)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit d15bae78e275e2a06c2722f9f2923d8a29fce3ce)
(cherry picked from commit 89e1791)
… send/status/join/--topic, event-driven stall) and drop stale relay/known-limitation (T44)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 00b487af054577c169b45b59097267d4779fcbaf)
(cherry picked from commit 7b195a6)
…ithout a home flash (T50 follow-up)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit f12de43aaf31090a254db9b5f45b6960535adc80)
(cherry picked from commit bccdfb8)
sweepOrphanAssistants gains an immediate flag; the user-message entry
passes immediate=true when the session is idle (no active runner), so a
dangling assistant left by a hard interruption is completed at once
instead of after the 1h ORPHAN_AGE_MS. This clears the TUI 'pending'
marker so a newly submitted message on an idle session is not rendered
QUEUED. Background spawn/hook callers keep the age guard. Adds tests.

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 0efada6)
…of cancelling them (align session interaction with human↔session)

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit fcc28f5ba7f5a0f4eef4cca9568ffff48f6d1c1e)
(cherry picked from commit 7d97bd9)
…dren external_directory asks for granted dirs

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit c05fe6f)
…in one view

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
(cherry picked from commit 58b44f4a6eed069d14015c6b9c7c91c6f0d14dd1)
(cherry picked from commit ca4b064)
The list action enriched children with actor rows but never filtered
system subagents (checkpoint-writer, dream, distill, read-only forks),
so they leaked into the orchestrator's peer listing and inflated counts.
Apply the same mode:subagent / SYSTEM_SPAWNED_AGENT_TYPES filter that the
dashboard and status branches already use.

Co-authored-by: MiMo-Code <noreply@mimo.xiaomi.com>
…chestrator dir before -c resume

Two non-blocking findings from PR XiaomiMiMo#1681 review:

- deriveLiveness now reads `progressing` for a child with turnCount===0. A
  peer is registered at spawn with lastTurnTime=spawn time and turnCount=0, so
  a first turn that hasn't started within 90s (queued behind the concurrency
  gate, model cold-start) was wrongly flagged `stalled` and triggered an
  "appears stalled" false positive before it ever ran. A stalled row must now
  have run at least one turn. Tests updated to reflect the new invariant.

- The -c resume effect in tui/app.tsx no longer latches continued=true down the
  plain root-session branch while orchestratorDirPath() is still unresolved.
  orchestratorDirPath resolves asynchronously in onMount; if sync reached
  "partial" first, the orchestrator session was resumed as a plain build
  session and continued=true was set permanently, so the later resolve could
  never correct it. A new orchestratorDirResolved signal gates the decision
  until the path settles.
resolveDrainSeed's Tier 1 fallback searched the WHOLE session (agentID
"*") for a prior model-bearing message. That broke WorkflowRuntime: a
workflow parent session runs its subagents under its own session, and
when a child's completion actor_notification is delivered to the parent
"main" actor, the inbox send wakes the parent loop and drains the row.
The cross-slice seed found a *sibling subagent's* message, fabricated a
synthetic user turn on the host, and burned a real LLM call — stealing
the queued response the next agent() call expected. Symptoms: the second
of two queued responses became the auto-"ok" fallback, so replay
re-spawned the wrong count and the structure tree recorded a stale
resultSummary (runtime.test.ts replay/structure failures introduced by
PR XiaomiMiMo#1681's inbox drain-seed relay, commit efd89e2).

Fix: gate the cross-slice search on the receiver being a `peer` (a
standing peer legitimately runs a turn under one slice then relays via
another). Every other receiver — ordinary subagent, or a coordinating
host/"main" actor — searches only its own slice, restoring the pre-relay
behavior. Tier 2 (registry-row + default-model) is unchanged, so the
turnCount-0 standing-peer relay still works. Verified: inbox tier-1/2/3
drain tests + session-tool relay tests stay green.
…tatus, not just actor lifecycle

Two defects in renderActorNotification/parseActorNotification:

1. Semantic: "actor completed" described the sub-session *process
   lifecycle* ending, which is independent of the task outcome. A
   sub-session can exit cleanly while its reportedStatus is
   failed/blocked, yet the old text always said "completed. Status:
   unknown", implying success. Completion wording now aligns with
   reportedStatus: success/partial → "completed"; failed/blocked →
   "finished (status: ...)" (no success implication); unknown → neutral
   "ended (status not reported)" with the misleading "Status: unknown"
   line dropped.

2. Terminology: "actor" is an internal term. Top-level wording and the
   TUI card now say "sub-session" to match the orchestrator context.

parseActorNotification (inverse) and its header regex are updated to
parse the new verbs so the XiaomiMiMo#1699 TUI card keeps parsing, adding an
"ended" status. Round-trip render->parse is covered by tests.
…he directory (XiaomiMiMo#1714)

Extract MIMOCODE_GITIGNORE_ENTRIES constant and ensureMimocodeGitignore()
helper into config/gitignore.ts so the entries list is defined once.
Both config.ts and cron-lock.ts now reference the shared module.
…* skills (XiaomiMiMo#1715)

* fix(session): include colon in multi-skill mention regex for compose:* skills

* test(session): add regression tests for skill mention regex colon support
…st hooks

Previously trajectory consumers only saw the rare MessageV2.User.system
per-turn override — the assembled runtime system prompt (agent + provider
+ additions + memory + plugin transforms) built in buildLLMRequestPrefix
was never surfaced. Capture the latest prebuiltSystem into a runLoop-scoped
variable at both fork and main paths, then forward it as an optional
systemPrompt: string[] field on both hook inputs so private overlays like
the trajectory event uploader can log/replay against the exact system
prompt the model saw.
Per project style guide (default to no comments; only add one when the
WHY is non-obvious): the field names and surrounding context already
convey what these blocks were saying.
…iaomiMiMo#1716)

The mention auto-load system used sys.available() which filters
hidden skills, preventing compose:* skills from being detected
when users type /compose:ask etc. in free text. Switch to sys.all()
so all registered skills (including hidden compose skills) are
matchable by the /name mention regex.
…ce (XiaomiMiMo#1718)

The pixel-based at-bottom check (scrollTop >= scrollHeight - 1) introduced
in XiaomiMiMo#1685 has a timing race: when switching agent views, SolidJS effects fire
after reactive renders that may have already grown scrollHeight (new streaming
content, navigation chrome), but opentui's sticky-scroll adjustment hasn't
run yet. This causes scrollTop to momentarily lag behind scrollHeight, making
the check fail and incorrectly saving a mid-scroll position.

Replace with opentui's internal _hasManualScroll flag — the authoritative
source of truth for whether the user has scrolled away from the sticky edge.
This is immune to content-growth timing since it tracks user intent, not
instantaneous pixel position.

Follow-up to XiaomiMiMo#1685
…oordination

feat(orchestrator): mode entry/nav, reliable relay + liveness/fan-in, grant persistence, prompt & UI polish
…ard-compat regex

Finding 1 (UX consistency): actor.ts start notification now says
'Background sub-session started.' instead of 'Background actor started.'
to match the finish notification format.

Finding 3 (backward compat): parseActorNotification regex now accepts
both 'Background sub-session' and legacy 'Background actor' formats so
old persisted notifications render as TUI cards instead of raw text.

Includes regression test for legacy 'Background actor' format.
yanyihan-xiaomi and others added 28 commits July 24, 2026 18:01
fix(log): isolate writers and flush safely on exit
- gate placeholder signatures behind an opt-in flag
- preserve signed and redacted Anthropic reasoning unchanged
- cover default-off and non-Anthropic behavior
…igned-reasoning-replay

feat(provider): replay unsigned Anthropic reasoning
- prefer the persisted recent selection over the configured default

- wait for recent state to load before choosing startup fallbacks
…el-restore

fix(tui): restore recent model on startup
- build the native mimo binary for the current platform\n- install it atomically into the configurable local bin directory
…-script

feat(cli): add local install script
- document interactive, headless, session, sandbox, and MCP workflows
- keep invocation explicit and cover bundled discovery
…ill-description

fix(skill): simplify Claude Code trigger description
…g-effort-variants

fix(provider): enable reasoning effort variants for DeepSeek models
- prevent official reasoning effort options from leaking to OpenRouter and custom endpoints
- cover official, OpenRouter, and custom provider routing
…nt-provider-scope

fix(provider): scope DeepSeek variants to official API
Add a bundled browser-automation workflow with a portable CLI wrapper and usage references.
feat(skill): add Playwright CLI automation bundle
…right-cli

chore: ignore Playwright CLI artifacts
Require explicit opt-in via dream.auto / distill.auto config instead of
running memory consolidation and workflow packaging automatically.
…am-distill-default-off

feat: disable auto-dream and auto-distill by default
External plugins fail to load because getLegacyPlugins throws
TypeError when encountering any export that is not a function
and doesn't have a 'server' property (e.g. constants, config
objects, type re-exports).

This causes the entire plugin to be silently skipped — the error
is caught in applyPlugin's Effect.catch and logged, but hooks
are never registered.

Fix: change 'throw' to 'continue' so non-plugin exports are
silently skipped, matching the behavior of getServerPlugin
which already returns undefined for non-plugin values.

This fixes the issue where external plugins (plugin: [...]) don't
execute their module code in MiMoCode 0.38.9.
Replaces separate lint.yml, test.yml, typecheck.yml with unified ci.yml:

- typecheck: bun typecheck
- lint: oxlint + prettier check
- test: sharded unit tests (4 shards)
- security: skylos scan on plugin directory
- quality: repowise health on plugin directory
- python: auto-detects pyproject.toml, runs ruff/mypy/pytest
- rust: auto-detects Cargo.toml, runs cargo check/test
- go: auto-detects go.mod, runs go vet/test

Multi-language: Python, Rust, Go jobs auto-detect and skip if no files found.
@Cipher208

Copy link
Copy Markdown
Author

Replaced by clean PR #1944 (bug fix only, no CI/CD changes)

@Cipher208 Cipher208 closed this Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants