antenna-openclaw-plugin 1.3.8 → 1.3.9
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.
- package/index.ts +1 -1
- package/openclaw.plugin.json +2 -2
- package/package.json +6 -4
- package/skills/antenna/EVENTS.md +163 -0
- package/skills/antenna/SKILL.md +32 -155
package/index.ts
CHANGED
|
@@ -56,7 +56,7 @@ function getConfig(api: any): AntennaConfig {
|
|
|
56
56
|
supabaseUrl: cfg.supabaseUrl || BUILTIN_SUPABASE_URL,
|
|
57
57
|
supabaseKey: cfg.supabaseKey || BUILTIN_SUPABASE_ANON_KEY,
|
|
58
58
|
defaultRadiusM: cfg.defaultRadiusM ?? 500,
|
|
59
|
-
matchExpiryHours: cfg.matchExpiryHours ??
|
|
59
|
+
matchExpiryHours: cfg.matchExpiryHours ?? 168,
|
|
60
60
|
maxMatches: cfg.maxMatches ?? 5,
|
|
61
61
|
autoScanOnLocation: cfg.autoScanOnLocation ?? true,
|
|
62
62
|
};
|
package/openclaw.plugin.json
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
},
|
|
24
24
|
"matchExpiryHours": {
|
|
25
25
|
"type": "number",
|
|
26
|
-
"description": "Hours before
|
|
27
|
-
"default":
|
|
26
|
+
"description": "Hours before match visibility decays (time decay model)",
|
|
27
|
+
"default": 168
|
|
28
28
|
},
|
|
29
29
|
"maxMatches": {
|
|
30
30
|
"type": "number",
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "antenna-openclaw-plugin",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "Antenna
|
|
3
|
+
"version": "1.3.9",
|
|
4
|
+
"description": "Antenna \u2014 agent-mediated nearby people discovery for OpenClaw",
|
|
5
5
|
"openclaw": {
|
|
6
|
-
"extensions": [
|
|
6
|
+
"extensions": [
|
|
7
|
+
"./index.ts"
|
|
8
|
+
]
|
|
7
9
|
},
|
|
8
10
|
"dependencies": {
|
|
9
11
|
"@supabase/supabase-js": "^2.49.0"
|
|
10
12
|
}
|
|
11
|
-
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: antenna-events
|
|
3
|
+
description: "Event management for Antenna. Use when a user wants to create, join, scan, or manage events. Handles event creation, participant management, check-in, approval workflows, and event messaging."
|
|
4
|
+
metadata: { "openclaw": { "always": false } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Antenna Events
|
|
8
|
+
|
|
9
|
+
Event tools for location-based social discovery. Events let organizers gather people, manage participants, and facilitate connections.
|
|
10
|
+
|
|
11
|
+
**Requires:** The core Antenna skill (antenna_scan, antenna_profile, etc.) must also be available. Events build on top of the core profile and matching system.
|
|
12
|
+
|
|
13
|
+
## Event Tools
|
|
14
|
+
|
|
15
|
+
### `antenna_event_create`
|
|
16
|
+
Create an event. Returns a shareable link (antenna.fyi/events/CODE).
|
|
17
|
+
- `name`: event name (required)
|
|
18
|
+
- `sender_id`, `channel`: from context (required)
|
|
19
|
+
- `chat_id`: REQUIRED for notifications
|
|
20
|
+
- `starts_at`, `ends_at`: ISO time strings (required - no default, must be provided)
|
|
21
|
+
- `lat`, `lng`: optional event location (needed for GPS check-in)
|
|
22
|
+
- `description`: optional event description
|
|
23
|
+
- `og_image`: optional OG image URL for social sharing preview
|
|
24
|
+
- `requires_approval`: boolean, default false. If true, participants need organizer approval.
|
|
25
|
+
- `screening_questions`: string array. Questions for applicants.
|
|
26
|
+
|
|
27
|
+
**When the user mentions "审批" / "approval" / "筛选" / "报名表"**, set `requires_approval: true` and ask what questions they want to screen with.
|
|
28
|
+
|
|
29
|
+
**GPS flow for events:** If the user doesn't provide coordinates, generate a bind link (`antenna_bind`) and ask them to open it at the event location. Once GPS comes in, use those coordinates for the event's `lat`/`lng` — do NOT treat this as the user's personal location. The bind link GPS for event creation goes to the event, not the user's profile. Only use `antenna_checkin` when the user wants to update their own location.
|
|
30
|
+
|
|
31
|
+
### `antenna_event_end`
|
|
32
|
+
End an event. Only the creator can end it.
|
|
33
|
+
- `code`: event code
|
|
34
|
+
- `sender_id`, `channel`: from context
|
|
35
|
+
- `chat_id`: REQUIRED for notifications
|
|
36
|
+
|
|
37
|
+
### `antenna_event_join`
|
|
38
|
+
Join an event by code. Auto-checks in if event has started and you're within 1km.
|
|
39
|
+
- `code`: from the event URL (antenna.fyi/events/CODE)
|
|
40
|
+
- `sender_id`, `channel`: from context
|
|
41
|
+
- `chat_id`: REQUIRED for notifications
|
|
42
|
+
- `lat`, `lng`: optional GPS coordinates (for auto-checkin)
|
|
43
|
+
- **Requires a profile** — users without a profile will be told to create one first.
|
|
44
|
+
|
|
45
|
+
### `antenna_event_scan`
|
|
46
|
+
Scan people in an event. No distance limit — returns all participants.
|
|
47
|
+
- `code`: event code
|
|
48
|
+
- `sender_id`, `channel`: from context
|
|
49
|
+
- `chat_id`: REQUIRED for notifications
|
|
50
|
+
- Returns profiles with `source: "event"` tag
|
|
51
|
+
|
|
52
|
+
### `antenna_event_checkin`
|
|
53
|
+
Check in at an event — marks you as present at the event location. Optionally updates GPS.
|
|
54
|
+
- `code`: event code
|
|
55
|
+
- `sender_id`, `channel`: from context
|
|
56
|
+
- `chat_id`: REQUIRED for notifications
|
|
57
|
+
- `lat`, `lng`: optional GPS coordinates
|
|
58
|
+
- **Event must have started** (`starts_at <= now`). Cannot check in before start time.
|
|
59
|
+
- **Must be within 1km** of event location.
|
|
60
|
+
- **Must have `status: active`** (approved participants only, not pending).
|
|
61
|
+
- **Check-in is automatic on join.** Only call this manually if the user explicitly asks to check in. Do not prompt the user about check-in.
|
|
62
|
+
|
|
63
|
+
### `antenna_event_upload_image`
|
|
64
|
+
Upload an image for an event OG preview. Returns a public URL.
|
|
65
|
+
- `image_base64`: base64-encoded image data
|
|
66
|
+
- `content_type`: MIME type (default image/png)
|
|
67
|
+
- `event_code`: event code
|
|
68
|
+
|
|
69
|
+
### `antenna_event_update`
|
|
70
|
+
Update event info. Only creator or co-host can update.
|
|
71
|
+
- `code`: event code
|
|
72
|
+
- `sender_id`, `channel`: from context
|
|
73
|
+
- `chat_id`: REQUIRED for notifications
|
|
74
|
+
- `name`, `description`, `og_image`, `lat`, `lng`, `starts_at`, `ends_at`: all optional for update (only provided fields change, others stay as-is)
|
|
75
|
+
- `requires_approval`: optional boolean — enable/disable approval requirement
|
|
76
|
+
- `screening_questions`: optional string array — update screening questions
|
|
77
|
+
|
|
78
|
+
### `antenna_event_approve`
|
|
79
|
+
Approve a pending participant. Only creator or co-host.
|
|
80
|
+
- `code`: event code
|
|
81
|
+
- `sender_id`, `channel`: from context
|
|
82
|
+
- `chat_id`: REQUIRED for notifications
|
|
83
|
+
- `ref`: participant ref number from scan
|
|
84
|
+
|
|
85
|
+
### `antenna_event_reject`
|
|
86
|
+
Reject a pending participant. Only creator or co-host.
|
|
87
|
+
- `code`: event code
|
|
88
|
+
- `sender_id`, `channel`: from context
|
|
89
|
+
- `chat_id`: REQUIRED for notifications
|
|
90
|
+
- `ref`: participant ref number from scan
|
|
91
|
+
|
|
92
|
+
### `antenna_event_add_host`
|
|
93
|
+
Add a co-host to the event. Only creator can add.
|
|
94
|
+
- `code`: event code
|
|
95
|
+
- `sender_id`, `channel`: from context
|
|
96
|
+
- `chat_id`: REQUIRED for notifications
|
|
97
|
+
- `ref`: participant ref number to promote to co-host
|
|
98
|
+
|
|
99
|
+
### `antenna_event_message`
|
|
100
|
+
Send a message to event participants. Only creator or co-host can send.
|
|
101
|
+
- `code`: event code
|
|
102
|
+
- `sender_id`, `channel`: from context
|
|
103
|
+
- `chat_id`: REQUIRED for notifications
|
|
104
|
+
- `message`: the message text
|
|
105
|
+
- `ref`: optional — ref number of specific participant. Omit to broadcast to all active participants.
|
|
106
|
+
- Use when the host needs to notify participants about logistics, changes, or requests (e.g. "please share your WeChat in your profile").
|
|
107
|
+
- One-way: participants receive the message but cannot reply through this channel.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Event Behavior Guide
|
|
112
|
+
|
|
113
|
+
> This section is the single source of truth for event behavior. Tool descriptions above define parameters; this section defines agent behavior.
|
|
114
|
+
|
|
115
|
+
### Creating an event
|
|
116
|
+
Collect info through conversation (ask one by one, don't dump all at once):
|
|
117
|
+
1. **Event name** (required) — "活动叫什么名字?"
|
|
118
|
+
2. **Description** — "简单描述一下这个活动?"
|
|
119
|
+
3. **Time** (required) — "什么时候开始?大概多长?" (convert to `starts_at` / `ends_at` ISO strings. **Must provide both — no defaults.**)
|
|
120
|
+
4. **Location** — "活动在哪里?" If user gives an address, geocode it. If vague, generate a bind link after creation.
|
|
121
|
+
5. **Approval** — "需要审批参与者吗?" If yes:
|
|
122
|
+
6. **Screening questions** — "你想问报名者什么问题?" Collect as a list.
|
|
123
|
+
|
|
124
|
+
Then call `antenna_event_create` with all collected info.
|
|
125
|
+
If no GPS, call `antenna_bind(purpose="event", event_code=CODE)` and send the link.
|
|
126
|
+
Share the event URL with the user.
|
|
127
|
+
|
|
128
|
+
### Joining an event
|
|
129
|
+
1. Extract the code from `antenna.fyi/events/CODE`
|
|
130
|
+
2. Call `antenna_event_join(code)` — this checks everything:
|
|
131
|
+
- If no profile → "Create a profile first"
|
|
132
|
+
- If event requires approval and no `application_context` provided → returns `needs_screening: true` + `screening_questions`
|
|
133
|
+
- If screening questions returned: **ask the user each question**, collect answers, then call `antenna_event_join(code, application_context="answers")` again
|
|
134
|
+
- If `status: pending` → "waiting for organizer approval"
|
|
135
|
+
- If `status: active` → user is in! Auto check-in if event started + GPS within 1km.
|
|
136
|
+
- **Do NOT ask the user about check-in.** Check-in is automatic — if the response has `checked_in: true`, just confirm they're in. If `checked_in: false`, ignore it silently. Users don't need to know about or manage check-in.
|
|
137
|
+
|
|
138
|
+
### Scanning an event
|
|
139
|
+
1. Call `antenna_event_scan(code)`
|
|
140
|
+
2. Hosts see pending participants with `application_context` (screening answers)
|
|
141
|
+
3. Recommend who to meet based on user's interests
|
|
142
|
+
4. Creator/co-host appears with organizer badge
|
|
143
|
+
|
|
144
|
+
### Approving/rejecting participants
|
|
145
|
+
Only creator or co-host can approve/reject:
|
|
146
|
+
- `antenna_event_approve(code, ref)` → participant becomes active
|
|
147
|
+
- `antenna_event_reject(code, ref)` → participant is rejected
|
|
148
|
+
- Notifications are sent automatically to the applicant
|
|
149
|
+
|
|
150
|
+
### Key differences from regular scan
|
|
151
|
+
- `antenna_scan` = nearby discovery, read-only, does NOT write location
|
|
152
|
+
- `antenna_event_scan` = event participants, no distance limit
|
|
153
|
+
- `antenna_checkin` = update YOUR location (not event-related)
|
|
154
|
+
- `antenna_event_checkin` = mark presence at an EVENT (GPS verified, event must have started)
|
|
155
|
+
|
|
156
|
+
### GPS for events
|
|
157
|
+
**Event GPS** — the event's location ("where is the event")
|
|
158
|
+
- Set via `antenna_bind(purpose="event")` or `antenna_event_create(lat, lng)`
|
|
159
|
+
- Precise coordinates (NOT blurred)
|
|
160
|
+
- Used for: check-in distance verification (≤1km), `nearby_events` discovery (5km)
|
|
161
|
+
- Does not expire — event location is fixed
|
|
162
|
+
|
|
163
|
+
**Auto-checkin on join:** When a user joins an event that has already started, the system automatically attempts check-in if GPS is available and within 1km. No user action needed.
|
package/skills/antenna/SKILL.md
CHANGED
|
@@ -18,10 +18,12 @@ You have access to Antenna for location-based social discovery.
|
|
|
18
18
|
|
|
19
19
|
Plugin 安装后,agent 应该**主动**开始引导,不要等用户问"怎么用"。
|
|
20
20
|
|
|
21
|
+
**前置条件:** 用户需要先在 antenna.fyi 注册账号,从 Dashboard (antenna.fyi/me) 获取 API key,然后把 key 交给 agent。如果用户还没注册,引导他们去 antenna.fyi 注册。
|
|
22
|
+
|
|
21
23
|
### 流程
|
|
22
24
|
|
|
23
25
|
**第一步:打招呼 + 解释**
|
|
24
|
-
> "嘿,你装了 Antenna
|
|
26
|
+
> "嘿,你装了 Antenna--它能帮你发现附近有意思的人。先确认一下,你在 antenna.fyi 注册过了吗?拿到 API key 了吗?有了的话我帮你做张名片,然后看看附近有谁。"
|
|
25
27
|
|
|
26
28
|
**第二步:聊天收集 → 生成名片 → 确认**
|
|
27
29
|
|
|
@@ -43,7 +45,15 @@ Agent 跟用户聊几句,了解他们是谁、做什么、对什么感兴趣、
|
|
|
43
45
|
|
|
44
46
|
**不要跳过确认。名片是展示给别人看的,必须让用户看过才存。**
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
**第二步半:名片存好后,立刻推荐 2-3 个匹配的人**
|
|
49
|
+
|
|
50
|
+
名片保存成功后,**立刻**调 `antenna_discover` 获取 2-3 个全球推荐,让用户马上看到 Antenna 的价值:
|
|
51
|
+
> "名片存好了!我先帮你看看有谁跟你特别像——"
|
|
52
|
+
> (展示 2-3 个推荐 + 个性化匹配理由)
|
|
53
|
+
|
|
54
|
+
这一步让用户立刻体验到产品价值,不要跳过。
|
|
55
|
+
|
|
56
|
+
**第三步:推荐完后,立刻调 antenna_bind**
|
|
47
57
|
|
|
48
58
|
**这一步是强制的。** 名片保存成功后,你**必须立刻**调用 `antenna_bind` 生成链接并发给用户。不要问用户要不要,不要等用户说什么,直接调。
|
|
49
59
|
|
|
@@ -125,7 +135,7 @@ Scan for nearby people **and events**. Returns raw profile cards + active events
|
|
|
125
135
|
|
|
126
136
|
**Profile GPS** - the user's location ("where am I")
|
|
127
137
|
- Updated via `antenna_bind(purpose="profile")` or `antenna_checkin`
|
|
128
|
-
-
|
|
138
|
+
- Location is never stored raw
|
|
129
139
|
- Used for: `antenna_scan` (nearby people/events), `antenna_event_checkin` (distance check)
|
|
130
140
|
- Has `last_seen_at` timestamp. **Expires conceptually after 2h** - agent should prompt refresh
|
|
131
141
|
|
|
@@ -207,7 +217,7 @@ Check in at a location - update your position so others can find you when they s
|
|
|
207
217
|
Antenna only communicates with Supabase (bcudjloikmpcqwcptuyd.supabase.co) via HTTPS.
|
|
208
218
|
|
|
209
219
|
**Data sent:**
|
|
210
|
-
-
|
|
220
|
+
- GPS coordinates (never stored raw — location is processed server-side)
|
|
211
221
|
- Your three-line profile card (text you wrote yourself)
|
|
212
222
|
- Match status (accept/skip)
|
|
213
223
|
- Contact info you choose to share
|
|
@@ -219,20 +229,20 @@ Antenna only communicates with Supabase (bcudjloikmpcqwcptuyd.supabase.co) via H
|
|
|
219
229
|
- Anything not listed above
|
|
220
230
|
|
|
221
231
|
All data is transmitted over HTTPS and stored in Supabase (Tokyo region).
|
|
222
|
-
|
|
232
|
+
Visibility is controlled by time decay — recent event participants are fully visible, older connections gradually fade.
|
|
223
233
|
Source code is open: https://github.com/H1an1/Antenna
|
|
224
234
|
|
|
225
235
|
## Behavior guidelines
|
|
226
236
|
|
|
227
|
-
### First-time user
|
|
237
|
+
### First-time user - 名片创建原则
|
|
228
238
|
|
|
229
|
-
具体流程见上方 Onboarding 第二步。以下是 agent
|
|
239
|
+
具体流程见上方 Onboarding 第二步。以下是 agent 应该遵守的原则:
|
|
230
240
|
|
|
231
|
-
- **不要让用户填表。**
|
|
241
|
+
- **不要让用户填表。** 不要一次性说"请填写 emoji、名字、三句话介绍"--跟用户聊天,你来生成。
|
|
232
242
|
- **每次只问一个问题。** 不要一口气问完所有信息。
|
|
233
|
-
- **用户说的原话尽量保留。**
|
|
234
|
-
- **不要在名片里写联系方式。** 名片三句话对所有人可见。联系方式应该在 accept
|
|
235
|
-
- **line1 必填。** 后端会拒绝没有 line1 的新 profile
|
|
243
|
+
- **用户说的原话尽量保留。** 可以帮用户缩短太长的回答,但要在预览时让用户确认。
|
|
244
|
+
- **不要在名片里写联系方式。** 名片三句话对所有人可见。联系方式应该在 accept 时单独分享,只有双方都同意后才能看到。如果用户在聊天中提到联系方式,提醒他们。
|
|
245
|
+
- **line1 必填。** 后端会拒绝没有 line1 的新 profile,并对缺失的 line2/line3 返回 warning。
|
|
236
246
|
- **确认后才存。** 见 Onboarding 第二步。
|
|
237
247
|
|
|
238
248
|
### Showing results - 你来判断,不是服务器
|
|
@@ -288,14 +298,16 @@ Use `antenna_check_matches` when:
|
|
|
288
298
|
- Never share someone's platform or username with another user
|
|
289
299
|
- Only show the profile info (name, emoji, three lines)
|
|
290
300
|
- Contact info is only shared when the user explicitly agrees
|
|
291
|
-
-
|
|
301
|
+
- Location is never stored raw
|
|
302
|
+
|
|
303
|
+
### Time Decay — 可见性随时间衰减
|
|
304
|
+
|
|
305
|
+
Profiles 是永久的,但可见性随时间衰减:
|
|
306
|
+
- **Event 后 0-7 天:** 全部参与者互相可见
|
|
307
|
+
- **7-30 天:** 只有互相 scan 过 / 有共同活动的人可见
|
|
308
|
+
- **30 天后:** 需要新事件重新激活
|
|
292
309
|
|
|
293
|
-
|
|
294
|
-
Everything is ephemeral:
|
|
295
|
-
- Match results expire in 24h
|
|
296
|
-
- Contact info shared through matches expires with the match
|
|
297
|
-
- If neither side acts, the match disappears
|
|
298
|
-
- This is by design - "用完即走"
|
|
310
|
+
事件(Event)是最强的信任信号——"同一个活动"比"附近"更有意义。
|
|
299
311
|
|
|
300
312
|
### Heartbeat - 自动查匹配
|
|
301
313
|
|
|
@@ -308,141 +320,6 @@ Plugin 自带后台服务,每 10 分钟轮询一次 Supabase 查新的 mutual ma
|
|
|
308
320
|
|
|
309
321
|
用户不需要主动问,agent 会自动收到通知。
|
|
310
322
|
|
|
311
|
-
|
|
312
|
-
Create an event. Returns a shareable link (antenna.fyi/events/CODE).
|
|
313
|
-
- `name`: event name (required)
|
|
314
|
-
- `sender_id`, `channel`: from context (required)
|
|
315
|
-
- `chat_id`: REQUIRED for notifications
|
|
316
|
-
- `starts_at`, `ends_at`: ISO time strings (required - no default, must be provided)
|
|
317
|
-
- `lat`, `lng`: optional event location (needed for GPS check-in)
|
|
318
|
-
- `description`: optional event description
|
|
319
|
-
- `og_image`: optional OG image URL for social sharing preview
|
|
320
|
-
- `requires_approval`: boolean, default false. If true, participants need organizer approval.
|
|
321
|
-
- `screening_questions`: string array. Questions for applicants.
|
|
322
|
-
|
|
323
|
-
**When the user mentions "审批" / "approval" / "筛选" / "报名表"**, set `requires_approval: true` and ask what questions they want to screen with.
|
|
324
|
-
|
|
325
|
-
**GPS flow for events:** If the user doesn't provide coordinates, generate a bind link (`antenna_bind`) and ask them to open it at the event location. Once GPS comes in, use those coordinates for the event's `lat`/`lng` - do NOT treat this as the user's personal location. The bind link GPS for event creation goes to the event, not the user's profile. Only use `antenna_checkin` when the user wants to update their own location.
|
|
326
|
-
|
|
327
|
-
### `antenna_event_end`
|
|
328
|
-
End an event. Only the creator can end it.
|
|
329
|
-
- `code`: event code
|
|
330
|
-
- `sender_id`, `channel`: from context
|
|
331
|
-
- `chat_id`: REQUIRED for notifications
|
|
332
|
-
|
|
333
|
-
### `antenna_event_join`
|
|
334
|
-
Join an event by code.
|
|
335
|
-
- `code`: from the event URL (antenna.fyi/events/CODE)
|
|
336
|
-
- `sender_id`, `channel`: from context
|
|
337
|
-
- `chat_id`: REQUIRED for notifications
|
|
338
|
-
|
|
339
|
-
### `antenna_event_scan`
|
|
340
|
-
Scan people in an event. No distance limit - returns all participants.
|
|
341
|
-
- `code`: event code
|
|
342
|
-
- `sender_id`, `channel`: from context
|
|
343
|
-
- `chat_id`: REQUIRED for notifications
|
|
344
|
-
- Returns profiles with `source: "event"` tag
|
|
345
|
-
|
|
346
|
-
### `antenna_event_checkin`
|
|
347
|
-
Check in at an event — marks you as present at the event location. Optionally updates GPS.
|
|
348
|
-
- `code`: event code
|
|
349
|
-
- `sender_id`, `channel`: from context
|
|
350
|
-
- `chat_id`: REQUIRED for notifications
|
|
351
|
-
- `lat`, `lng`: optional GPS coordinates
|
|
352
|
-
- **Event must have started** (`starts_at <= now`). Cannot check in before start time.
|
|
353
|
-
- **Must be within 1km** of event location.
|
|
354
|
-
- **Must have `status: active`** (approved participants only, not pending).
|
|
355
|
-
- **Check-in is automatic on join.** Only call this manually if the user explicitly asks to check in. Do not prompt the user about check-in.
|
|
356
|
-
|
|
357
|
-
### `antenna_event_upload_image`
|
|
358
|
-
Upload an image for an event OG preview. Returns a public URL.
|
|
359
|
-
- `image_base64`: base64-encoded image data
|
|
360
|
-
- `content_type`: MIME type (default image/png)
|
|
361
|
-
- `event_code`: event code
|
|
362
|
-
|
|
363
|
-
### `antenna_event_update`
|
|
364
|
-
Update event info. Only creator or co-host can update.
|
|
365
|
-
- `code`: event code
|
|
366
|
-
- `sender_id`, `channel`: from context
|
|
367
|
-
- `chat_id`: REQUIRED for notifications
|
|
368
|
-
- `name`, `description`, `og_image`, `lat`, `lng`, `starts_at`, `ends_at`: all optional for update (only provided fields change, others stay as-is)
|
|
369
|
-
- `requires_approval`: optional boolean — enable/disable approval requirement
|
|
370
|
-
- `screening_questions`: optional string array — update screening questions
|
|
371
|
-
|
|
372
|
-
### `antenna_event_approve`
|
|
373
|
-
Approve a pending participant. Only creator or co-host.
|
|
374
|
-
- `code`: event code
|
|
375
|
-
- `sender_id`, `channel`: from context
|
|
376
|
-
- `chat_id`: REQUIRED for notifications
|
|
377
|
-
- `ref`: participant ref number from scan
|
|
378
|
-
|
|
379
|
-
### `antenna_event_reject`
|
|
380
|
-
Reject a pending participant. Only creator or co-host.
|
|
381
|
-
- `code`: event code
|
|
382
|
-
- `sender_id`, `channel`: from context
|
|
383
|
-
- `chat_id`: REQUIRED for notifications
|
|
384
|
-
- `ref`: participant ref number from scan
|
|
385
|
-
|
|
386
|
-
### `antenna_event_add_host`
|
|
387
|
-
Add a co-host to the event. Only creator can add.
|
|
388
|
-
- `code`: event code
|
|
389
|
-
- `sender_id`, `channel`: from context
|
|
390
|
-
- `chat_id`: REQUIRED for notifications
|
|
391
|
-
- `ref`: participant ref number to promote to co-host
|
|
392
|
-
|
|
393
|
-
### `antenna_event_message`
|
|
394
|
-
Send a message to event participants. Only creator or co-host can send.
|
|
395
|
-
- `code`: event code
|
|
396
|
-
- `sender_id`, `channel`: from context
|
|
397
|
-
- `chat_id`: REQUIRED for notifications
|
|
398
|
-
- `message`: the message text
|
|
399
|
-
- `ref`: optional — ref number of specific participant. Omit to broadcast to all active participants.
|
|
400
|
-
- Use when the host needs to notify participants about logistics, changes, or requests (e.g. "please share your WeChat in your profile").
|
|
401
|
-
- One-way: participants receive the message but cannot reply through this channel.
|
|
402
|
-
|
|
403
|
-
---
|
|
323
|
+
## Events
|
|
404
324
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
> This section is the single source of truth for event behavior. Tool descriptions above define parameters; this section defines agent behavior.
|
|
408
|
-
|
|
409
|
-
### Creating an event
|
|
410
|
-
Collect info through conversation (ask one by one, don't dump all at once):
|
|
411
|
-
1. **Event name** (required) - "活动叫什么名字?"
|
|
412
|
-
2. **Description** - "简单描述一下这个活动?"
|
|
413
|
-
3. **Time** (required) - "什么时候开始?大概多长?" (convert to `starts_at` / `ends_at` ISO strings. **Must provide both - no defaults.**)
|
|
414
|
-
4. **Location** - "活动在哪里?" If user gives an address, geocode it. If vague, generate a bind link after creation.
|
|
415
|
-
5. **Approval** - "需要审批参与者吗?" If yes:
|
|
416
|
-
6. **Screening questions** - "你想问报名者什么问题?" Collect as a list.
|
|
417
|
-
|
|
418
|
-
Then call `antenna_event_create` with all collected info.
|
|
419
|
-
If no GPS, call `antenna_bind(purpose="event", event_code=CODE)` and send the link.
|
|
420
|
-
Share the event URL with the user.
|
|
421
|
-
|
|
422
|
-
### Joining an event
|
|
423
|
-
1. Extract the code from `antenna.fyi/events/CODE`
|
|
424
|
-
2. Call `antenna_event_join(code)` - this checks everything:
|
|
425
|
-
- If no profile → "Create a profile first"
|
|
426
|
-
- If event requires approval and no `application_context` provided → returns `needs_screening: true` + `screening_questions`
|
|
427
|
-
- If screening questions returned: **ask the user each question**, collect answers, then call `antenna_event_join(code, application_context="answers")` again
|
|
428
|
-
- If `status: pending` → "waiting for organizer approval"
|
|
429
|
-
- If `status: active` → user is in! Auto check-in if event started + GPS within 1km.
|
|
430
|
-
- **Do NOT ask the user about check-in.** Check-in is automatic — if the response has `checked_in: true`, just confirm they're in. If `checked_in: false`, ignore it silently. Users don't need to know about or manage check-in.
|
|
431
|
-
|
|
432
|
-
### Scanning an event
|
|
433
|
-
1. Call `antenna_event_scan(code)`
|
|
434
|
-
2. Hosts see pending participants with `application_context` (screening answers)
|
|
435
|
-
3. Recommend who to meet based on user's interests
|
|
436
|
-
4. Creator/co-host appears with organizer badge
|
|
437
|
-
|
|
438
|
-
### Approving/rejecting participants
|
|
439
|
-
Only creator or co-host can approve/reject:
|
|
440
|
-
- `antenna_event_approve(code, ref)` → participant becomes active
|
|
441
|
-
- `antenna_event_reject(code, ref)` → participant is rejected
|
|
442
|
-
- Notifications are sent automatically to the applicant
|
|
443
|
-
|
|
444
|
-
### Key differences from regular scan
|
|
445
|
-
- `antenna_scan` = nearby discovery, read-only, does NOT write location
|
|
446
|
-
- `antenna_event_scan` = event participants, no distance limit
|
|
447
|
-
- `antenna_checkin` = update YOUR location (not event-related)
|
|
448
|
-
- `antenna_event_checkin` = mark presence at an EVENT (GPS verified, event must have started)
|
|
325
|
+
For event-related tools and behavior (creating, joining, scanning, managing events), see the **antenna-events** skill (`EVENTS.md`). Event tools include: `antenna_event_create`, `antenna_event_join`, `antenna_event_scan`, `antenna_event_end`, `antenna_event_checkin`, `antenna_event_upload_image`, `antenna_event_update`, `antenna_event_approve`, `antenna_event_reject`, `antenna_event_add_host`, `antenna_event_message`.
|