Unified Agent + reusable Go agent core.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: remove remaining maep references

Lyric 7faa8a0e 01628c11

+32 -433
-2
docs/README.md
··· 7 7 - [Tools](./tools.md) 8 8 - [Security](./security.md) 9 9 - [Skills](./skills.md) 10 - - [MAEP](./maep.md) 11 - - [MAEP Implementation](./maep_impl.md) 12 10 - [Telegram Runtime](./telegram.md) 13 11 - [Slack (Socket Mode)](./slack.md) 14 12 - [Bus](./bus.md)
-9
docs/arch.md
··· 97 97 - Tools system: [`./tools.md`](./tools.md) 98 98 - Security / Guard: [`./security.md`](./security.md) 99 99 - Skills system: [`./skills.md`](./skills.md) 100 - - MAEP protocol and implementation: [`./maep.md`](./maep.md), [`./maep_impl.md`](./maep_impl.md) 101 100 - Telegram runtime behavior: [`./telegram.md`](./telegram.md) 102 101 - Slack Socket Mode: [`./slack.md`](./slack.md) 103 102 - Bus design and implementation: [`./bus.md`](./bus.md), [`./bus_impl.md`](./bus_impl.md) ··· 143 142 │ ├── INACTIVE.md 144 143 │ ├── bus_inbox.json 145 144 │ └── bus_outbox.json 146 - ├── maep/ 147 - │ ├── identity.json 148 - │ ├── contacts.json 149 - │ ├── inbox_messages.jsonl 150 - │ ├── outbox_messages.jsonl 151 - │ ├── audit_events.jsonl 152 - │ ├── dedupe_records.json 153 - │ └── protocol_history.json 154 145 ├── memory/ 155 146 │ ├── index.md 156 147 │ └── YYYY-MM-DD/<sanitized-session-id>.md
+7 -20
docs/bus.md
··· 75 75 ### 2.5 Conversation Key Rules 76 76 Implemented constructors: 77 77 - Telegram chat: `tg:<chat_id>` 78 - - MAEP peer: `maep:<peer_id>` 79 78 - Slack channel: `slack:<team_id>:<channel_id>` 80 79 - Discord channel: `discord:<channel_id>` 81 80 ··· 96 95 - Telegram: 97 96 - inbound: `internal/bus/adapters/telegram/inbound.go` 98 97 - delivery: `internal/bus/adapters/telegram/delivery.go` 99 - - MAEP: 100 - - inbound: `internal/bus/adapters/maep/inbound.go` 101 - - delivery: `internal/bus/adapters/maep/delivery.go` 102 98 - Slack: 103 99 - inbound: `internal/bus/adapters/slack/inbound.go` 104 100 - delivery: `internal/bus/adapters/slack/delivery.go` ··· 109 105 - starts inproc bus 110 106 - subscribes `AllTopics()` with one dispatcher by `direction + channel` 111 107 - Telegram poll inbound path: Telegram inbound adapter -> bus -> handler -> worker queue 112 - - MAEP inbound path under `--with-maep`: `OnDataPush -> MAEP inbound adapter -> bus -> handler` 113 108 - business outbound messages (task output, task failures, file-download failures, plan updates) are sent through bus outbound 114 109 - operational/admin messages (for example `/help`, `/mem`, initialization/system notices) may still use direct send 115 110 ··· 119 114 - inbound path: Slack Socket Mode event -> Slack inbound adapter -> bus -> handler -> per-conversation worker 120 115 - task output and error replies are published as outbound bus messages, then delivered by Slack delivery adapter 121 116 122 - `mistermorph maep serve`: 123 - - starts inproc bus 124 - - `OnDataPush -> MAEP inbound adapter -> bus -> handler` 125 - - handler prints events and optionally syncs contacts 126 - 127 117 `internal/contactsruntime/sender.go`: 128 118 - `NewRoutingSender` starts inproc bus and delivery adapters internally 129 - - `Send(...)` routes to Telegram / Slack / MAEP, then publishes outbound `BusMessage` 119 + - `Send(...)` routes to Telegram / Slack, then publishes outbound `BusMessage` 130 120 - `publishAndAwait(...)` uses a pending map for synchronous delivery result waiting 131 121 - fail-fast: missing `idempotency_key` is an immediate error 132 122 ··· 172 162 173 163 ```text 174 164 Telegram poll/getUpdates ----\ 175 - Slack Socket Mode ------------+--> inbound adapters (telegram/slack/maep) 176 - MAEP OnDataPush -------------/ | 165 + Slack Socket Mode ------------+--> inbound adapters (telegram/slack) 177 166 v 178 167 +----------------------+ 179 168 | inproc bus runtime | ··· 188 177 | | 189 178 v v 190 179 run task / agent delivery adapters 191 - | (telegram / slack / maep) 180 + | (telegram / slack) 192 181 +-------------------------+-------------------+ 193 182 | 194 183 v 195 - Telegram / Slack / MAEP send 184 + Telegram / Slack send 196 185 ``` 197 186 198 187 ### 3.2 Shared Inbound Path (`InboundFlow`) ··· 221 210 ## 4) Design Evaluation (Current State) 222 211 223 212 ### 4.1 Why this is reasonable now 224 - - Minimal viable path is complete: Telegram / Slack / MAEP inbound/outbound paths are unified through bus. 213 + - Minimal viable path is complete: Telegram / Slack inbound/outbound paths are unified through bus. 225 214 - Ordering is explicit and enforceable per `conversation_key`. 226 215 - Backpressure is bounded and observable via typed error (`QUEUE_FULL`). 227 216 - Idempotency is explicit via inbox/outbox keyed records. ··· 236 225 ## 5) Delivery Status 237 226 238 227 ### 5.1 Completed 239 - - Telegram/MAEP inbound adapters 240 - - Telegram/MAEP delivery adapters 228 + - Telegram inbound/delivery adapters 241 229 - Slack inbound/delivery adapters 242 230 - outbound bus migration in `contactsruntime sender` 243 231 - Slack runtime bus path (`mistermorph slack`) with inbound publish and outbound delivery 244 232 - main-path test coverage expansion 245 233 - migration of Telegram business direct-send paths to bus outbound (admin paths excluded) 246 234 - typed error code propagation in call-site logging 247 - - cross-channel regression: Telegram inbound -> MAEP outbound 248 235 249 236 ### 5.2 Verified test set 250 237 Verified locally on `2026-02-17`: 251 238 - `go test ./internal/bus/...` 252 239 - `go test ./internal/bus/adapters/...` 253 240 - `go test ./internal/contactsruntime/... ./contacts/...` 254 - - `go test ./cmd/mistermorph/telegramcmd ./cmd/mistermorph/maepcmd ./cmd/mistermorph/slackcmd` 241 + - `go test ./cmd/mistermorph/telegramcmd ./cmd/mistermorph/slackcmd` 255 242 - `go test ./...` 256 243 257 244 ## 6) Backlog (Separated from Current State)
+14 -17
docs/bus_impl.md
··· 11 11 In scope: 12 12 - `internal/bus` runtime, validation, and error model 13 13 - `internal/bus/adapters/*` inbound and delivery adapters 14 - - Bus wiring in `cmd/mistermorph/telegramcmd` and `cmd/mistermorph/maepcmd` 14 + - Bus wiring in `cmd/mistermorph/telegramcmd` and `cmd/mistermorph/slackcmd` 15 15 - Bus inbox/outbox state in `contacts/*` 16 16 - Outbound bus path in `internal/contactsruntime/sender.go` 17 17 18 18 Out of scope: 19 19 - Multi-channel architecture roadmap and product-level planning (see `docs/bus.md`) 20 - - MAEP protocol specification details (see `docs/maep.md`) 21 20 22 21 ## 2) Bus Runtime (`internal/bus`) 23 22 ··· 65 64 - Generic constructor: `BuildConversationKey(channel, id)`. 66 65 - Implemented specialized constructors: 67 66 - `BuildTelegramChatConversationKey` 68 - - `BuildMAEPPeerConversationKey` 69 67 - `BuildSlackChannelConversationKey` 70 68 - `BuildDiscordChannelConversationKey` 71 69 - `tg:@<username>` is not a Telegram delivery conversation key (delivery requires numeric `tg:<chat_id>`). ··· 84 82 - Delivery (`telegram/delivery.go`): consumes `outbound/telegram` and sends text via resolved target. 85 83 - Idempotency key strategy: `idempotency.MessageEnvelopeKey(message_id)`. 86 84 87 - ### 3.3 MAEP Adapters 88 - - Inbound (`maep/inbound.go`): maps `maep.DataPushEvent` to `BusMessage` (`inbound/maep`) and reuses `InboundFlow`. 89 - - Delivery (`maep/delivery.go`): consumes `outbound/maep` and calls `Node.PushData`. 85 + ### 3.3 Slack Adapters 86 + - Inbound (`slack/inbound.go`): maps Slack Socket Mode events to `BusMessage`. 87 + - Delivery (`slack/delivery.go`): consumes `outbound/slack` and sends message text to target channel/thread. 90 88 91 89 ### 3.4 Demo Adapter 92 90 `adapters/demo` remains as a template validation path built on `InboundFlow`. ··· 98 96 - Subscribes `AllTopics()` and dispatches by `direction + channel`. 99 97 - Inbound paths: 100 98 - Telegram polling -> Telegram inbound adapter -> bus -> handler -> worker queue 101 - - `--with-maep`: MAEP `OnDataPush` -> MAEP inbound adapter -> bus 102 99 - Outbound paths: 103 100 - `outbound/telegram` -> Telegram delivery adapter 104 - - `outbound/maep` -> MAEP delivery adapter 105 101 - Business outputs (task output, task failure, file-download failure, plan updates) are on bus outbound. 106 102 - Operational/admin responses (`/help`, `/mem`, bootstrap guidance, etc.) may still use direct send. 107 103 108 - ### 4.2 `mistermorph maep serve` 109 - - Starts inproc bus and subscribes `AllTopics()`. 110 - - MAEP `OnDataPush` is normalized through MAEP inbound adapter -> bus. 111 - - Handler projects bus message back to event shape for CLI output and optional contacts sync. 104 + ### 4.2 `mistermorph slack` 105 + - Starts inproc bus using `bus.max_inflight`. 106 + - Subscribes `AllTopics()` and dispatches by `direction + channel`. 107 + - Inbound path: Slack Socket Mode events -> Slack inbound adapter -> bus -> handler -> worker queue. 108 + - Outbound path: `outbound/slack` -> Slack delivery adapter. 112 109 113 110 ### 4.3 `internal/contactsruntime/sender.go` 114 111 - `RoutingSender` starts inproc bus and both delivery adapters internally. ··· 158 155 ## 7) Completion Status 159 156 Implemented: 160 157 - Bus runtime semantics (ordering, backpressure, topology freeze, typed errors) 161 - - Telegram and MAEP inbound adapters 162 - - Telegram and MAEP delivery adapters 163 - - Bus wiring in Telegram and MAEP command paths 158 + - Telegram and Slack inbound adapters 159 + - Telegram and Slack delivery adapters 160 + - Bus wiring in Telegram and Slack command paths 164 161 - Outbound publish path in `contactsruntime` sender 165 162 - Contacts outbox state machine and idempotent send flow 166 163 - Typed error code propagation in caller-side logs (`bus_error_code`) 167 - - Cross-channel regression path: Telegram inbound -> MAEP outbound 164 + - Cross-channel regression path: Telegram inbound -> Slack outbound 168 165 169 166 Not implemented yet: 170 - - Slack/Discord adapter integration into main runtime path 167 + - Discord adapter integration into main runtime path 171 168 - External bus backend (for example Redis Streams) 172 169 - Retry / DLQ workers
+2 -2
docs/tools.md
··· 134 134 - Requires an LLM client and model; returns an error if not bound. 135 135 - `add` uses a "param extraction + LLM insertion" flow: `people` comes from tool params, then the LLM inserts `name (ref_id)` based on `content`, raw user input, and runtime context. 136 136 - `chat_id` currently accepts only `tg:<chat-id>` (signed int64, non-zero). 137 - - `add` only accepts reference IDs in this set: `tg:<int64>`, `tg:@<username>`, `maep:<peer_id>`, `slack:<channel_id>`, `discord:<channel_id>`. 137 + - `add` only accepts reference IDs in this set: `tg:<int64>`, `tg:@<username>`, `slack:<channel_id>`, `discord:<channel_id>`. 138 138 - Reference IDs in `add` must exist in contact snapshot `reachable_ids`. 139 139 - If some people in `add` cannot be mapped to reference IDs, the tool does not fail; it falls back to writing raw `content` and appends `reference_unresolved_write_raw` in `warnings`. 140 140 - `complete` relies only on LLM semantic matching (no programmatic fallback); ambiguous matches return an error directly. ··· 164 164 165 165 ## `contacts_send` 166 166 167 - Purpose: send a single message to one contact (auto-routed via MAEP/Telegram). 167 + Purpose: send a single message to one contact (auto-routed via Telegram/Slack). 168 168 169 169 Contact profile maintenance: 170 170
-1
internal/channels/channels.go
··· 4 4 Telegram = "telegram" 5 5 Slack = "slack" 6 6 Discord = "discord" 7 - MAEP = "maep" 8 7 )
+2 -2
internal/idempotency/key_test.go
··· 13 13 } 14 14 15 15 func TestProactiveShareKey_Deterministic(t *testing.T) { 16 - got := ProactiveShareKey("maep:Peer-A", "cand-1", 42, "group") 17 - want := "proactive:maep_peer_a:cand_1:42:group" 16 + got := ProactiveShareKey("slack:T111:U222", "cand-1", 42, "group") 17 + want := "proactive:slack_t111_u222:cand_1:42:group" 18 18 if got != want { 19 19 t.Fatalf("ProactiveShareKey() = %q, want %q", got, want) 20 20 }
+1 -1
internal/todo/contact_snapshot_test.go
··· 75 75 if err := ValidateReachableReferences("提醒 [John](slack:T001:D002) 明天确认", snap); err != nil { 76 76 t.Fatalf("ValidateReachableReferences(snapshot id) error = %v", err) 77 77 } 78 - err := ValidateReachableReferences("提醒 [John](maep:unknown) 明天确认", snap) 78 + err := ValidateReachableReferences("提醒 [John](peer:unknown) 明天确认", snap) 79 79 if err == nil || !strings.Contains(strings.ToLower(err.Error()), "invalid reference id") { 80 80 t.Fatalf("expected invalid reference id error, got %v", err) 81 81 }
+3 -3
internal/todo/ops_test.go
··· 99 99 } 100 100 } 101 101 102 - func TestStoreAddRejectsMAEPReferenceID(t *testing.T) { 102 + func TestStoreAddRejectsUnsupportedReferenceID(t *testing.T) { 103 103 root := t.TempDir() 104 104 store := NewStore(filepath.Join(root, "TODO.md"), filepath.Join(root, "TODO.DONE.md")) 105 105 store.Semantics = stubSemantics{} ··· 107 107 return time.Date(2026, 2, 9, 10, 0, 0, 0, time.UTC) 108 108 } 109 109 110 - _, err := store.Add(context.Background(), "提醒 [Momo](maep:12D3KooWPeer) 明天回复") 110 + _, err := store.Add(context.Background(), "提醒 [Momo](peer:12D3KooWPeer) 明天回复") 111 111 if err == nil { 112 - t.Fatalf("expected Add() to fail for maep reference id") 112 + t.Fatalf("expected Add() to fail for unsupported reference id") 113 113 } 114 114 if !strings.Contains(strings.ToLower(err.Error()), "invalid reference id") { 115 115 t.Fatalf("unexpected error: %v", err)
-2
morph_pi.card.json
··· 3 3 "version": 1, 4 4 "node_uuid": "019c35c5-1ff8-7eb7-9797-9448d91e084c", 5 5 "peer_id": "12D3KooWGXuSLffqNsXnhJfW8hFCdkdRfiEF2jbhUWb3R2b7RAJs", 6 - "node_id": "maep:12D3KooWGXuSLffqNsXnhJfW8hFCdkdRfiEF2jbhUWb3R2b7RAJs", 7 6 "identity_pub_ed25519": "Y8pKYwYc4T_WqAPR3NV8nZKBrWL-h_FRXpJu0IxGP_A", 8 7 "addresses": [ 9 8 "/ip4/100.70.105.121/tcp/46343/p2p/12D3KooWGXuSLffqNsXnhJfW8hFCdkdRfiEF2jbhUWb3R2b7RAJs" ··· 16 15 "sig_format": "jcs-rfc8785-detached", 17 16 "sig": "b4xIT63IZ1vyjnSFVb6A_a5AiHCKsuElQG8x-5RAjqlmgfHASIFFiUQVfIzrTDmf6CzR1JZFdAP6h6K6fgE7DQ" 18 17 } 19 -
+1 -308
theme/assets/css/main.css
··· 1503 1503 } 1504 1504 1505 1505 .security-flow-card, 1506 - .maep-network-card, 1507 1506 .bus-map-card { 1508 1507 position: relative; 1509 1508 overflow: hidden; ··· 1516 1515 } 1517 1516 1518 1517 .security-flow-card::before, 1519 - .maep-network-card::before, 1520 1518 .bus-map-card::before { 1521 1519 content: ""; 1522 1520 position: absolute; ··· 1528 1526 } 1529 1527 1530 1528 .security-flow-card::after, 1531 - .maep-network-card::after, 1532 1529 .bus-map-card::after { 1533 1530 display: none; 1534 1531 } ··· 1634 1631 animation-delay: -2.3s; 1635 1632 } 1636 1633 1637 - .docs-layout-maep { 1638 - grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); 1639 - } 1640 - 1641 - .maep-exchange-map { 1642 - margin-top: 0.72rem; 1643 - display: grid; 1644 - grid-template-columns: minmax(0, 10.2rem) minmax(0, 1fr); 1645 - gap: 0.66rem; 1646 - align-items: start; 1647 - } 1648 - 1649 - .maep-hub-node { 1650 - min-height: 100%; 1651 - border: 1px solid rgba(255, 255, 255, 0.2); 1652 - background: rgba(12, 12, 12, 0.6); 1653 - display: flex; 1654 - align-items: center; 1655 - justify-content: center; 1656 - padding: 0.86rem 0.6rem; 1657 - } 1658 - 1659 - .maep-hub-title { 1660 - font-family: var(--font-mono); 1661 - font-size: 0.68rem; 1662 - letter-spacing: 0.1em; 1663 - text-transform: uppercase; 1664 - color: var(--text-0); 1665 - text-align: center; 1666 - line-height: 1.4; 1667 - } 1668 - 1669 - .maep-peer-stack { 1670 - display: grid; 1671 - gap: 0.52rem; 1672 - } 1673 - 1674 - .maep-peer-row { 1675 - display: grid; 1676 - grid-template-columns: 1.42rem minmax(0, 1fr); 1677 - align-items: center; 1678 - column-gap: 0.38rem; 1679 - } 1680 - 1681 - .maep-peer-wire { 1682 - position: relative; 1683 - height: 1px; 1684 - background: rgba(255, 255, 255, 0.3); 1685 - } 1686 - 1687 - .maep-peer-wire::before, 1688 - .maep-peer-wire::after { 1689 - content: ""; 1690 - position: absolute; 1691 - top: 50%; 1692 - width: 1px; 1693 - height: 0.36rem; 1694 - background: rgba(255, 255, 255, 0.3); 1695 - transform: translateY(-50%); 1696 - } 1697 - 1698 - .maep-peer-wire::before { 1699 - left: 0; 1700 - } 1701 - 1702 - .maep-peer-wire::after { 1703 - right: 0; 1704 - } 1705 - 1706 - .maep-peer-packet { 1707 - position: absolute; 1708 - top: 50%; 1709 - width: 0.34rem; 1710 - height: 0.34rem; 1711 - border-radius: 999px; 1712 - transform: translate(-50%, -50%); 1713 - } 1714 - 1715 - .maep-peer-packet.packet-out { 1716 - left: 0%; 1717 - background: #ff9a5c; 1718 - animation: maep-packet-out 2.8s linear infinite; 1719 - } 1720 - 1721 - .maep-peer-packet.packet-in { 1722 - left: 100%; 1723 - background: rgba(210, 210, 210, 0.95); 1724 - animation: maep-packet-in 2.8s linear infinite; 1725 - } 1726 - 1727 - .maep-peer-row:nth-child(2n) .maep-peer-packet.packet-out { 1728 - animation-delay: -0.7s; 1729 - } 1730 - 1731 - .maep-peer-row:nth-child(2n) .maep-peer-packet.packet-in { 1732 - animation-delay: -1.3s; 1733 - } 1734 - 1735 - .maep-peer-bubble { 1736 - border: 1px solid rgba(255, 255, 255, 0.2); 1737 - background: rgba(14, 14, 14, 0.56); 1738 - padding: 0.54rem 0.62rem; 1739 - } 1740 - 1741 - .maep-peer-row:nth-child(1) .maep-peer-bubble { 1742 - border-color: rgba(255, 154, 92, 0.44); 1743 - } 1744 - 1745 - .maep-peer-row:nth-child(2) .maep-peer-bubble { 1746 - border-color: rgba(180, 180, 180, 0.36); 1747 - } 1748 - 1749 - .maep-peer-row:nth-child(3) .maep-peer-bubble { 1750 - border-color: rgba(146, 146, 146, 0.34); 1751 - } 1752 - 1753 - .maep-peer-title { 1754 - display: inline-flex; 1755 - align-items: center; 1756 - justify-content: center; 1757 - padding: 0.04rem 0.26rem; 1758 - border: 1px solid rgba(255, 255, 255, 0.2); 1759 - font-family: var(--font-mono); 1760 - font-size: 0.61rem; 1761 - letter-spacing: 0.08em; 1762 - color: var(--text-0); 1763 - } 1764 - 1765 - .maep-peer-bubble p { 1766 - margin: 0.32rem 0 0; 1767 - font-size: 0.82rem; 1768 - line-height: 1.42; 1769 - color: var(--text-1); 1770 - } 1771 - 1772 - .maep-protocol-list { 1773 - margin: 0.5rem 0 0; 1774 - padding: 0; 1775 - list-style: none; 1776 - display: grid; 1777 - gap: 0.44rem; 1778 - } 1779 - 1780 - .maep-protocol-list li { 1781 - display: flex; 1782 - flex-direction: column; 1783 - align-items: flex-start; 1784 - gap: 0.3rem; 1785 - padding: 0.18rem 0; 1786 - border: none; 1787 - background: transparent; 1788 - min-height: 2.1rem; 1789 - } 1790 - 1791 - .maep-protocol-tag { 1792 - display: inline-flex; 1793 - align-items: center; 1794 - justify-content: center; 1795 - padding: 0.03rem 0.26rem; 1796 - border: 1px solid rgba(255, 255, 255, 0.2); 1797 - font-family: var(--font-mono); 1798 - font-size: 0.61rem; 1799 - letter-spacing: 0.08em; 1800 - color: var(--text-1); 1801 - white-space: nowrap; 1802 - } 1803 - 1804 - .maep-protocol-list p { 1805 - margin: 0; 1806 - font-size: 0.84rem; 1807 - line-height: 1.42; 1808 - color: var(--text-1); 1809 - } 1810 - 1811 - .maep-rules-layout { 1812 - margin-top: 0.72rem; 1813 - display: grid; 1814 - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); 1815 - gap: 0.72rem; 1816 - } 1817 - 1818 - .maep-rules-group { 1819 - min-width: 0; 1820 - } 1821 - 1822 - .maep-rules-label { 1823 - margin: 0; 1824 - font-family: var(--font-mono); 1825 - font-size: 0.61rem; 1826 - letter-spacing: 0.1em; 1827 - text-transform: uppercase; 1828 - color: var(--text-2); 1829 - } 1830 - 1831 - .maep-rules-group .track-points { 1832 - margin-top: 0.48rem; 1833 - } 1834 - 1835 - .maep-constraints-list { 1836 - margin-top: 0.5rem; 1837 - display: grid; 1838 - gap: 0.44rem; 1839 - counter-reset: constraint; 1840 - } 1841 - 1842 - .maep-constraints-list li { 1843 - position: relative; 1844 - display: flex; 1845 - align-items: flex-start; 1846 - padding: 0.22rem 0 0.22rem 1.74rem; 1847 - font-size: 0.84rem; 1848 - line-height: 1.42; 1849 - min-height: 2.1rem; 1850 - } 1851 - 1852 - .maep-constraints-list li + li { 1853 - margin-top: 0; 1854 - } 1855 - 1856 - .maep-constraints-list li::before { 1857 - counter-increment: constraint; 1858 - content: "[ C" counter(constraint, decimal-leading-zero) " ]"; 1859 - position: absolute; 1860 - left: 0.44rem; 1861 - top: 0.24rem; 1862 - font-family: var(--font-mono); 1863 - font-size: 0.58rem; 1864 - letter-spacing: 0.08em; 1865 - color: var(--text-2); 1866 - } 1867 - 1868 1634 .docs-layout-bus { 1869 1635 grid-template-columns: minmax(0, 1.18fr) minmax(0, 0.82fr); 1870 1636 } ··· 2425 2191 } 2426 2192 2427 2193 :root[data-theme="light"] .security-flow-card, 2428 - :root[data-theme="light"] .maep-network-card, 2429 2194 :root[data-theme="light"] .bus-map-card { 2430 2195 border-style: dashed !important; 2431 2196 border-color: rgba(0, 0, 0, 0.28) !important; ··· 2435 2200 } 2436 2201 2437 2202 :root[data-theme="light"] .security-flow-card::before, 2438 - :root[data-theme="light"] .maep-network-card::before, 2439 2203 :root[data-theme="light"] .bus-map-card::before { 2440 2204 border-color: rgba(0, 0, 0, 0.16); 2441 2205 } 2442 2206 2443 2207 :root[data-theme="light"] .security-chain-node, 2444 2208 :root[data-theme="light"] .security-chain-link, 2445 - :root[data-theme="light"] .maep-hub-node, 2446 - :root[data-theme="light"] .maep-peer-bubble, 2447 - :root[data-theme="light"] .maep-peer-title, 2448 - :root[data-theme="light"] .maep-protocol-tag, 2449 2209 :root[data-theme="light"] .bus-protocol-chip, 2450 2210 :root[data-theme="light"] .bus-core-bar, 2451 2211 :root[data-theme="light"] .bus-guarantee-mark { 2452 2212 border-color: rgba(0, 0, 0, 0.2); 2453 2213 } 2454 2214 2455 - :root[data-theme="light"] .security-chain-node, 2456 - :root[data-theme="light"] .maep-hub-node, 2457 - :root[data-theme="light"] .maep-peer-bubble { 2215 + :root[data-theme="light"] .security-chain-node { 2458 2216 background: rgba(255, 255, 255, 0.62); 2459 2217 } 2460 2218 ··· 2481 2239 box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.24); 2482 2240 } 2483 2241 2484 - :root[data-theme="light"] .maep-peer-wire, 2485 - :root[data-theme="light"] .maep-peer-wire::before, 2486 - :root[data-theme="light"] .maep-peer-wire::after, 2487 2242 :root[data-theme="light"] .bus-protocol-chip::after { 2488 2243 background: rgba(0, 0, 0, 0.26); 2489 2244 border-color: rgba(0, 0, 0, 0.26); ··· 2498 2253 2499 2254 :root[data-theme="light"] .bus-core-bar { 2500 2255 background: rgba(0, 0, 0, 0.03); 2501 - } 2502 - 2503 - :root[data-theme="light"] .maep-peer-packet.packet-in { 2504 - background: rgba(102, 102, 102, 0.9); 2505 2256 } 2506 2257 2507 2258 :root[data-theme="light"] .site-footer { ··· 2619 2370 } 2620 2371 } 2621 2372 2622 - @keyframes maep-packet-out { 2623 - 0% { 2624 - left: 0%; 2625 - opacity: 0; 2626 - } 2627 - 14% { 2628 - opacity: 1; 2629 - } 2630 - 86% { 2631 - opacity: 1; 2632 - } 2633 - 100% { 2634 - left: 100%; 2635 - opacity: 0; 2636 - } 2637 - } 2638 - 2639 - @keyframes maep-packet-in { 2640 - 0% { 2641 - left: 100%; 2642 - opacity: 0; 2643 - } 2644 - 14% { 2645 - opacity: 1; 2646 - } 2647 - 86% { 2648 - opacity: 1; 2649 - } 2650 - 100% { 2651 - left: 0%; 2652 - opacity: 0; 2653 - } 2654 - } 2655 - 2656 2373 @keyframes bus-core-sweep { 2657 2374 0% { 2658 2375 left: -34%; ··· 2755 2472 } 2756 2473 2757 2474 .docs-layout-security, 2758 - .docs-layout-maep, 2759 2475 .docs-layout-bus { 2760 2476 grid-template-columns: 1fr; 2761 - } 2762 - 2763 - .maep-rules-layout { 2764 - grid-template-columns: 1fr; 2765 - gap: 0.58rem; 2766 2477 } 2767 2478 2768 2479 .bus-protocol-cloud { ··· 2802 2513 2803 2514 .security-chain-track::before { 2804 2515 display: none; 2805 - } 2806 - 2807 - .maep-exchange-map { 2808 - grid-template-columns: 1fr; 2809 - gap: 0.56rem; 2810 - } 2811 - 2812 - .maep-peer-row { 2813 - grid-template-columns: 1fr; 2814 - row-gap: 0.26rem; 2815 - } 2816 - 2817 - .maep-peer-wire { 2818 - display: none; 2819 - } 2820 - 2821 - .maep-protocol-list li { 2822 - gap: 0.24rem; 2823 2516 } 2824 2517 2825 2518 .bus-protocol-cloud {
+2 -2
theme/assets/js/main.js
··· 104 104 105 105 const inlineTokenize = (raw) => { 106 106 const tokenRe = 107 - /(--[a-z-]+|"(?:[^"\\]|\\.)*"|\b(?:read_file|contacts_send|web_search|bash|url_fetch|maep|agent)\b|\b\d+(?:\.\d+)?s\b|->)/gi; 107 + /(--[a-z-]+|"(?:[^"\\]|\\.)*"|\b(?:read_file|contacts_send|web_search|bash|url_fetch|agent)\b|\b\d+(?:\.\d+)?s\b|->)/gi; 108 108 let out = ""; 109 109 let last = 0; 110 110 ··· 150 150 let tagClass = "tok-tag"; 151 151 if (/guard/i.test(tag)) { 152 152 tagClass = "tok-tag-guard"; 153 - } else if (/(maep|agent)/i.test(tag)) { 153 + } else if (/agent/i.test(tag)) { 154 154 tagClass = "tok-tag-link"; 155 155 } else if (/result/i.test(tag)) { 156 156 tagClass = "tok-tag-result";
-64
theme/layouts/index.html
··· 187 187 </div> 188 188 </article> 189 189 </div> 190 - {{ else if eq .kind "maep" }} 191 - <div class="docs-layout docs-layout-maep"> 192 - <article class="track-card reveal maep-network-card"> 193 - <p class="card-eyebrow">{{ .sequence_title }}</p> 194 - <div class="maep-exchange-map"> 195 - <div class="maep-hub-node"> 196 - <span class="maep-hub-title">{{ .hub_label }}</span> 197 - </div> 198 - <div class="maep-peer-stack"> 199 - {{ if gt (len .agents) 0 }} 200 - {{ range .agents }} 201 - <article class="maep-peer-row"> 202 - <div class="maep-peer-wire" aria-hidden="true"> 203 - <span class="maep-peer-packet packet-out"></span> 204 - <span class="maep-peer-packet packet-in"></span> 205 - </div> 206 - <div class="maep-peer-bubble"> 207 - <span class="maep-peer-title">{{ .name }}</span> 208 - <p>{{ default "Peer Agent" .role }}</p> 209 - </div> 210 - </article> 211 - {{ end }} 212 - {{ else }} 213 - {{ range .sequence }} 214 - <article class="maep-peer-row"> 215 - <div class="maep-peer-wire" aria-hidden="true"> 216 - <span class="maep-peer-packet packet-out"></span> 217 - <span class="maep-peer-packet packet-in"></span> 218 - </div> 219 - <div class="maep-peer-bubble"> 220 - <span class="maep-peer-title">{{ .title }}</span> 221 - <p>{{ default "Peer Agent" .desc }}</p> 222 - </div> 223 - </article> 224 - {{ end }} 225 - {{ end }} 226 - </div> 227 - </div> 228 - </article> 229 - <article class="track-card reveal maep-rules-card"> 230 - <p class="card-eyebrow">{{ .points_title }}</p> 231 - <div class="maep-rules-layout"> 232 - <section class="maep-rules-group"> 233 - <p class="maep-rules-label">{{ default "Protocol" .protocol_block_title }}</p> 234 - <ul class="maep-protocol-list"> 235 - {{ range .sequence }} 236 - <li> 237 - <span class="maep-protocol-tag">[ {{ .title }} ]</span> 238 - <p>{{ .desc }}</p> 239 - </li> 240 - {{ end }} 241 - </ul> 242 - </section> 243 - <section class="maep-rules-group"> 244 - <p class="maep-rules-label">{{ default .points_title .constraints_block_title }}</p> 245 - <ul class="track-points maep-constraints-list"> 246 - {{ range .points }} 247 - <li>{{ . }}</li> 248 - {{ end }} 249 - </ul> 250 - </section> 251 - </div> 252 - </article> 253 - </div> 254 190 {{ else if eq .kind "bus" }} 255 191 <div class="docs-layout docs-layout-bus"> 256 192 <article class="track-card reveal bus-map-card">