@0xmaxma/claude-gateway 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +791 -0
  2. package/config.template.json +87 -0
  3. package/dist/agent/context-isolation.d.ts +28 -0
  4. package/dist/agent/context-isolation.d.ts.map +1 -0
  5. package/dist/agent/context-isolation.js +80 -0
  6. package/dist/agent/context-isolation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +211 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +1802 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/workspace-loader.d.ts +31 -0
  12. package/dist/agent/workspace-loader.d.ts.map +1 -0
  13. package/dist/agent/workspace-loader.js +207 -0
  14. package/dist/agent/workspace-loader.js.map +1 -0
  15. package/dist/api/auth.d.ts +25 -0
  16. package/dist/api/auth.d.ts.map +1 -0
  17. package/dist/api/auth.js +77 -0
  18. package/dist/api/auth.js.map +1 -0
  19. package/dist/api/cron-router.d.ts +22 -0
  20. package/dist/api/cron-router.d.ts.map +1 -0
  21. package/dist/api/cron-router.js +197 -0
  22. package/dist/api/cron-router.js.map +1 -0
  23. package/dist/api/gateway-router.d.ts +52 -0
  24. package/dist/api/gateway-router.d.ts.map +1 -0
  25. package/dist/api/gateway-router.js +215 -0
  26. package/dist/api/gateway-router.js.map +1 -0
  27. package/dist/api/router.d.ts +5 -0
  28. package/dist/api/router.d.ts.map +1 -0
  29. package/dist/api/router.js +1098 -0
  30. package/dist/api/router.js.map +1 -0
  31. package/dist/api/skills-router.d.ts +5 -0
  32. package/dist/api/skills-router.d.ts.map +1 -0
  33. package/dist/api/skills-router.js +424 -0
  34. package/dist/api/skills-router.js.map +1 -0
  35. package/dist/api/workspace-router.d.ts +4 -0
  36. package/dist/api/workspace-router.d.ts.map +1 -0
  37. package/dist/api/workspace-router.js +149 -0
  38. package/dist/api/workspace-router.js.map +1 -0
  39. package/dist/config/loader.d.ts +16 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +235 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/migrator.d.ts +70 -0
  44. package/dist/config/migrator.d.ts.map +1 -0
  45. package/dist/config/migrator.js +343 -0
  46. package/dist/config/migrator.js.map +1 -0
  47. package/dist/config/watcher.d.ts +30 -0
  48. package/dist/config/watcher.d.ts.map +1 -0
  49. package/dist/config/watcher.js +170 -0
  50. package/dist/config/watcher.js.map +1 -0
  51. package/dist/cron/manager.d.ts +48 -0
  52. package/dist/cron/manager.d.ts.map +1 -0
  53. package/dist/cron/manager.js +580 -0
  54. package/dist/cron/manager.js.map +1 -0
  55. package/dist/cron/scheduler.d.ts +50 -0
  56. package/dist/cron/scheduler.d.ts.map +1 -0
  57. package/dist/cron/scheduler.js +231 -0
  58. package/dist/cron/scheduler.js.map +1 -0
  59. package/dist/discord/receiver.d.ts +17 -0
  60. package/dist/discord/receiver.d.ts.map +1 -0
  61. package/dist/discord/receiver.js +108 -0
  62. package/dist/discord/receiver.js.map +1 -0
  63. package/dist/heartbeat/history.d.ts +24 -0
  64. package/dist/heartbeat/history.d.ts.map +1 -0
  65. package/dist/heartbeat/history.js +50 -0
  66. package/dist/heartbeat/history.js.map +1 -0
  67. package/dist/heartbeat/parser.d.ts +26 -0
  68. package/dist/heartbeat/parser.d.ts.map +1 -0
  69. package/dist/heartbeat/parser.js +283 -0
  70. package/dist/heartbeat/parser.js.map +1 -0
  71. package/dist/history/cleanup.d.ts +21 -0
  72. package/dist/history/cleanup.d.ts.map +1 -0
  73. package/dist/history/cleanup.js +171 -0
  74. package/dist/history/cleanup.js.map +1 -0
  75. package/dist/history/db.d.ts +27 -0
  76. package/dist/history/db.d.ts.map +1 -0
  77. package/dist/history/db.js +323 -0
  78. package/dist/history/db.js.map +1 -0
  79. package/dist/history/media-store.d.ts +27 -0
  80. package/dist/history/media-store.d.ts.map +1 -0
  81. package/dist/history/media-store.js +158 -0
  82. package/dist/history/media-store.js.map +1 -0
  83. package/dist/history/types.d.ts +62 -0
  84. package/dist/history/types.d.ts.map +1 -0
  85. package/dist/history/types.js +3 -0
  86. package/dist/history/types.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +483 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/logger.d.ts +3 -0
  92. package/dist/logger.d.ts.map +1 -0
  93. package/dist/logger.js +81 -0
  94. package/dist/logger.js.map +1 -0
  95. package/dist/memory/manager.d.ts +45 -0
  96. package/dist/memory/manager.d.ts.map +1 -0
  97. package/dist/memory/manager.js +178 -0
  98. package/dist/memory/manager.js.map +1 -0
  99. package/dist/session/compactor.d.ts +22 -0
  100. package/dist/session/compactor.d.ts.map +1 -0
  101. package/dist/session/compactor.js +151 -0
  102. package/dist/session/compactor.js.map +1 -0
  103. package/dist/session/process.d.ts +76 -0
  104. package/dist/session/process.d.ts.map +1 -0
  105. package/dist/session/process.js +729 -0
  106. package/dist/session/process.js.map +1 -0
  107. package/dist/session/store.d.ts +102 -0
  108. package/dist/session/store.d.ts.map +1 -0
  109. package/dist/session/store.js +533 -0
  110. package/dist/session/store.js.map +1 -0
  111. package/dist/skills/index.d.ts +9 -0
  112. package/dist/skills/index.d.ts.map +1 -0
  113. package/dist/skills/index.js +15 -0
  114. package/dist/skills/index.js.map +1 -0
  115. package/dist/skills/invoker.d.ts +16 -0
  116. package/dist/skills/invoker.d.ts.map +1 -0
  117. package/dist/skills/invoker.js +36 -0
  118. package/dist/skills/invoker.js.map +1 -0
  119. package/dist/skills/loader.d.ts +23 -0
  120. package/dist/skills/loader.d.ts.map +1 -0
  121. package/dist/skills/loader.js +183 -0
  122. package/dist/skills/loader.js.map +1 -0
  123. package/dist/skills/parser.d.ts +55 -0
  124. package/dist/skills/parser.d.ts.map +1 -0
  125. package/dist/skills/parser.js +178 -0
  126. package/dist/skills/parser.js.map +1 -0
  127. package/dist/skills/sync.d.ts +10 -0
  128. package/dist/skills/sync.d.ts.map +1 -0
  129. package/dist/skills/sync.js +130 -0
  130. package/dist/skills/sync.js.map +1 -0
  131. package/dist/skills/watcher.d.ts +16 -0
  132. package/dist/skills/watcher.d.ts.map +1 -0
  133. package/dist/skills/watcher.js +25 -0
  134. package/dist/skills/watcher.js.map +1 -0
  135. package/dist/telegram/markdown.d.ts +25 -0
  136. package/dist/telegram/markdown.d.ts.map +1 -0
  137. package/dist/telegram/markdown.js +237 -0
  138. package/dist/telegram/markdown.js.map +1 -0
  139. package/dist/telegram/receiver.d.ts +17 -0
  140. package/dist/telegram/receiver.d.ts.map +1 -0
  141. package/dist/telegram/receiver.js +104 -0
  142. package/dist/telegram/receiver.js.map +1 -0
  143. package/dist/types.d.ts +224 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +3 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/ui/web-ui.d.ts +6 -0
  148. package/dist/ui/web-ui.d.ts.map +1 -0
  149. package/dist/ui/web-ui.js +227 -0
  150. package/dist/ui/web-ui.js.map +1 -0
  151. package/dist/watch/factory.d.ts +26 -0
  152. package/dist/watch/factory.d.ts.map +1 -0
  153. package/dist/watch/factory.js +43 -0
  154. package/dist/watch/factory.js.map +1 -0
  155. package/dist/webhook/manager.d.ts +34 -0
  156. package/dist/webhook/manager.d.ts.map +1 -0
  157. package/dist/webhook/manager.js +120 -0
  158. package/dist/webhook/manager.js.map +1 -0
  159. package/mcp/bun.lock +264 -0
  160. package/mcp/channel-manager.ts +115 -0
  161. package/mcp/package.json +15 -0
  162. package/mcp/router.ts +69 -0
  163. package/mcp/server.ts +129 -0
  164. package/mcp/tools/agent/handlers.ts +578 -0
  165. package/mcp/tools/agent/module.ts +163 -0
  166. package/mcp/tools/browser/module.ts +321 -0
  167. package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
  168. package/mcp/tools/cron/client.ts +65 -0
  169. package/mcp/tools/cron/module.ts +158 -0
  170. package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
  171. package/mcp/tools/discord/access.ts +197 -0
  172. package/mcp/tools/discord/client.ts +31 -0
  173. package/mcp/tools/discord/commands.ts +48 -0
  174. package/mcp/tools/discord/inbound.ts +53 -0
  175. package/mcp/tools/discord/module.ts +442 -0
  176. package/mcp/tools/discord/outbound.ts +90 -0
  177. package/mcp/tools/discord/receiver-server.ts +58 -0
  178. package/mcp/tools/discord/skills/access/SKILL.md +86 -0
  179. package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
  180. package/mcp/tools/discord/threading.ts +37 -0
  181. package/mcp/tools/discord/types.ts +106 -0
  182. package/mcp/tools/skills/handlers.ts +196 -0
  183. package/mcp/tools/skills/module.ts +163 -0
  184. package/mcp/tools/telegram/module.ts +454 -0
  185. package/mcp/tools/telegram/pure.ts +224 -0
  186. package/mcp/tools/telegram/receiver-server.ts +1656 -0
  187. package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
  188. package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
  189. package/mcp/tools/telegram/typing.ts +327 -0
  190. package/mcp/types.ts +128 -0
  191. package/package.json +62 -0
  192. package/resource/claude_gateway.svg +112 -0
