项目文件夹

文件
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

98 行
5.2 KiB
Markdown

# LifeOps dependency graph & de-circularization audit
Tracking issue: [#9299](https://github.com/elizaOS/eliza/issues/9299), Scope 1.
This document is the canonical record of the dependency direction between
`@elizaos/plugin-personal-assistant` (PA / LifeOps) and the sibling lifeops
plugins. Re-run the checks below before adding any new cross-plugin import; if a
new edge appears, fix the edge — do not document a new exception without a
written rationale here.
## Result: zero circular dependencies
- **Intra-plugin (relative imports):** `madge --circular` over
`plugin-personal-assistant/src` reports **no circular dependency** across the
full module set.
```bash
bunx madge --circular --extensions ts --no-spinner \
plugins/plugin-personal-assistant/src
```
- **Cross-plugin (package imports):** no sibling lifeops plugin imports
`@elizaos/plugin-personal-assistant` in source. Every textual match is a
doc-comment or a provider-id **string literal** (e.g.
`"@elizaos/plugin-personal-assistant:time-window"`) — loose runtime registry
coupling resolved by name at runtime, not a compile-time edge.
```bash
# expect zero matches for every sibling:
grep -rhnE '^\s*(import|export)\b.*from\s+["'\'']@elizaos/plugin-personal-assistant' \
plugins/plugin-{blocker,calendar,finances,health,inbox,relationships,scheduling}/src
```
## Dependency direction (inward-only)
PA is the composition layer; it depends on the domain plugins, never the
reverse. Edge counts are the number of PA source files importing each sibling:
```
plugin-personal-assistant ─▶ plugin-health (19 files)
─▶ plugin-blocker (15 files)
─▶ plugin-scheduling (11 files)
─▶ plugin-inbox (11 files)
─▶ plugin-finances (10 files)
─▶ plugin-calendar (8 files)
─▶ plugin-relationships (0 files; consumed via the
runtime KnowledgeGraphService)
```
No sibling declares `@elizaos/plugin-personal-assistant` as a dependency in its
`package.json`, and none imports it in source. The decomposition that carved the
calendar / finances / inbox / relationships / scheduling domains out of PA's
`app_lifeops` schema already inverted these edges; this audit confirms they have
stayed inverted.
## Runtime coupling that is intentionally *not* a compile-time edge
The siblings reference PA by **provider-id string** through the shared registries
(`AnchorRegistry`, `EventKindRegistry`, `ConnectorRegistry`, `ChannelRegistry`)
and the single `ScheduledTask` runner in `@elizaos/plugin-scheduling`. This is
deliberate: it keeps the dependency graph acyclic while letting PA remain the
registrar of the cross-domain providers. Routing is by structural field, never
by `promptInstructions` content (see `README.md`).
## Knowledge graph ownership
`EntityStore` / `RelationshipStore` are runtime primitives owned by
`@elizaos/agent` and surfaced through `KnowledgeGraphService`
(`resolveKnowledgeGraphService(runtime)`); the merge engine and entity/
relationship types live in `@elizaos/shared`. PA's `lifeops/entities/*` and
`lifeops/relationships/*` are thin re-export shims over those primitives — there
is no second knowledge-graph store. `plugin-relationships` owns the user-facing
graph surface (the `KNOWLEDGE_GRAPH` action + viewer).
## Domain-extraction status (Scope 2 audit, #9299)
Audited the modules the issue flagged as "still embedded" in the PA monolith.
Each is already in its correct home; none is misplaced domain logic that a
sibling plugin should own:
| Module | Verdict | Why it stays in PA |
| --- | --- | --- |
| `lifeops/calendar-gate.ts` | correct PA glue | Implements `plugin-calendar`'s `CalendarHostGate` and injects PA's repository/Google-grant layer into `CalendarService`. It imports `LifeOpsService`, so moving it to `plugin-calendar` would invert the dependency (cycle). This *is* "PA composes the calendar plugin." |
| `lifeops/email-classifier.ts` | re-export shim | Real classifier already lives in `@elizaos/shared`; this 19-line file only preserves the historic import path. |
| `lifeops/entities/*`, `lifeops/relationships/*` | re-export shims | Thin shims over the runtime `EntityStore`/`RelationshipStore` (see "Knowledge graph ownership" above). |
| `lifeops/service-mixin-{calendar,inbox,scheduling}.ts` | correct PA glue | Composition mixins that wire PA's `LifeOpsService` to the domain plugins; they are the composition layer, not domain logic. |
### Flagged: `lifeops/bill-extraction.ts` (unconsumed)
`bill-extraction.ts` (457 lines of finance/bill parsing) has **no source
consumer** anywhere in `packages/` or `plugins/` — `grep -rn 'extractBill' --include='*.ts'`
matches only the file itself and doc comments. It is finance-domain logic that,
if revived, belongs in `@elizaos/plugin-finances` (PA already depends on it,
inward), not in the PA monolith. Left in place rather than relocated/deleted
because it reads as intended scaffolding for a future finances action; the repo
owner should either wire a `plugin-finances` consumer or remove it. Recorded
here so the next pass does not re-discover it cold.