skynet :: ingest apiv0.1

> Skynet 只定义接口,不抓取数据。把你的采集器指向下面的 endpoint, 使用 Authorization: Bearer <INGEST_TOKEN> 头即可持续推送。

所有端点接受 JSON,返回 { ok: true, inserted, skipped }。 通过 externalId / sha / date 等字段实现幂等。

00.

Endpoints

全部需要 Bearer Token

01.POST
Upsert colleagues
/api/ingest/colleague

同步公司同事目录。按 email(优先)或 id 去重。externalIds 用于后续跨源对应。

{
  "colleagues": [
    {
      "name": "李慕白",
      "email": "limubai@skynet.local",
      "department": "工程",
      "role": "高级工程师",
      "externalIds": { "wechat": "wx_limubai", "gitlab": "limubai" }
    }
  ]
}
02.POST
Ingest chat messages
/api/ingest/chat

支持 WECHAT / FEISHU / WECOM 三种来源。externalId 用于去重;同一条消息重复 POST 会被跳过。

{
  "source": "WECHAT",
  "messages": [
    {
      "author": { "email": "limubai@skynet.local" },
      "channel": "工程组",
      "externalId": "msg_001",
      "content": "今天把 infra 的告警梳理了一遍",
      "sentAt": "2026-04-07T09:32:00.000Z"
    }
  ]
}
03.POST
Ingest attendance
/api/ingest/attendance

按 (colleague, date) 唯一;重复 POST 会 upsert 同一天记录。

{
  "records": [
    {
      "colleague": { "email": "limubai@skynet.local" },
      "date": "2026-04-07T00:00:00.000Z",
      "checkIn": "2026-04-07T01:12:00.000Z",
      "checkOut": "2026-04-07T10:45:00.000Z",
      "status": "present",
      "durationMinutes": 573
    }
  ]
}
04.POST
Ingest commits
/api/ingest/gitlab

按 (repo, sha) 去重。支持 additions / deletions / filesChanged 等指标。

{
  "commits": [
    {
      "author": { "email": "limubai@skynet.local", "externalId": "limubai" },
      "repo": "group/core",
      "branch": "main",
      "sha": "abc123deadbeef",
      "message": "fix: tighten retry policy",
      "additions": 42,
      "deletions": 7,
      "filesChanged": 3,
      "committedAt": "2026-04-07T11:00:00.000Z",
      "url": "https://gitlab.example.com/group/core/-/commit/abc123"
    }
  ]
}
05.POST
Ingest Figma activity
/api/ingest/figma

记录设计师在 Figma 文件上的编辑、评论、创建、发布等动作。

{
  "activities": [
    {
      "author": { "email": "baixiaoyue@skynet.local" },
      "fileKey": "FILE_KEY_abc",
      "fileName": "Skynet 控制台 v2",
      "action": "edit",
      "externalId": "evt_001",
      "occurredAt": "2026-04-07T08:12:00.000Z"
    }
  ]
}
06.POST
Ingest meetings
/api/ingest/calendar

日程 / 会议事件。按 (colleagueId, externalId) 去重;role 可为 organizer / attendee / optional。recurrenceRule 支持 RFC 5545 RRULE 字符串。

{
  "meetings": [
    {
      "colleague": { "email": "limubai@skynet.local" },
      "title": "周会:Skynet v0.7 规划",
      "startAt": "2026-04-07T02:00:00.000Z",
      "endAt": "2026-04-07T03:00:00.000Z",
      "durationMinutes": 60,
      "location": "Zoom",
      "organizer": "zhouche@skynet.local",
      "role": "attendee",
      "attendees": ["limubai", "baixiaoyue", "zhouche"],
      "notes": "讨论本周进度与下周目标",
      "recurrenceRule": "FREQ=WEEKLY;BYDAY=MO",
      "externalId": "meet_001"
    }
  ]
}
07.POST
Ingest meeting AI summary (second pass)
/api/ingest/calendar

腾讯会议 / Zoom / 飞书会议等提供 AI 转录+总结时,在会议结束后 re-POST 同一个 externalId,只追加 aiSummary / actionItems / transcript 字段。服务端会原地合并,不创建新记录。

{
  "meetings": [
    {
      "colleague": { "email": "limubai@skynet.local" },
      "title": "周会:Skynet v0.7 规划",
      "startAt": "2026-04-07T02:00:00.000Z",
      "endAt": "2026-04-07T03:00:00.000Z",
      "externalId": "meet_001",
      "provider": "tencent-meeting",
      "transcriptUrl": "https://meeting.tencent.com/record/abc",
      "aiSummary": "复盘了上周的 incident,确认 Redis 重试策略需要加 jitter。下周由李慕白主导 runbook 更新...",
      "actionItems": [
        "李慕白: 起草 Redis 重试 runbook",
        "周彻: 对接上下游的灰度计划",
        "全体: 周三前提交告警整理"
      ],
      "participants": [
        { "name": "李慕白", "email": "limubai@skynet.local", "speakingMinutes": 18, "wordCount": 1200 },
        { "name": "周彻", "email": "zhouche@skynet.local", "speakingMinutes": 12, "wordCount": 780 }
      ]
    }
  ]
}
SKYNET // COLLEAGUE TWIN OS // v0.14PRESS ? FOR SHORTCUTS