package/mcp/types.ts ADDED
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Shared types for the gateway multi-channel architecture.
3
+ * Adopts openclaw patterns: ChannelModule interface, ToolVisibility, Route Resolution.
4
+ */
5
+
6
+ export type ChannelId = string;
7
+
8
+ export type InboundMessage = {
9
+ channel: ChannelId;
10
+ accountId: string;
11
+ senderId: string;
12
+ chatId: string;
13
+ chatType: 'direct' | 'group' | 'channel';
14
+ text: string;
15
+ messageId: string;
16
+ replyToMessageId?: string;
17
+ threadId?: string;
18
+ attachmentFileId?: string;
19
+ ts: number;
20
+ };
21
+
22
+ export type OutboundMessage = {
23
+ channel: ChannelId;
24
+ accountId: string;
25
+ chatId: string;
26
+ text: string;
27
+ replyToMessageId?: string;
28
+ files?: string[];
29
+ format?: 'text' | 'html' | 'markdown';
30
+ };
31
+
32
+ export type ChannelCapabilities = {
33
+ typingIndicator: boolean;
34
+ reactions: boolean;
35
+ editMessage: boolean;
36
+ fileAttachment: boolean;
37
+ threadReply: boolean;
38
+ maxMessageLength: number;
39
+ markupFormat: 'html' | 'markdown' | 'none';
40
+ };
41
+
42
+ export type ChannelAccountSnapshot = {
43
+ accountId: string;
44
+ running: boolean;
45
+ configured: boolean;
46
+ lastMessageAt?: number;
47
+ lastError?: string;
48
+ };
49
+
50
+ export type McpToolDefinition = {
51
+ name: string;
52
+ description: string;
53
+ inputSchema: object;
54
+ };
55
+
56
+ export type McpToolResult = {
57
+ content: Array<{ type: 'text'; text: string }>;
58
+ isError?: boolean;
59
+ };
60
+
61
+ /**
62
+ * ToolVisibility: openclaw pattern
63
+ * "current-channel" — expose tools only when this channel is the origin
64
+ * "all-configured" — expose tools always (cross-channel sends, cron)
65
+ */
66
+ export type ToolVisibility = 'current-channel' | 'all-configured';
67
+
68
+ /** Chat channel module — receives and sends messages */
69
+ export interface ChannelModule {
70
+ id: ChannelId;
71
+ capabilities: ChannelCapabilities;
72
+ toolVisibility: ToolVisibility;
73
+
74
+ /** Check whether this module is configured and enabled */
75
+ isEnabled(): boolean;
76
+
77
+ /** MCP tools exposed by this module */
78
+ getTools(): McpToolDefinition[];
79
+
80
+ /** Execute a tool call */
81
+ handleTool(name: string, args: Record<string, unknown>): Promise<McpToolResult>;
82
+
83
+ /** Initialize bot client for tool calls (non-blocking) */
84
+ initBot?(): Promise<void>;
85
+
86
+ /** Start listening for inbound messages */
87
+ start(handler: InboundMessageHandler, signal: AbortSignal): Promise<void>;
88
+
89
+ /** Runtime status snapshot */
90
+ getSnapshot(): ChannelAccountSnapshot;
91
+
92
+ /** Skills directory path */
93
+ skillsDir?: string;
94
+ }
95
+
96
+ /** Tool-only module — no inbound messages (e.g. cron) */
97
+ export interface ToolModule {
98
+ id: string;
99
+ toolVisibility: ToolVisibility;
100
+ isEnabled(): boolean;
101
+ getTools(): McpToolDefinition[];
102
+ handleTool(name: string, args: Record<string, unknown>): Promise<McpToolResult>;
103
+ skillsDir?: string;
104
+ }
105
+
106
+ export type InboundMessageHandler = (msg: InboundMessage) => Promise<void>;
107
+
108
+ /** Route resolution result — openclaw ResolvedAgentRoute */
109
+ export type ResolvedRoute = {
110
+ agentId: string;
111
+ channel: ChannelId;
112
+ accountId: string;
113
+ sessionKey: string;
114
+ chatId: string;
115
+ chatType: 'direct' | 'group' | 'channel';
116
+ senderId: string;
117
+ };
118
+
119
+ /** Channel context injected into agent system prompt */
120
+ export type ChannelContext = {
121
+ origin: {
122
+ channel: ChannelId;
123
+ chatId: string;
124
+ senderId: string;
125
+ chatType: 'direct' | 'group' | 'channel';
126
+ };
127
+ configuredChannels: ChannelId[];
128
+ };
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@0xmaxma/claude-gateway",
3
+ "version": "1.0.0",
4
+ "description": "Multi-agent gateway for Claude",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/0xMaxMa/claude-gateway"
8
+ },
9
+ "main": "dist/index.js",
10
+ "bin": {
11
+ "claude-gateway": "./dist/index.js"
12
+ },
13
+ "engines": {
14
+ "node": ">=22"
15
+ },
16
+ "files": [
17
+ "dist/",
18
+ "resource/",
19
+ "mcp/",
20
+ "README.md",
21
+ "config.template.json"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "start": "node --no-warnings=ExperimentalWarning --env-file-if-exists=.env dist/index.js",
29
+ "test": "jest",
30
+ "test:unit": "jest --testPathPattern=unit",
31
+ "integration": "jest --testPathPattern=integration --testTimeout=15000",
32
+ "integration:ma": "jest --testPathPattern=multi-agent --testTimeout=15000",
33
+ "test:manual": "jest --testPathPattern=phase-manual --testTimeout=15000",
34
+ "integration:hb": "jest --testPathPattern=heartbeat-e2e --testTimeout=15000",
35
+ "integration:cs": "jest --testPathPattern=character-system --testTimeout=15000",
36
+ "typecheck": "tsc --noEmit"
37
+ },
38
+ "dependencies": {
39
+ "chokidar": "^3.5.0",
40
+ "cron-parser": "^5.5.0",
41
+ "express": "^4.18.0",
42
+ "js-yaml": "^4.1.0",
43
+ "lru-cache": "^10.0.0",
44
+ "node-cron": "^3.0.0",
45
+ "p-queue": "^6.6.2"
46
+ },
47
+ "devDependencies": {
48
+ "@types/express": "^4.17.0",
49
+ "@types/jest": "^29.0.0",
50
+ "@types/js-yaml": "^4.0.0",
51
+ "@types/node": "^22.19.18",
52
+ "@types/node-cron": "^3.0.0",
53
+ "@types/supertest": "^7.2.0",
54
+ "@types/tmp": "^0.2.0",
55
+ "jest": "^29.0.0",
56
+ "supertest": "^7.2.2",
57
+ "tmp": "^0.2.0",
58
+ "ts-jest": "^29.0.0",
59
+ "ts-node": "^10.9.2",
60
+ "typescript": "^5.0.0"
61
+ }
62
+ }
@@ -0,0 +1,112 @@
1
+ <svg width="100%" viewBox="0 0 680 490" xmlns="http://www.w3.org/2000/svg" role="img">
2
+ <title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Claude pixel art with small claw on terminal</title>
3
+ <desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">A pixelated orange Claude character with a small open claw arm on the right side, on a black terminal background with green command text.</desc>
4
+
5
+ <defs>
6
+ <pattern id="scanlines" x="0" y="0" width="4" height="4" patternUnits="userSpaceOnUse">
7
+ <rect x="0" y="0" width="4" height="2" fill="#000000"/>
8
+ <rect x="0" y="2" width="4" height="2" fill="#0A0E0C"/>
9
+ </pattern>
10
+ </defs>
11
+
12
+ <!-- Terminal background -->
13
+ <rect x="0" y="0" width="680" height="480" fill="#05080A" style="fill:rgb(5, 8, 10);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
14
+ <rect x="0" y="0" width="680" height="480" fill="url(#scanlines)" opacity="0.35" style="stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.35;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
15
+
16
+ <!-- Terminal text -->
17
+ <text x="20" y="36" font-family="Courier, 'Courier New', monospace" font-size="16" fill="#33FF66" font-weight="bold" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Courier, &quot;Courier New&quot;, monospace;font-size:16px;font-weight:700;text-anchor:start;dominant-baseline:auto">$ claude-gateway</text>
18
+ <text x="20" y="60" font-family="Courier, 'Courier New', monospace" font-size="16" fill="#33FF66" font-weight="bold" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Courier, &quot;Courier New&quot;, monospace;font-size:16px;font-weight:700;text-anchor:start;dominant-baseline:auto">make create-agent</text>
19
+
20
+ <!-- Blinking cursor after make create-agent -->
21
+ <rect x="194" y="46" width="10" height="16" fill="#33FF66" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4556;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
22
+ <animate attributeName="opacity" values="1;1;0;0" dur="1s" repeatCount="indefinite" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
23
+ </rect>
24
+
25
+ <!-- ================= CHARACTER =================
26
+ Grid: 8 cols × 8 rows, 28px per pixel, origin (180, 200) -->
27
+
28
+ <!-- Head (narrower top, cols 1-6, rows 0-1) -->
29
+ <rect x="208" y="200" width="168" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
30
+
31
+ <!-- Body (wider, cols 0-7, rows 2-5) -->
32
+ <rect x="180" y="256" width="224" height="112" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
33
+
34
+ <!-- 4 legs (cols 0, 2, 5, 7 @ rows 6-7) -->
35
+ <rect x="180" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
36
+ <rect x="236" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
37
+ <rect x="320" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
38
+ <rect x="376" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
39
+
40
+ <!-- Eyes (tall vertical rectangles) -->
41
+ <rect x="236" y="284" width="28" height="56" fill="#1F1512" style="fill:rgb(31, 21, 18);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
42
+ <rect x="320" y="284" width="28" height="56" fill="#1F1512" style="fill:rgb(31, 21, 18);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
43
+ <rect x="240" y="288" width="6" height="6" fill="#4A3A32" style="fill:rgb(74, 58, 50);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
44
+ <rect x="324" y="288" width="6" height="6" fill="#4A3A32" style="fill:rgb(74, 58, 50);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
45
+
46
+ <!-- ================= SMALL OPEN CLAW =================
47
+ Attached to right shoulder, going up-right -->
48
+
49
+ <!-- Arm (col 8, row 1) -->
50
+ <rect x="404" y="228" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
51
+ <!-- Wrist (col 9, row 0) -->
52
+ <rect x="432" y="200" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
53
+ <!-- Palm (row -1, cols 8-10) -->
54
+ <rect x="404" y="172" width="84" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
55
+ <!-- Left pincer tip (col 8, row -2) -->
56
+ <rect x="404" y="144" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
57
+ <!-- Right pincer tip (col 10, row -2) -->
58
+ <rect x="460" y="144" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
59
+
60
+ <!-- ================= HIGHLIGHTS (top edges) ================= -->
61
+ <rect x="208" y="200" width="168" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
62
+ <rect x="180" y="256" width="28" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
63
+ <rect x="376" y="256" width="28" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
64
+ <rect x="180" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
65
+ <rect x="236" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
66
+ <rect x="320" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
67
+ <rect x="376" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
68
+ <rect x="404" y="144" width="28" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
69
+ <rect x="460" y="144" width="28" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
70
+ <rect x="404" y="172" width="84" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
71
+ <rect x="404" y="228" width="28" height="4" fill="#FFAE66" opacity="0.75" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.75;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
72
+
73
+ <!-- Left edges (subtle light highlight) -->
74
+ <rect x="208" y="200" width="4" height="56" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
75
+ <rect x="180" y="256" width="4" height="112" fill="#FFAE66" opacity="0.45" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.45;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
76
+ <rect x="180" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
77
+ <rect x="236" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
78
+ <rect x="320" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
79
+ <rect x="376" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
80
+ <rect x="404" y="144" width="4" height="28" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
81
+ <rect x="460" y="144" width="4" height="28" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
82
+ <rect x="404" y="172" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
83
+ <rect x="432" y="200" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
84
+ <rect x="404" y="228" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
85
+
86
+ <!-- ================= SHADOWS (right + bottom edges) ================= -->
87
+ <rect x="372" y="200" width="4" height="56" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
88
+ <rect x="400" y="256" width="4" height="112" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
89
+ <rect x="204" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
90
+ <rect x="260" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
91
+ <rect x="344" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
92
+ <rect x="400" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
93
+ <rect x="428" y="144" width="4" height="28" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
94
+ <rect x="484" y="144" width="4" height="28" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
95
+ <rect x="484" y="172" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
96
+ <rect x="456" y="200" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
97
+ <rect x="428" y="228" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
98
+
99
+ <!-- Bottom leg shadows -->
100
+ <rect x="180" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
101
+ <rect x="236" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
102
+ <rect x="320" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
103
+ <rect x="376" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
104
+
105
+ <!-- Belly underside shadow (between legs) -->
106
+ <rect x="208" y="364" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
107
+ <rect x="264" y="364" width="56" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
108
+ <rect x="348" y="364" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
109
+
110
+ <!-- Dark accent in the claw mouth gap -->
111
+ <rect x="432" y="168" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
112
+ </svg>