[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73GPBKX92XGJ74YM3J3Z56Q":3,"skill-same:01M73GPBKX92XGJ74YM3J3Z56Q":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M73GPBKX92XGJ74YM3J3Z56Q","websocket-protocol-codegen",null,"Horonomos-laps\u002FYana-AI","Horonomos-laps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F355299122?v=4","01M76B3QPXE88ET2SQPDPVATZT"," Horonomos-laps","01M72ZQRJPCYPSSWT4D00VJR2A",13,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fwebsocket-protocol-codegen\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: websocket-protocol-codegen\ndescription: Low-level WebSocket protocol implementation patterns and code generation for network data structures. Frame parsing, ping\u002Fpong keepalive, binary protocol codegen from schema, and bandwidth-optimized message design. Sources: warmcat\u002Flibwebsockets (MIT).\norigin: yana-ai — synthesized from warmcat\u002Flibwebsockets (MIT), RFC 6455 WebSocket spec\nlicense: Apache-2.0\nversion: 1.0.0\ncompatibility: yana-ai >= 1.3.49\n---\n\n# \u002Fwebsocket-protocol-codegen\n\n## When to Use\n\n- Design binary WebSocket protocol frames for inter-agent communication\n- Code-generate message serialization\u002Fdeserialization from a schema definition\n- Implement keepalive, reconnect, and framing logic for custom agent transport\n- Bandwidth optimization: pack multiple agent events into binary frames\n\n## Do NOT use for\n\n- Simple JSON-over-WebSocket apps (use ws\u002FSocket.IO directly)\n- High-level Pub\u002FSub (use [[wamp-pubsub-patterns]])\n\n---\n\n## RFC 6455 frame layout (reference)\n\n```\n 0                   1                   2                   3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-------+-+-------------+-------------------------------+\n|F|R|R|R| opcode|M| Payload len |    Extended payload length    |\n|I|S|S|S|  (4)  |A|     (7)    |             (16\u002F64)           |\n|N|V|V|V|       |S|             |   (if payload len==126\u002F127)   |\n| |1|2|3|       |K|             |                               |\n+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - -+\nOpcodes: 0x0 continuation, 0x1 text, 0x2 binary, 0x8 close, 0x9 ping, 0xA pong\n```\n\n---\n\n## Binary protocol schema → codegen\n\n```typescript\n\u002F\u002F Protocol definition\ninterface AgentFrame {\n  version:   1               \u002F\u002F 1 byte\n  opcode:    FrameOp         \u002F\u002F 1 byte: 0x01=task, 0x02=ack, 0x03=heartbeat\n  agentId:   string          \u002F\u002F 8 bytes (truncated SHA256)\n  sequence:  number          \u002F\u002F 4 bytes uint32\n  payload:   Buffer          \u002F\u002F variable\n}\n\nenum FrameOp { TASK = 0x01, ACK = 0x02, HEARTBEAT = 0x03 }\n\n\u002F\u002F Encoder\nfunction encodeFrame(frame: AgentFrame): Buffer {\n  const idBytes  = Buffer.from(frame.agentId.slice(0, 8).padEnd(8, '\\0'))\n  const header   = Buffer.allocUnsafe(14)\n  header.writeUInt8(frame.version,  0)\n  header.writeUInt8(frame.opcode,   1)\n  idBytes.copy(header, 2)\n  header.writeUInt32BE(frame.sequence, 10)\n  return Buffer.concat([header, frame.payload])\n}\n\n\u002F\u002F Decoder\nfunction decodeFrame(buf: Buffer): AgentFrame {\n  return {\n    version:  buf.readUInt8(0),\n    opcode:   buf.readUInt8(1) as FrameOp,\n    agentId:  buf.slice(2, 10).toString('utf8').replace(\u002F\\0\u002Fg, ''),\n    sequence: buf.readUInt32BE(10),\n    payload:  buf.slice(14),\n  }\n}\n```\n\n---\n\n## WebSocket server with ping\u002Fpong keepalive\n\n```javascript\nimport { WebSocketServer } from 'ws'\n\nconst wss = new WebSocketServer({ port: 8080 })\nconst PING_INTERVAL  = 30_000  \u002F\u002F 30s\nconst PONG_TIMEOUT   = 10_000  \u002F\u002F close if no pong within 10s\n\nwss.on('connection', (ws) => {\n  let alive = true\n  ws.on('pong', () => { alive = true })\n\n  const keepalive = setInterval(() => {\n    if (!alive) { ws.terminate(); return }\n    alive = false\n    ws.ping()\n  }, PING_INTERVAL)\n\n  ws.on('close', () => clearInterval(keepalive))\n\n  ws.on('message', (data: Buffer) => {\n    const frame = decodeFrame(data)\n    if (frame.opcode === FrameOp.TASK) {\n      \u002F\u002F handle task\n      ws.send(encodeFrame({ ...frame, opcode: FrameOp.ACK, payload: Buffer.alloc(0) }))\n    }\n  })\n})\n```\n\n---\n\n## Auto-generate protocol serializer from field schema\n\n```typescript\n\u002F\u002F Schema-driven codegen: fields → encode\u002Fdecode functions\nfunction generateSerializer(schema: { name: string; type: 'uint8'|'uint32'|'bytes8'|'string' }[]) {\n  let offset = 0\n  const encodeLines: string[] = []\n  const decodeLines: string[] = []\n\n  for (const field of schema) {\n    switch (field.type) {\n      case 'uint8':\n        encodeLines.push(`buf.writeUInt8(obj.${field.name}, ${offset})`)\n        decodeLines.push(`${field.name}: buf.readUInt8(${offset})`)\n        offset += 1; break\n      case 'uint32':\n        encodeLines.push(`buf.writeUInt32BE(obj.${field.name}, ${offset})`)\n        decodeLines.push(`${field.name}: buf.readUInt32BE(${offset})`)\n        offset += 4; break\n      case 'bytes8':\n        encodeLines.push(`Buffer.from(obj.${field.name}).copy(buf, ${offset})`)\n        decodeLines.push(`${field.name}: buf.slice(${offset}, ${offset + 8}).toString()`)\n        offset += 8; break\n    }\n  }\n\n  return {\n    encode: new Function('obj', `const buf = Buffer.allocUnsafe(${offset}); ${encodeLines.join('; ')}; return buf`),\n    decode: new Function('buf', `return { ${decodeLines.join(', ')} }`),\n  }\n}\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ ws.ping() without checking ws.readyState === OPEN → throws on closed socket\n❌ Buffer.allocUnsafe without filling → uninitialized memory in frames (security issue)\n❌ No ping\u002Fpong → zombie connections consume server memory indefinitely\n❌ Binary frames with no version byte → impossible to add fields without breaking old clients\n❌ Frame sequence number overflow at uint32 max → not handled → sequence resets silently\n❌ String fields without length prefix → variable-length strings corrupt fixed-offset decoder\n```\n","# \u002Fwebsocket-protocol-codegen\n\n## When to Use\n\n- Design binary WebSocket protocol frames for inter-agent communication\n- Code-generate message serialization\u002Fdeserialization from a schema definition\n- Implement keepalive, reconnect, and framing logic for custom agent transport\n- Bandwidth optimization: pack multiple agent events into binary frames\n\n## Do NOT use for\n\n- Simple JSON-over-WebSocket apps (use ws\u002FSocket.IO directly)\n- High-level Pub\u002FSub (use [[wamp-pubsub-patterns]])\n\n---\n\n## RFC 6455 frame layout (reference)\n\n```\n 0                   1                   2                   3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-------+-+-------------+-------------------------------+\n|F|R|R|R| opcode|M| Payload len |    Extended payload length    |\n|I|S|S|S|  (4)  |A|     (7)    |             (16\u002F64)           |\n|N|V|V|V|       |S|             |   (if payload len==126\u002F127)   |\n| |1|2|3|       |K|             |                               |\n+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - -+\nOpcodes: 0x0 continuation, 0x1 text, 0x2 binary, 0x8 close, 0x9 ping, 0xA pong\n```\n\n---\n\n## Binary protocol schema → codegen\n\n```typescript\n\u002F\u002F Protocol definition\ninterface AgentFrame {\n  version:   1               \u002F\u002F 1 byte\n  opcode:    FrameOp         \u002F\u002F 1 byte: 0x01=task, 0x02=ack, 0x03=heartbeat\n  agentId:   string          \u002F\u002F 8 bytes (truncated SHA256)\n  sequence:  number          \u002F\u002F 4 bytes uint32\n  payload:   Buffer          \u002F\u002F variable\n}\n\nenum FrameOp { TASK = 0x01, ACK = 0x02, HEARTBEAT = 0x03 }\n\n\u002F\u002F Encoder\nfunction encodeFrame(frame: AgentFrame): Buffer {\n  const idBytes  = Buffer.from(frame.agentId.slice(0, 8).padEnd(8, '\\0'))\n  const header   = Buffer.allocUnsafe(14)\n  header.writeUInt8(frame.version,  0)\n  header.writeUInt8(frame.opcode,   1)\n  idBytes.copy(header, 2)\n  header.writeUInt32BE(frame.sequence, 10)\n  return Buffer.concat([header, frame.payload])\n}\n\n\u002F\u002F Decoder\nfunction decodeFrame(buf: Buffer): AgentFrame {\n  return {\n    version:  buf.readUInt8(0),\n    opcode:   buf.readUInt8(1) as FrameOp,\n    agentId:  buf.slice(2, 10).toString('utf8').replace(\u002F\\0\u002Fg, ''),\n    sequence: buf.readUInt32BE(10),\n    payload:  buf.slice(14),\n  }\n}\n```\n\n---\n\n## WebSocket server with ping\u002Fpong keepalive\n\n```javascript\nimport { WebSocketServer } from 'ws'\n\nconst wss = new WebSocketServer({ port: 8080 })\nconst PING_INTERVAL  = 30_000  \u002F\u002F 30s\nconst PONG_TIMEOUT   = 10_000  \u002F\u002F close if no pong within 10s\n\nwss.on('connection', (ws) => {\n  let alive = true\n  ws.on('pong', () => { alive = true })\n\n  const keepalive = setInterval(() => {\n    if (!alive) { ws.terminate(); return }\n    alive = false\n    ws.ping()\n  }, PING_INTERVAL)\n\n  ws.on('close', () => clearInterval(keepalive))\n\n  ws.on('message', (data: Buffer) => {\n    const frame = decodeFrame(data)\n    if (frame.opcode === FrameOp.TASK) {\n      \u002F\u002F handle task\n      ws.send(encodeFrame({ ...frame, opcode: FrameOp.ACK, payload: Buffer.alloc(0) }))\n    }\n  })\n})\n```\n\n---\n\n## Auto-generate protocol serializer from field schema\n\n```typescript\n\u002F\u002F Schema-driven codegen: fields → encode\u002Fdecode functions\nfunction generateSerializer(schema: { name: string; type: 'uint8'|'uint32'|'bytes8'|'string' }[]) {\n  let offset = 0\n  const encodeLines: string[] = []\n  const decodeLines: string[] = []\n\n  for (const field of schema) {\n    switch (field.type) {\n      case 'uint8':\n        encodeLines.push(`buf.writeUInt8(obj.${field.name}, ${offset})`)\n        decodeLines.push(`${field.name}: buf.readUInt8(${offset})`)\n        offset += 1; break\n      case 'uint32':\n        encodeLines.push(`buf.writeUInt32BE(obj.${field.name}, ${offset})`)\n        decodeLines.push(`${field.name}: buf.readUInt32BE(${offset})`)\n        offset += 4; break\n      case 'bytes8':\n        encodeLines.push(`Buffer.from(obj.${field.name}).copy(buf, ${offset})`)\n        decodeLines.push(`${field.name}: buf.slice(${offset}, ${offset + 8}).toString()`)\n        offset += 8; break\n    }\n  }\n\n  return {\n    encode: new Function('obj', `const buf = Buffer.allocUnsafe(${offset}); ${encodeLines.join('; ')}; return buf`),\n    decode: new Function('buf', `return { ${decodeLines.join(', ')} }`),\n  }\n}\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ ws.ping() without checking ws.readyState === OPEN → throws on closed socket\n❌ Buffer.allocUnsafe without filling → uninitialized memory in frames (security issue)\n❌ No ping\u002Fpong → zombie connections consume server memory indefinitely\n❌ Binary frames with no version byte → impossible to add fields without breaking old clients\n❌ Frame sequence number overflow at uint32 max → not handled → sequence resets silently\n❌ String fields without length prefix → variable-length strings corrupt fixed-offset decoder\n```\n",{},"main","481dcd7dd2e288b9d627a2bd017db70e64e6c6fa","core\u002Fskills\u002Fwebsocket-protocol-codegen",2,"https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI","https:\u002F\u002Fyana.vutam.link\u002F","https:\u002F\u002Fgithub.com\u002FHoronomos-laps","https:\u002F\u002Fyana.vutam.link","An open-source governed runtime & execution environment for multi-agent AI systems.","2026-11-14 13:24:09",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add Horonomos-laps\u002FYana-AI --skill websocket-protocol-codegen",{"tool":39,"command":40},"bunx","bunx skills add Horonomos-laps\u002FYana-AI --skill websocket-protocol-codegen",{"tool":42,"command":43},"pnpm","pnpm dlx skills add Horonomos-laps\u002FYana-AI --skill websocket-protocol-codegen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fwebsocket-protocol-codegen\u002FSKILL.md",true,[],[48,56,63,71,79,87],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":52,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":18},"01M735GKET5YVYKAY62W2P5YXB","openai--sentry--sentry","Use when the user asks to inspect Sentry issues or events, summarize recent production errors, or pull basic Sentry health data via the Sentry API; perform read-only queries with the bundled script and require `SENTRY_AUTH_TOKEN`.","MIT","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fopenai--sentry--sentry\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":18},"01M73DCAP83T17HY7SMGK7MGFE","ito-basket-compare","Compare Itô prediction-market baskets against a user's knowledge base, portfolio notes, financial context, watchlist, or research thesis. Use for read-only basket comparison and gap analysis without investment advice or live trading.","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fito-basket-compare\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":67,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":18},"01M734CYEMZFDR3KH6SW0JP8TD","implementing-network-traffic-baselining","Build network traffic baselines from NetFlow\u002FIPFIX data using Python pandas for statistical analysis, z-score anomaly detection, and hourly\u002Fdaily traffic pattern profiling","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":75,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":18},"01M73ASZ6NJRJM44Z2P84NGQ3Q","detecting-evasion-techniques-in-endpoint-logs","Detects defense evasion techniques used by adversaries in endpoint logs including log tampering, timestomping, process injection, and security tool disabling. Use when investigating suspicious endpoint behavior, building detection rules for evasion tactics, or conducting threat hunting for stealthy adversary activity. Activates for requests involving evasion detection, defense evasion analysis, log tampering detection, or MITRE ATT&CK TA0005.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":18},"01M734AFNXD06Z78QRK0VKGT7Q","implementing-microsegmentation-with-guardicore","Implementing microsegmentation using Akamai Guardicore Segmentation to map application dependencies, create granular network policies, visualize east-west traffic flows, and enforce least-privilege communication between workloads across data centers and cloud.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":18},"01M736TK27QMCXK0DVCH25SJN5","ramdisk-tmpfs-patterns","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Framdisk-tmpfs-patterns\u002FSKILL.md",[],[]]