@konglx/rotom 2.21.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.
- package/README.md +417 -0
- package/bin/mesh-master.sh +439 -0
- package/bin/rotom +29 -0
- package/bin/rotom-link.sh +136 -0
- package/bin/rotom-send-with-status +57 -0
- package/bin/rotom-up.sh +428 -0
- package/dist/cli/ask.js +62 -0
- package/dist/cli/common.js +321 -0
- package/dist/cli/config.js +65 -0
- package/dist/cli/directory.js +17 -0
- package/dist/cli/executor.js +58 -0
- package/dist/cli/fed.js +91 -0
- package/dist/cli/group.js +273 -0
- package/dist/cli/identity.js +62 -0
- package/dist/cli/init.js +268 -0
- package/dist/cli/issue.js +202 -0
- package/dist/cli/join.js +170 -0
- package/dist/cli/link.js +47 -0
- package/dist/cli/master.js +51 -0
- package/dist/cli/memory.js +307 -0
- package/dist/cli/note.js +68 -0
- package/dist/cli/repo.js +77 -0
- package/dist/cli/rotom.js +277 -0
- package/dist/cli/routes.js +118 -0
- package/dist/cli/run.js +45 -0
- package/dist/cli/schedule.js +237 -0
- package/dist/cli/skill.js +173 -0
- package/dist/cli/team.js +106 -0
- package/dist/executor/claude-code-hook.cjs +80 -0
- package/dist/executor/cli-executor.js +8 -0
- package/dist/executor/executors/claude-code.js +780 -0
- package/dist/executor/executors/codex.js +719 -0
- package/dist/executor/executors/hermes-cli.js +855 -0
- package/dist/executor/executors/openclaw.js +467 -0
- package/dist/executor/executors/pi.js +514 -0
- package/dist/executor/index.js +269 -0
- package/dist/executor/jsonrpc-transport.js +125 -0
- package/dist/executor/process-runner.js +101 -0
- package/dist/executor/reasoning-status.js +83 -0
- package/dist/executor/repo-cache.js +502 -0
- package/dist/executor/session-store.js +188 -0
- package/dist/executor/worker-chat.js +257 -0
- package/dist/executor/worker-connection.js +89 -0
- package/dist/executor/worker-issue.js +264 -0
- package/dist/executor/worker.js +877 -0
- package/dist/link/pending-requests.js +72 -0
- package/dist/link/server.js +233 -0
- package/dist/link/visibility-store.js +58 -0
- package/dist/master/api/agents.js +333 -0
- package/dist/master/api/artifacts.js +271 -0
- package/dist/master/api/domains.js +64 -0
- package/dist/master/api/groups.js +635 -0
- package/dist/master/api/guidance-templates.js +147 -0
- package/dist/master/api/index.js +89 -0
- package/dist/master/api/issues-patrol.js +172 -0
- package/dist/master/api/issues.js +663 -0
- package/dist/master/api/links-patrol.js +168 -0
- package/dist/master/api/links.js +114 -0
- package/dist/master/api/memory.js +259 -0
- package/dist/master/api/messages.js +157 -0
- package/dist/master/api/notes.js +77 -0
- package/dist/master/api/schedule-patterns.js +133 -0
- package/dist/master/api/schedules.js +272 -0
- package/dist/master/api/sessions.js +158 -0
- package/dist/master/api/share.js +269 -0
- package/dist/master/api/skills.js +190 -0
- package/dist/master/api/teams.js +122 -0
- package/dist/master/api/uploads.js +245 -0
- package/dist/master/auth.js +134 -0
- package/dist/master/dashboard/animations/calico-dozing.apng +0 -0
- package/dist/master/dashboard/animations/calico-error.apng +0 -0
- package/dist/master/dashboard/animations/calico-happy.apng +0 -0
- package/dist/master/dashboard/animations/calico-notification.apng +0 -0
- package/dist/master/dashboard/animations/calico-sleeping.apng +0 -0
- package/dist/master/dashboard/animations/calico-thinking.apng +0 -0
- package/dist/master/dashboard/animations/calico-waking.apng +0 -0
- package/dist/master/dashboard/assets/ApprovalCard-C38VV6ko.css +1 -0
- package/dist/master/dashboard/assets/ApprovalCard-CHPh2dmE.js +17 -0
- package/dist/master/dashboard/assets/ArtifactPanel-P_2gAP7v.js +1 -0
- package/dist/master/dashboard/assets/ArtifactPanel-aGHySny5.css +1 -0
- package/dist/master/dashboard/assets/css.worker-DaIe3gwK.js +84 -0
- package/dist/master/dashboard/assets/editor.worker-BCzxt1at.js +12 -0
- package/dist/master/dashboard/assets/html.worker-CKrFyw_2.js +461 -0
- package/dist/master/dashboard/assets/index-CChrTn81.css +32 -0
- package/dist/master/dashboard/assets/index-Dhu4SN1z.js +181 -0
- package/dist/master/dashboard/assets/json.worker-B7c_PmGb.js +49 -0
- package/dist/master/dashboard/assets/markdown-CeN5IgdF.js +29 -0
- package/dist/master/dashboard/assets/monaco-core-DyX1CsEw.css +1 -0
- package/dist/master/dashboard/assets/monaco-core-oQiQUisy.js +833 -0
- package/dist/master/dashboard/assets/monaco-setup-CiOPQdmo.js +1 -0
- package/dist/master/dashboard/assets/react-vendor-C8IxlyCR.js +67 -0
- package/dist/master/dashboard/assets/ts.worker-BhkL8olL.js +51334 -0
- package/dist/master/dashboard/assets/useMonaco-ILb4vyPh.js +12 -0
- package/dist/master/dashboard/assets/vite-preload-CxJPbCTl.js +1 -0
- package/dist/master/dashboard/debug-auth.html +197 -0
- package/dist/master/dashboard/favicon.ico +0 -0
- package/dist/master/dashboard/index.html +20 -0
- package/dist/master/dashboard/rotom-avatar.png +0 -0
- package/dist/master/db/agent-sessions.js +60 -0
- package/dist/master/db/agent-visibility.js +64 -0
- package/dist/master/db/agents.js +119 -0
- package/dist/master/db/ask-bridges.js +157 -0
- package/dist/master/db/build-update.js +59 -0
- package/dist/master/db/core.js +82 -0
- package/dist/master/db/domains.js +80 -0
- package/dist/master/db/groups.js +316 -0
- package/dist/master/db/guidance-templates.js +58 -0
- package/dist/master/db/index.js +12 -0
- package/dist/master/db/internal.js +45 -0
- package/dist/master/db/issues-patrol.js +81 -0
- package/dist/master/db/issues.js +373 -0
- package/dist/master/db/links.js +221 -0
- package/dist/master/db/master-node.js +43 -0
- package/dist/master/db/memory.js +272 -0
- package/dist/master/db/messages.js +210 -0
- package/dist/master/db/notes.js +55 -0
- package/dist/master/db/schedule-patterns.js +56 -0
- package/dist/master/db/schedules.js +135 -0
- package/dist/master/db/skills.js +144 -0
- package/dist/master/db/team.js +88 -0
- package/dist/master/db/types.js +10 -0
- package/dist/master/db.js +12 -0
- package/dist/master/embedded.js +133 -0
- package/dist/master/federation/client.js +283 -0
- package/dist/master/federation/identity.js +133 -0
- package/dist/master/federation/manager.js +267 -0
- package/dist/master/federation/publisher.js +87 -0
- package/dist/master/federation/self-publisher.js +69 -0
- package/dist/master/federation/server.js +487 -0
- package/dist/master/group-paths.js +208 -0
- package/dist/master/offline-queue.js +38 -0
- package/dist/master/opc-bootstrap.js +245 -0
- package/dist/master/patrol-terminal.js +275 -0
- package/dist/master/repo-scan.js +188 -0
- package/dist/master/router.js +214 -0
- package/dist/master/scheduler-handlers.js +510 -0
- package/dist/master/scheduler.js +201 -0
- package/dist/master/server.js +203 -0
- package/dist/master/services/link-collector.js +82 -0
- package/dist/master/services/link-patrol-bootstrap.js +50 -0
- package/dist/master/services/memory-extract-prompt.js +34 -0
- package/dist/master/services/patrol-bootstrap.js +63 -0
- package/dist/master/share-tokens.js +56 -0
- package/dist/master/terminal-hub.js +300 -0
- package/dist/master/uploads.js +108 -0
- package/dist/master/util/fs.js +100 -0
- package/dist/master/util/paths.js +50 -0
- package/dist/master/util/persona.js +10 -0
- package/dist/master/ws-hub/connection.js +928 -0
- package/dist/master/ws-hub/conversation.js +290 -0
- package/dist/master/ws-hub/directory.js +70 -0
- package/dist/master/ws-hub/dispatch-enrich.js +34 -0
- package/dist/master/ws-hub/hub.js +136 -0
- package/dist/master/ws-hub/index.js +9 -0
- package/dist/master/ws-hub/internal.js +35 -0
- package/dist/master/ws-hub/routing.js +295 -0
- package/dist/master/ws-hub/sessions.js +130 -0
- package/dist/master/ws-hub.js +11 -0
- package/dist/shared/agent-profile.js +44 -0
- package/dist/shared/constants.js +55 -0
- package/dist/shared/dedup.js +33 -0
- package/dist/shared/group-context.js +62 -0
- package/dist/shared/json-codec.js +33 -0
- package/dist/shared/logger.js +136 -0
- package/dist/shared/mention.js +22 -0
- package/dist/shared/network.js +40 -0
- package/dist/shared/parse.js +18 -0
- package/dist/shared/prompt-composer.js +171 -0
- package/dist/shared/protocol/client-messages.js +8 -0
- package/dist/shared/protocol/enums.js +6 -0
- package/dist/shared/protocol/federation.js +62 -0
- package/dist/shared/protocol/guards.js +87 -0
- package/dist/shared/protocol/server-messages.js +8 -0
- package/dist/shared/protocol/types.js +8 -0
- package/dist/shared/protocol.js +19 -0
- package/dist/shared/readonly-allowlist.js +122 -0
- package/dist/shared/rotom-cli-prompt.js +23 -0
- package/dist/shared/skill-context.js +19 -0
- package/dist/shared/skill-md.js +43 -0
- package/dist/shared/slash-commands.js +50 -0
- package/dist/shared/time.js +80 -0
- package/dist/shared/title.js +46 -0
- package/dist/shared/url-extractor.js +99 -0
- package/migrations/001-schema.sql +942 -0
- package/package.json +68 -0
- package/scripts/fix-node-pty-perms.mjs +46 -0
- package/skill/rotom-a2a-communicate/SKILL.md +257 -0
- package/skill/rotom-bus-host/SKILL.md +78 -0
- package/skill/rotom-bus-host/scripts/poll-replies.sh +148 -0
|
@@ -0,0 +1,942 @@
|
|
|
1
|
+
-- Consolidated initial schema -- replaces migrations 001--059.
|
|
2
|
+
-- Generated from the final state after all incremental migrations.
|
|
3
|
+
-- For fresh installs only; no ALTER TABLE / data migration needed.
|
|
4
|
+
|
|
5
|
+
-- ====================================================================
|
|
6
|
+
-- Core: agents, domains, config
|
|
7
|
+
-- ====================================================================
|
|
8
|
+
|
|
9
|
+
-- Business domains
|
|
10
|
+
CREATE TABLE IF NOT EXISTS domains (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
name TEXT NOT NULL UNIQUE,
|
|
13
|
+
description TEXT,
|
|
14
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
-- Cross-domain communication rules
|
|
18
|
+
CREATE TABLE IF NOT EXISTS cross_domain_rules (
|
|
19
|
+
from_domain TEXT NOT NULL,
|
|
20
|
+
to_domain TEXT NOT NULL,
|
|
21
|
+
PRIMARY KEY (from_domain, to_domain)
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
-- Agent registry (final columns: 001 + 004 + 007 + 016 + 030)
|
|
25
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
name TEXT NOT NULL UNIQUE,
|
|
28
|
+
description TEXT,
|
|
29
|
+
domain TEXT,
|
|
30
|
+
owner TEXT,
|
|
31
|
+
capabilities TEXT DEFAULT '[]',
|
|
32
|
+
status TEXT DEFAULT 'offline',
|
|
33
|
+
instance_id TEXT,
|
|
34
|
+
hostname TEXT,
|
|
35
|
+
platform TEXT,
|
|
36
|
+
version TEXT,
|
|
37
|
+
last_heartbeat TEXT,
|
|
38
|
+
connected_at TEXT,
|
|
39
|
+
registered_at TEXT DEFAULT (datetime('now')),
|
|
40
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
41
|
+
token_hash TEXT,
|
|
42
|
+
enabled INTEGER DEFAULT 1,
|
|
43
|
+
profile TEXT,
|
|
44
|
+
token TEXT,
|
|
45
|
+
avatar_url TEXT
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
-- System config (jwt_secret, etc.)
|
|
49
|
+
CREATE TABLE IF NOT EXISTS config (
|
|
50
|
+
key TEXT PRIMARY KEY,
|
|
51
|
+
value TEXT
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
-- ====================================================================
|
|
55
|
+
-- Auditing & invites
|
|
56
|
+
-- ====================================================================
|
|
57
|
+
|
|
58
|
+
-- Audit log
|
|
59
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
62
|
+
from_name TEXT,
|
|
63
|
+
from_domain TEXT,
|
|
64
|
+
to_name TEXT,
|
|
65
|
+
to_domain TEXT,
|
|
66
|
+
route_type TEXT,
|
|
67
|
+
route_score REAL,
|
|
68
|
+
result TEXT,
|
|
69
|
+
message_summary TEXT
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_audit_ts ON audit_log(timestamp);
|
|
73
|
+
|
|
74
|
+
-- Invite codes
|
|
75
|
+
CREATE TABLE IF NOT EXISTS invites (
|
|
76
|
+
code TEXT PRIMARY KEY,
|
|
77
|
+
domain TEXT,
|
|
78
|
+
created_by TEXT,
|
|
79
|
+
used_by TEXT,
|
|
80
|
+
expires_at TEXT,
|
|
81
|
+
used_at TEXT
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
-- ====================================================================
|
|
85
|
+
-- Message log (002 + 010 + 011)
|
|
86
|
+
-- ====================================================================
|
|
87
|
+
|
|
88
|
+
CREATE TABLE IF NOT EXISTS message_log (
|
|
89
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
90
|
+
request_id TEXT NOT NULL,
|
|
91
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
92
|
+
from_name TEXT NOT NULL,
|
|
93
|
+
from_domain TEXT,
|
|
94
|
+
to_name TEXT,
|
|
95
|
+
to_domain TEXT,
|
|
96
|
+
route_type TEXT,
|
|
97
|
+
direction TEXT,
|
|
98
|
+
payload TEXT,
|
|
99
|
+
status TEXT,
|
|
100
|
+
latency_ms INTEGER,
|
|
101
|
+
group_id TEXT,
|
|
102
|
+
source TEXT
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_msglog_ts ON message_log(timestamp);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_msglog_from ON message_log(from_name);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_msglog_to ON message_log(to_name);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_msglog_req ON message_log(request_id);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_msglog_group ON message_log(group_id);
|
|
110
|
+
|
|
111
|
+
-- ====================================================================
|
|
112
|
+
-- Offline messages (001 + 057 + 059)
|
|
113
|
+
-- ====================================================================
|
|
114
|
+
|
|
115
|
+
CREATE TABLE IF NOT EXISTS offline_messages (
|
|
116
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
117
|
+
target_agent TEXT NOT NULL,
|
|
118
|
+
from_name TEXT NOT NULL,
|
|
119
|
+
from_domain TEXT,
|
|
120
|
+
payload TEXT NOT NULL,
|
|
121
|
+
route_type TEXT,
|
|
122
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
123
|
+
expires_at TEXT,
|
|
124
|
+
target_hostname TEXT,
|
|
125
|
+
source_master_id TEXT,
|
|
126
|
+
target_master_id TEXT
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_offline_target ON offline_messages(target_agent);
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_offline_target_host ON offline_messages(target_hostname, target_agent);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_offline_target_master ON offline_messages(target_master_id) WHERE target_master_id IS NOT NULL;
|
|
132
|
+
|
|
133
|
+
-- ====================================================================
|
|
134
|
+
-- Groups (005 + 012 + 017 + 018 + 019 + 033 + 050 + 051 + 052)
|
|
135
|
+
-- ====================================================================
|
|
136
|
+
|
|
137
|
+
CREATE TABLE IF NOT EXISTS groups (
|
|
138
|
+
id TEXT PRIMARY KEY,
|
|
139
|
+
name TEXT NOT NULL,
|
|
140
|
+
created_by TEXT,
|
|
141
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
142
|
+
working_dir TEXT,
|
|
143
|
+
pinned_at TEXT,
|
|
144
|
+
archived_at TEXT,
|
|
145
|
+
type TEXT DEFAULT NULL,
|
|
146
|
+
metadata TEXT DEFAULT '{}',
|
|
147
|
+
guidance_prompt TEXT,
|
|
148
|
+
starred_at TEXT,
|
|
149
|
+
repo_url TEXT,
|
|
150
|
+
repo_default_branch TEXT,
|
|
151
|
+
extra_repos TEXT,
|
|
152
|
+
worktree_mode TEXT
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
CREATE TABLE IF NOT EXISTS group_members (
|
|
156
|
+
group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
157
|
+
agent_name TEXT NOT NULL,
|
|
158
|
+
joined_at TEXT DEFAULT (datetime('now')),
|
|
159
|
+
PRIMARY KEY (group_id, agent_name)
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_group_members_group ON group_members(group_id);
|
|
163
|
+
|
|
164
|
+
-- ====================================================================
|
|
165
|
+
-- Group messages (006 + 022)
|
|
166
|
+
-- ====================================================================
|
|
167
|
+
|
|
168
|
+
CREATE TABLE IF NOT EXISTS group_messages (
|
|
169
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
170
|
+
group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
171
|
+
sender TEXT NOT NULL,
|
|
172
|
+
content TEXT NOT NULL,
|
|
173
|
+
mentions TEXT DEFAULT '[]',
|
|
174
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
175
|
+
cancelled_at TEXT NULL
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_group_messages_group ON group_messages(group_id, created_at);
|
|
179
|
+
|
|
180
|
+
-- ====================================================================
|
|
181
|
+
-- Group member settings (020 + 032)
|
|
182
|
+
-- ====================================================================
|
|
183
|
+
|
|
184
|
+
CREATE TABLE IF NOT EXISTS group_member_settings (
|
|
185
|
+
group_id TEXT NOT NULL,
|
|
186
|
+
agent_name TEXT NOT NULL,
|
|
187
|
+
working_dir TEXT NOT NULL,
|
|
188
|
+
updated_at TEXT NOT NULL,
|
|
189
|
+
profile TEXT,
|
|
190
|
+
PRIMARY KEY (group_id, agent_name)
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
CREATE INDEX IF NOT EXISTS idx_gms_agent ON group_member_settings(agent_name);
|
|
194
|
+
|
|
195
|
+
-- ====================================================================
|
|
196
|
+
-- Chat message prompts (021)
|
|
197
|
+
-- ====================================================================
|
|
198
|
+
|
|
199
|
+
CREATE TABLE IF NOT EXISTS chat_message_prompts (
|
|
200
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
201
|
+
group_message_id INTEGER NOT NULL REFERENCES group_messages(id) ON DELETE CASCADE,
|
|
202
|
+
agent_name TEXT NOT NULL,
|
|
203
|
+
full_prompt TEXT NOT NULL,
|
|
204
|
+
system_prompt TEXT NOT NULL,
|
|
205
|
+
user_prompt TEXT NOT NULL,
|
|
206
|
+
prompt_tokens INTEGER,
|
|
207
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
208
|
+
UNIQUE(group_message_id, agent_name)
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
CREATE INDEX IF NOT EXISTS idx_cmp_msg ON chat_message_prompts(group_message_id);
|
|
212
|
+
|
|
213
|
+
-- ====================================================================
|
|
214
|
+
-- Issues (008 + 009 + 013 + 014 + 015 + 026 + 028 + 051)
|
|
215
|
+
-- ====================================================================
|
|
216
|
+
|
|
217
|
+
CREATE TABLE IF NOT EXISTS issues (
|
|
218
|
+
id TEXT PRIMARY KEY,
|
|
219
|
+
group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
220
|
+
title TEXT NOT NULL,
|
|
221
|
+
description TEXT NOT NULL DEFAULT '',
|
|
222
|
+
status TEXT NOT NULL DEFAULT 'open',
|
|
223
|
+
priority TEXT NOT NULL DEFAULT 'medium',
|
|
224
|
+
created_by TEXT NOT NULL,
|
|
225
|
+
assigned_to TEXT,
|
|
226
|
+
working_dir TEXT,
|
|
227
|
+
result TEXT,
|
|
228
|
+
error_message TEXT,
|
|
229
|
+
artifacts TEXT DEFAULT '[]',
|
|
230
|
+
type TEXT NOT NULL DEFAULT 'task',
|
|
231
|
+
collaboration_goal TEXT,
|
|
232
|
+
max_rounds INTEGER,
|
|
233
|
+
current_round INTEGER DEFAULT 0,
|
|
234
|
+
participants TEXT DEFAULT '[]',
|
|
235
|
+
owner TEXT,
|
|
236
|
+
summary TEXT,
|
|
237
|
+
session_id TEXT,
|
|
238
|
+
cli_tool TEXT,
|
|
239
|
+
slash_command TEXT,
|
|
240
|
+
approval_policy TEXT NOT NULL DEFAULT 'r_allow',
|
|
241
|
+
usage TEXT,
|
|
242
|
+
model TEXT,
|
|
243
|
+
latest_todos_json TEXT DEFAULT NULL,
|
|
244
|
+
repo_url TEXT,
|
|
245
|
+
repo_branch TEXT,
|
|
246
|
+
started_at TEXT,
|
|
247
|
+
completed_at TEXT,
|
|
248
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
249
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
CREATE INDEX IF NOT EXISTS idx_issues_group ON issues(group_id, created_at);
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_issues_assigned ON issues(assigned_to, status);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_issues_status ON issues(status);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_issues_type ON issues(type, status);
|
|
256
|
+
|
|
257
|
+
-- Issue events (008 + 023)
|
|
258
|
+
CREATE TABLE IF NOT EXISTS issue_events (
|
|
259
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
260
|
+
issue_id TEXT NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
|
|
261
|
+
event_type TEXT NOT NULL,
|
|
262
|
+
agent_name TEXT NOT NULL,
|
|
263
|
+
content TEXT NOT NULL DEFAULT '',
|
|
264
|
+
metadata TEXT DEFAULT '{}',
|
|
265
|
+
reply_to_id INTEGER REFERENCES issue_events(id),
|
|
266
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
CREATE INDEX IF NOT EXISTS idx_issue_events_issue ON issue_events(issue_id, created_at);
|
|
270
|
+
|
|
271
|
+
-- ====================================================================
|
|
272
|
+
-- Scheduled tasks (027 + 035)
|
|
273
|
+
-- ====================================================================
|
|
274
|
+
|
|
275
|
+
CREATE TABLE IF NOT EXISTS scheduled_tasks (
|
|
276
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
277
|
+
name TEXT NOT NULL,
|
|
278
|
+
group_id TEXT NOT NULL,
|
|
279
|
+
mode TEXT NOT NULL DEFAULT 'agent' CHECK (mode IN ('agent','message')),
|
|
280
|
+
agent_name TEXT,
|
|
281
|
+
schedule_kind TEXT NOT NULL DEFAULT 'interval' CHECK (schedule_kind IN ('once','interval')),
|
|
282
|
+
interval_sec INTEGER,
|
|
283
|
+
run_at INTEGER,
|
|
284
|
+
prompt TEXT NOT NULL,
|
|
285
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
286
|
+
next_run_at INTEGER NOT NULL,
|
|
287
|
+
last_run_at INTEGER,
|
|
288
|
+
last_status TEXT,
|
|
289
|
+
last_error TEXT,
|
|
290
|
+
last_issue_id TEXT,
|
|
291
|
+
repeat_times INTEGER,
|
|
292
|
+
repeat_count INTEGER NOT NULL DEFAULT 0,
|
|
293
|
+
handler_key TEXT,
|
|
294
|
+
handler_payload TEXT,
|
|
295
|
+
created_at INTEGER NOT NULL,
|
|
296
|
+
updated_at INTEGER NOT NULL
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_due ON scheduled_tasks(enabled, next_run_at);
|
|
300
|
+
|
|
301
|
+
-- ====================================================================
|
|
302
|
+
-- Ask bridges (034)
|
|
303
|
+
-- ====================================================================
|
|
304
|
+
|
|
305
|
+
CREATE TABLE IF NOT EXISTS ask_bridges (
|
|
306
|
+
id TEXT PRIMARY KEY,
|
|
307
|
+
group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
308
|
+
asker TEXT NOT NULL,
|
|
309
|
+
target TEXT NOT NULL,
|
|
310
|
+
question_msg_id INTEGER NOT NULL REFERENCES group_messages(id) ON DELETE CASCADE,
|
|
311
|
+
escalate_to TEXT,
|
|
312
|
+
timeout_ms INTEGER NOT NULL,
|
|
313
|
+
created_at INTEGER NOT NULL,
|
|
314
|
+
expires_at INTEGER NOT NULL,
|
|
315
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
316
|
+
reply_msg_id INTEGER REFERENCES group_messages(id) ON DELETE SET NULL,
|
|
317
|
+
resolved_at INTEGER,
|
|
318
|
+
issue_id TEXT REFERENCES issues(id) ON DELETE SET NULL,
|
|
319
|
+
CHECK (status IN ('pending','answered','timed_out','cancelled'))
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
CREATE INDEX IF NOT EXISTS idx_ask_bridges_pending ON ask_bridges(expires_at) WHERE status = 'pending';
|
|
323
|
+
CREATE INDEX IF NOT EXISTS idx_ask_bridges_lookup ON ask_bridges(group_id, target, status);
|
|
324
|
+
CREATE INDEX IF NOT EXISTS idx_ask_bridges_asker ON ask_bridges(asker, status);
|
|
325
|
+
|
|
326
|
+
-- ====================================================================
|
|
327
|
+
-- Guidance templates (036)
|
|
328
|
+
-- ====================================================================
|
|
329
|
+
|
|
330
|
+
CREATE TABLE IF NOT EXISTS guidance_templates (
|
|
331
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
332
|
+
name TEXT NOT NULL,
|
|
333
|
+
description TEXT NOT NULL DEFAULT '',
|
|
334
|
+
prompt_text TEXT NOT NULL,
|
|
335
|
+
schedule_config TEXT,
|
|
336
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
337
|
+
is_default INTEGER NOT NULL DEFAULT 1,
|
|
338
|
+
created_at INTEGER NOT NULL,
|
|
339
|
+
updated_at INTEGER NOT NULL
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
-- ====================================================================
|
|
343
|
+
-- Schedule patterns (037)
|
|
344
|
+
-- ====================================================================
|
|
345
|
+
|
|
346
|
+
CREATE TABLE IF NOT EXISTS schedule_patterns (
|
|
347
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
348
|
+
name TEXT NOT NULL,
|
|
349
|
+
description TEXT NOT NULL DEFAULT '',
|
|
350
|
+
schedule_config TEXT,
|
|
351
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
352
|
+
is_default INTEGER NOT NULL DEFAULT 0,
|
|
353
|
+
created_at INTEGER NOT NULL,
|
|
354
|
+
updated_at INTEGER NOT NULL
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
-- ====================================================================
|
|
358
|
+
-- Agent sessions (038 + 039)
|
|
359
|
+
-- ====================================================================
|
|
360
|
+
|
|
361
|
+
CREATE TABLE IF NOT EXISTS agent_sessions (
|
|
362
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
363
|
+
group_id TEXT NOT NULL,
|
|
364
|
+
agent_name TEXT NOT NULL,
|
|
365
|
+
cli_tool TEXT NOT NULL,
|
|
366
|
+
session_id TEXT NOT NULL,
|
|
367
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
368
|
+
last_used_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
369
|
+
input_tokens INTEGER,
|
|
370
|
+
output_tokens INTEGER,
|
|
371
|
+
cache_read_tokens INTEGER,
|
|
372
|
+
cache_creation_tokens INTEGER,
|
|
373
|
+
total_cost_usd REAL,
|
|
374
|
+
model TEXT,
|
|
375
|
+
cumulative_cost_usd REAL NOT NULL DEFAULT 0,
|
|
376
|
+
invalidated_at TEXT NULL,
|
|
377
|
+
cumulative_input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
378
|
+
cumulative_output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
379
|
+
cumulative_cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
|
380
|
+
cumulative_cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
|
381
|
+
UNIQUE(cli_tool, group_id, session_id)
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_group ON agent_sessions(group_id, last_used_at);
|
|
385
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent ON agent_sessions(agent_name, cli_tool, invalidated_at);
|
|
386
|
+
|
|
387
|
+
-- ====================================================================
|
|
388
|
+
-- Agent memory (024 -> 040 -> 041)
|
|
389
|
+
-- ====================================================================
|
|
390
|
+
|
|
391
|
+
CREATE TABLE IF NOT EXISTS agent_memory (
|
|
392
|
+
id TEXT PRIMARY KEY,
|
|
393
|
+
group_id TEXT REFERENCES groups(id) ON DELETE CASCADE,
|
|
394
|
+
scope TEXT NOT NULL DEFAULT 'group' CHECK (scope IN ('group','global')),
|
|
395
|
+
category TEXT NOT NULL DEFAULT 'note' CHECK (category IN ('fact','decision','convention','pitfall','todo','playbook','note')),
|
|
396
|
+
source_type TEXT NOT NULL DEFAULT 'manual' CHECK (source_type IN ('manual','issue_summary')),
|
|
397
|
+
source_ref TEXT,
|
|
398
|
+
key TEXT NOT NULL,
|
|
399
|
+
value TEXT NOT NULL,
|
|
400
|
+
summary TEXT,
|
|
401
|
+
tags TEXT DEFAULT '[]',
|
|
402
|
+
visibility TEXT NOT NULL DEFAULT 'group' CHECK (visibility IN ('private','group','global')),
|
|
403
|
+
agent_visible INTEGER NOT NULL DEFAULT 0,
|
|
404
|
+
created_by TEXT,
|
|
405
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
406
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
407
|
+
expires_at TEXT,
|
|
408
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
409
|
+
pending_review INTEGER NOT NULL DEFAULT 0,
|
|
410
|
+
injected_count INTEGER NOT NULL DEFAULT 0,
|
|
411
|
+
view_count INTEGER NOT NULL DEFAULT 0,
|
|
412
|
+
last_viewed_at TEXT
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
CREATE INDEX IF NOT EXISTS idx_memory_scope_group ON agent_memory(scope, group_id, agent_visible, active, pending_review, category);
|
|
416
|
+
CREATE INDEX IF NOT EXISTS idx_memory_key ON agent_memory(scope, group_id, key, active, agent_visible);
|
|
417
|
+
CREATE INDEX IF NOT EXISTS idx_memory_global ON agent_memory(scope, active, pending_review, agent_visible) WHERE scope='global';
|
|
418
|
+
CREATE INDEX IF NOT EXISTS idx_memory_stale ON agent_memory(active, agent_visible, view_count, last_viewed_at);
|
|
419
|
+
CREATE INDEX IF NOT EXISTS idx_notes_group ON agent_memory(group_id, created_at);
|
|
420
|
+
|
|
421
|
+
-- ====================================================================
|
|
422
|
+
-- Skills (042)
|
|
423
|
+
-- ====================================================================
|
|
424
|
+
|
|
425
|
+
CREATE TABLE IF NOT EXISTS agent_skills (
|
|
426
|
+
id TEXT PRIMARY KEY,
|
|
427
|
+
name TEXT NOT NULL UNIQUE,
|
|
428
|
+
description TEXT NOT NULL,
|
|
429
|
+
content TEXT NOT NULL,
|
|
430
|
+
category TEXT,
|
|
431
|
+
source_type TEXT NOT NULL DEFAULT 'manual' CHECK (source_type IN ('manual','promoted')),
|
|
432
|
+
source_ref TEXT,
|
|
433
|
+
created_by TEXT NOT NULL,
|
|
434
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
435
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
436
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
437
|
+
view_count INTEGER NOT NULL DEFAULT 0,
|
|
438
|
+
last_viewed_at TEXT
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
CREATE INDEX IF NOT EXISTS idx_skills_active ON agent_skills(active, name);
|
|
442
|
+
CREATE INDEX IF NOT EXISTS idx_skills_category ON agent_skills(active, category);
|
|
443
|
+
|
|
444
|
+
CREATE TABLE IF NOT EXISTS agent_skill_bindings (
|
|
445
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
446
|
+
group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
447
|
+
agent_name TEXT NOT NULL,
|
|
448
|
+
skill_id TEXT NOT NULL REFERENCES agent_skills(id) ON DELETE CASCADE,
|
|
449
|
+
created_by TEXT NOT NULL,
|
|
450
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
451
|
+
UNIQUE(group_id, agent_name, skill_id)
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
CREATE INDEX IF NOT EXISTS idx_bindings_group_agent ON agent_skill_bindings(group_id, agent_name);
|
|
455
|
+
CREATE INDEX IF NOT EXISTS idx_bindings_skill ON agent_skill_bindings(skill_id);
|
|
456
|
+
|
|
457
|
+
-- ====================================================================
|
|
458
|
+
-- Issue patrol (043)
|
|
459
|
+
-- ====================================================================
|
|
460
|
+
|
|
461
|
+
CREATE TABLE IF NOT EXISTS issue_patrol_runs (
|
|
462
|
+
run_id TEXT PRIMARY KEY,
|
|
463
|
+
patrol_group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
464
|
+
patrol_issue_id TEXT,
|
|
465
|
+
started_at TEXT NOT NULL,
|
|
466
|
+
finished_at TEXT,
|
|
467
|
+
in_progress_count INTEGER NOT NULL DEFAULT 0,
|
|
468
|
+
candidates_scanned INTEGER NOT NULL DEFAULT 0,
|
|
469
|
+
candidates_ready INTEGER NOT NULL DEFAULT 0,
|
|
470
|
+
status TEXT NOT NULL,
|
|
471
|
+
note TEXT
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_runs_group ON issue_patrol_runs(patrol_group_id, started_at DESC);
|
|
475
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_runs_patrol_issue ON issue_patrol_runs(patrol_issue_id);
|
|
476
|
+
|
|
477
|
+
CREATE TABLE IF NOT EXISTS issue_patrol_logs (
|
|
478
|
+
id TEXT PRIMARY KEY,
|
|
479
|
+
run_id TEXT NOT NULL REFERENCES issue_patrol_runs(run_id) ON DELETE CASCADE,
|
|
480
|
+
patrol_group_id TEXT NOT NULL,
|
|
481
|
+
issue_id TEXT,
|
|
482
|
+
candidate_group_id TEXT,
|
|
483
|
+
verdict TEXT NOT NULL,
|
|
484
|
+
rule_matched TEXT,
|
|
485
|
+
rationale TEXT,
|
|
486
|
+
raw TEXT,
|
|
487
|
+
created_at TEXT NOT NULL
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_logs_run ON issue_patrol_logs(run_id);
|
|
491
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_logs_patrol_group ON issue_patrol_logs(patrol_group_id, created_at DESC);
|
|
492
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_logs_verdict ON issue_patrol_logs(verdict);
|
|
493
|
+
CREATE INDEX IF NOT EXISTS idx_patrol_logs_candidate_group ON issue_patrol_logs(candidate_group_id);
|
|
494
|
+
|
|
495
|
+
-- ====================================================================
|
|
496
|
+
-- Links (053)
|
|
497
|
+
-- ====================================================================
|
|
498
|
+
|
|
499
|
+
CREATE TABLE IF NOT EXISTS links (
|
|
500
|
+
id TEXT PRIMARY KEY,
|
|
501
|
+
url_norm TEXT NOT NULL UNIQUE,
|
|
502
|
+
url_raw TEXT NOT NULL,
|
|
503
|
+
title TEXT,
|
|
504
|
+
category TEXT,
|
|
505
|
+
summary TEXT,
|
|
506
|
+
host TEXT NOT NULL,
|
|
507
|
+
created_at TEXT NOT NULL,
|
|
508
|
+
updated_at TEXT NOT NULL,
|
|
509
|
+
last_seen_at TEXT NOT NULL
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
CREATE INDEX IF NOT EXISTS idx_links_category ON links(category);
|
|
513
|
+
CREATE INDEX IF NOT EXISTS idx_links_host ON links(host);
|
|
514
|
+
CREATE INDEX IF NOT EXISTS idx_links_unclassified ON links(last_seen_at) WHERE category IS NULL;
|
|
515
|
+
CREATE INDEX IF NOT EXISTS idx_links_updated ON links(updated_at DESC);
|
|
516
|
+
|
|
517
|
+
CREATE TABLE IF NOT EXISTS link_tags (
|
|
518
|
+
link_id TEXT NOT NULL REFERENCES links(id) ON DELETE CASCADE,
|
|
519
|
+
tag TEXT NOT NULL,
|
|
520
|
+
PRIMARY KEY (link_id, tag)
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
CREATE TABLE IF NOT EXISTS link_occurrences (
|
|
524
|
+
id TEXT PRIMARY KEY,
|
|
525
|
+
link_id TEXT NOT NULL REFERENCES links(id) ON DELETE CASCADE,
|
|
526
|
+
source_type TEXT NOT NULL,
|
|
527
|
+
source_id TEXT,
|
|
528
|
+
source_group_id TEXT,
|
|
529
|
+
source_sender TEXT,
|
|
530
|
+
context_snippet TEXT,
|
|
531
|
+
occurred_at TEXT NOT NULL
|
|
532
|
+
);
|
|
533
|
+
|
|
534
|
+
CREATE INDEX IF NOT EXISTS idx_occurrences_link ON link_occurrences(link_id);
|
|
535
|
+
CREATE INDEX IF NOT EXISTS idx_occurrences_group ON link_occurrences(source_group_id);
|
|
536
|
+
CREATE INDEX IF NOT EXISTS idx_occurrences_occurred ON link_occurrences(occurred_at DESC);
|
|
537
|
+
|
|
538
|
+
CREATE TABLE IF NOT EXISTS link_source_groups (
|
|
539
|
+
link_id TEXT NOT NULL REFERENCES links(id) ON DELETE CASCADE,
|
|
540
|
+
group_id TEXT NOT NULL,
|
|
541
|
+
PRIMARY KEY (link_id, group_id)
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
CREATE INDEX IF NOT EXISTS idx_link_source_groups_group ON link_source_groups(group_id);
|
|
545
|
+
|
|
546
|
+
CREATE TABLE IF NOT EXISTS link_patrol_runs (
|
|
547
|
+
run_id TEXT PRIMARY KEY,
|
|
548
|
+
patrol_group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
549
|
+
patrol_issue_id TEXT,
|
|
550
|
+
started_at TEXT NOT NULL,
|
|
551
|
+
finished_at TEXT,
|
|
552
|
+
candidates_scanned INTEGER NOT NULL DEFAULT 0,
|
|
553
|
+
candidates_classified INTEGER NOT NULL DEFAULT 0,
|
|
554
|
+
status TEXT NOT NULL,
|
|
555
|
+
note TEXT
|
|
556
|
+
);
|
|
557
|
+
|
|
558
|
+
CREATE INDEX IF NOT EXISTS idx_link_patrol_runs_group ON link_patrol_runs(patrol_group_id, started_at DESC);
|
|
559
|
+
CREATE INDEX IF NOT EXISTS idx_link_patrol_runs_issue ON link_patrol_runs(patrol_issue_id);
|
|
560
|
+
|
|
561
|
+
CREATE TABLE IF NOT EXISTS link_patrol_logs (
|
|
562
|
+
id TEXT PRIMARY KEY,
|
|
563
|
+
run_id TEXT NOT NULL REFERENCES link_patrol_runs(run_id) ON DELETE CASCADE,
|
|
564
|
+
link_id TEXT,
|
|
565
|
+
category TEXT NOT NULL,
|
|
566
|
+
tags TEXT,
|
|
567
|
+
title TEXT,
|
|
568
|
+
rationale TEXT,
|
|
569
|
+
raw TEXT,
|
|
570
|
+
created_at TEXT NOT NULL
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
CREATE INDEX IF NOT EXISTS idx_link_patrol_logs_run ON link_patrol_logs(run_id);
|
|
574
|
+
|
|
575
|
+
-- ====================================================================
|
|
576
|
+
-- Master node identity (054 + 058)
|
|
577
|
+
-- ====================================================================
|
|
578
|
+
|
|
579
|
+
CREATE TABLE IF NOT EXISTS master_node (
|
|
580
|
+
id TEXT PRIMARY KEY,
|
|
581
|
+
hostname TEXT NOT NULL,
|
|
582
|
+
role TEXT NOT NULL DEFAULT 'standalone',
|
|
583
|
+
display_name TEXT,
|
|
584
|
+
endpoint TEXT,
|
|
585
|
+
federation_enabled INTEGER NOT NULL DEFAULT 0,
|
|
586
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
587
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
588
|
+
team_name TEXT
|
|
589
|
+
);
|
|
590
|
+
|
|
591
|
+
-- ====================================================================
|
|
592
|
+
-- Federation: team (056 -> 058 renamed department->team)
|
|
593
|
+
-- ====================================================================
|
|
594
|
+
|
|
595
|
+
CREATE TABLE IF NOT EXISTS team (
|
|
596
|
+
id TEXT PRIMARY KEY,
|
|
597
|
+
name TEXT NOT NULL,
|
|
598
|
+
description TEXT,
|
|
599
|
+
my_role TEXT NOT NULL CHECK(my_role IN ('coordination','member')),
|
|
600
|
+
coord_endpoints TEXT NOT NULL,
|
|
601
|
+
joined_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
602
|
+
);
|
|
603
|
+
|
|
604
|
+
CREATE TABLE IF NOT EXISTS team_peers (
|
|
605
|
+
team_id TEXT NOT NULL,
|
|
606
|
+
master_id TEXT NOT NULL,
|
|
607
|
+
hostname TEXT NOT NULL,
|
|
608
|
+
endpoint TEXT,
|
|
609
|
+
role TEXT NOT NULL,
|
|
610
|
+
last_seen_at TEXT,
|
|
611
|
+
PRIMARY KEY (team_id, master_id)
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
CREATE TABLE IF NOT EXISTS agent_visibility (
|
|
615
|
+
team_id TEXT NOT NULL,
|
|
616
|
+
master_id TEXT NOT NULL,
|
|
617
|
+
agent_name TEXT NOT NULL,
|
|
618
|
+
hostname TEXT NOT NULL,
|
|
619
|
+
display_name TEXT,
|
|
620
|
+
is_human INTEGER NOT NULL DEFAULT 0,
|
|
621
|
+
online INTEGER NOT NULL DEFAULT 0,
|
|
622
|
+
last_heartbeat TEXT,
|
|
623
|
+
PRIMARY KEY (team_id, master_id, agent_name)
|
|
624
|
+
);
|
|
625
|
+
|
|
626
|
+
CREATE INDEX IF NOT EXISTS idx_agent_visibility_lookup
|
|
627
|
+
ON agent_visibility (team_id, hostname, agent_name);
|
|
628
|
+
|
|
629
|
+
CREATE TABLE IF NOT EXISTS human_membership (
|
|
630
|
+
agent_id TEXT NOT NULL,
|
|
631
|
+
team_id TEXT NOT NULL,
|
|
632
|
+
joined_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
633
|
+
PRIMARY KEY (agent_id, team_id)
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
-- ====================================================================
|
|
637
|
+
-- Indexes from 055 (agent composite key)
|
|
638
|
+
-- ====================================================================
|
|
639
|
+
|
|
640
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_agents_host_name
|
|
641
|
+
ON agents (hostname, name);
|
|
642
|
+
|
|
643
|
+
CREATE INDEX IF NOT EXISTS idx_agents_hostname
|
|
644
|
+
ON agents (hostname);
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
-- ====================================================================
|
|
648
|
+
-- Seed data
|
|
649
|
+
-- ====================================================================
|
|
650
|
+
|
|
651
|
+
-- Guidance templates (from 036)
|
|
652
|
+
INSERT INTO guidance_templates (name, description, prompt_text, schedule_config, sort_order, is_default, created_at, updated_at) VALUES
|
|
653
|
+
('群内讨论方案设计',
|
|
654
|
+
'不创建 issue,群内成员讨论完成方案设计',
|
|
655
|
+
'本群通过群内成员讨论完成方案设计。不需要创建 issue 执行任务,所有方案讨论在群内进行。提问对方时用 #reply @对方。',
|
|
656
|
+
NULL,
|
|
657
|
+
1, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000),
|
|
658
|
+
('群内讨论 + 老师定时检查',
|
|
659
|
+
'群内讨论完成,老师 agent 每分钟检查一次讨论结果,8 分钟后结束',
|
|
660
|
+
'本群通过群内成员讨论完成方案。不需要创建 issue。老师 {{teacher}} 每分钟会检查一次讨论结果,对 {{student}} 的回答给出赞同/反对/补充意见。8 分钟后结束。',
|
|
661
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":60,"repeat_times":8,"prompt":"检查群内最近的讨论,作为老师 {{teacher}} 对学生 {{student}} 的回答给出赞同/反对/补充意见。"}'),
|
|
662
|
+
2, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000),
|
|
663
|
+
('老师提问-学生回答-老师回应',
|
|
664
|
+
'{{teacher}} 提问,{{student}} 回答或提意见,{{teacher}} 再赞同/反对/补充',
|
|
665
|
+
'{{teacher}} 作为老师提问,{{student}} 作为学生回答或提出意见,{{teacher}} 再表示赞同/反对/补充。讨论话题:{{topic}}。提问对方时用 #reply @对方。',
|
|
666
|
+
NULL,
|
|
667
|
+
3, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000);
|
|
668
|
+
|
|
669
|
+
-- Schedule patterns (from 037)
|
|
670
|
+
INSERT INTO schedule_patterns (name, description, schedule_config, sort_order, is_default, created_at, updated_at) VALUES
|
|
671
|
+
('每 60 秒轮询检查',
|
|
672
|
+
'interval 模式,固定 60 秒触发一次,适合高频巡检类任务',
|
|
673
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":60,"repeat_times":10,"prompt":"检查最新进展并给出反馈。"}'),
|
|
674
|
+
1, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000),
|
|
675
|
+
('一次性定时提醒',
|
|
676
|
+
'once 模式,在指定时间点触发一次后结束',
|
|
677
|
+
json('{"mode":"message","schedule_kind":"once","run_at":0,"prompt":"到点了,该开始了。"}'),
|
|
678
|
+
2, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000),
|
|
679
|
+
('每日固定周期播报',
|
|
680
|
+
'interval 模式,86400 秒(一天)周期触发,适合每日晨会/日报类任务',
|
|
681
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":86400,"repeat_times":null,"prompt":"生成今日总结并发到群里。"}'),
|
|
682
|
+
3, 1, strftime('%%s','now')*1000, strftime('%%s','now')*1000);
|
|
683
|
+
|
|
684
|
+
-- Issue patrol rules skill seed (from 043, fixed ID)
|
|
685
|
+
INSERT OR IGNORE INTO agent_skills (id, name, description, content, category, source_type, source_ref, created_by, created_at, updated_at, active, view_count, last_viewed_at)
|
|
686
|
+
VALUES (
|
|
687
|
+
'sk_issue_patrol_rules_seed',
|
|
688
|
+
'issue-patrol-rules',
|
|
689
|
+
'Issue 巡检规则:判断一个 open issue 是否可以直接认领开工',
|
|
690
|
+
'# Issue 巡检规则
|
|
691
|
+
|
|
692
|
+
巡检员的任务:对每个候选 issue 给出 verdict(ready / not_ready / uncertain)和理由,
|
|
693
|
+
**不要**认领、分配、或操作任何候选 issue,只输出判断。
|
|
694
|
+
|
|
695
|
+
## 可直接认领 (verdict=ready) 的信号
|
|
696
|
+
|
|
697
|
+
满足以下任一即为 ready:
|
|
698
|
+
|
|
699
|
+
- **小需求**:改动范围 <= 2 个文件,不动 DB schema、不动 CI/部署配置
|
|
700
|
+
- 信号:title 含「小改」「修」「补」「tweak」等,或 description 明确范围
|
|
701
|
+
- **出方案 / 调研**:产物是文档/markdown,不改业务代码
|
|
702
|
+
- 信号:slash_command 含 /plan /research /investigate,title 含「调研」「方案」「设计」「评估」
|
|
703
|
+
- **纯文档 / 单测补充**:artifacts 预期是 .md 或 .test.ts,不动实现
|
|
704
|
+
- 信号:title 含「文档」「补充测试」「补单测」
|
|
705
|
+
|
|
706
|
+
## 不建议认领 (verdict=not_ready) 的信号
|
|
707
|
+
|
|
708
|
+
满足以下任一即为 not_ready:
|
|
709
|
+
|
|
710
|
+
- **重构 / 跨模块改动**:影响 3+ 文件,或横跨多个领域模块
|
|
711
|
+
- 信号:title 含「重构」「refactor」「迁移」「改造」
|
|
712
|
+
- **改 schema / 部署**:动 migrations、改 CI、动部署脚本
|
|
713
|
+
- 信号:title 含「schema」「migration」「CI」「部署」「release」
|
|
714
|
+
- **依赖外部决策**:需要真人拍板、或依赖未完成的协作
|
|
715
|
+
- 信号:description 里出现「等确认」「待拍板」「需要 X 先完成」
|
|
716
|
+
|
|
717
|
+
## 不确定 (verdict=uncertain)
|
|
718
|
+
|
|
719
|
+
信息不足、或规则都没命中时标 uncertain,rationale 说明缺什么信息。
|
|
720
|
+
|
|
721
|
+
## 输出格式
|
|
722
|
+
|
|
723
|
+
patrol issue 的 result 字段必须是 JSON 数组,每条:
|
|
724
|
+
',
|
|
725
|
+
'workflow',
|
|
726
|
+
'manual',
|
|
727
|
+
NULL,
|
|
728
|
+
'system:patrol-bootstrap',
|
|
729
|
+
datetime('now'),
|
|
730
|
+
datetime('now'),
|
|
731
|
+
1,
|
|
732
|
+
0,
|
|
733
|
+
NULL
|
|
734
|
+
);
|
|
735
|
+
|
|
736
|
+
-- Link patrol rules skill seed (from 053, fixed ID)
|
|
737
|
+
INSERT OR IGNORE INTO agent_skills (id, name, description, content, category, source_type, source_ref, created_by, created_at, updated_at, active, view_count, last_viewed_at)
|
|
738
|
+
VALUES (
|
|
739
|
+
'sk_link_patrol_rules_seed',
|
|
740
|
+
'link-patrol-rules',
|
|
741
|
+
'链接智能分类巡检规则:对候选链接给出 category/tags/title',
|
|
742
|
+
'# 链接智能分类规则
|
|
743
|
+
|
|
744
|
+
你的任务:对每条候选链接给出 category + tags[] + title + rationale。
|
|
745
|
+
**不要**直接修改 links 表(只输出 JSON,系统会落库)。
|
|
746
|
+
|
|
747
|
+
## 分类目(category 单选,从下列选一个)
|
|
748
|
+
|
|
749
|
+
- reference : 文档/规范/Wiki/参考资料
|
|
750
|
+
- code : GitHub/GitLab/代码仓库 PR/Issue
|
|
751
|
+
- tool : 工具/服务/产品官网
|
|
752
|
+
- article : 博客/技术文章/教程
|
|
753
|
+
- paper : 论文/研究报告
|
|
754
|
+
- discussion : 论坛/HN/Reddit/Stack Overflow 讨论
|
|
755
|
+
- issue-tracker : 内部 Issue / 工单系统链接
|
|
756
|
+
- media : 图片/视频/演示
|
|
757
|
+
- other : 兜底
|
|
758
|
+
|
|
759
|
+
## Tags(自由字符串数组,推断规则)
|
|
760
|
+
|
|
761
|
+
按 host + path 关键词推断,例:
|
|
762
|
+
- react 官方文档 -> ["react", "hooks"]
|
|
763
|
+
- anthropic SDK 仓库 -> ["anthropic", "claude-api", "sdk"]
|
|
764
|
+
- pnpm monorepo 文档 -> ["pnpm", "monorepo"]
|
|
765
|
+
|
|
766
|
+
## Title 提取规则
|
|
767
|
+
|
|
768
|
+
- 优先用 context snippet 里 markdown [text](url) 的 text
|
|
769
|
+
- 否则用 url path 末段 + host(例:react.dev/hooks -> hooks . react.dev)
|
|
770
|
+
|
|
771
|
+
## 输出格式
|
|
772
|
+
|
|
773
|
+
issue result 字段必须是 JSON 数组(用 markdown code block 包裹):
|
|
774
|
+
|
|
775
|
+
',
|
|
776
|
+
'patrol',
|
|
777
|
+
'manual',
|
|
778
|
+
NULL,
|
|
779
|
+
'system:link-patrol-bootstrap',
|
|
780
|
+
datetime('now'),
|
|
781
|
+
datetime('now'),
|
|
782
|
+
1,
|
|
783
|
+
0,
|
|
784
|
+
NULL
|
|
785
|
+
);
|
|
786
|
+
|
|
787
|
+
-- ====================================================================
|
|
788
|
+
-- Seed data
|
|
789
|
+
-- ====================================================================
|
|
790
|
+
|
|
791
|
+
-- Guidance templates (from 036)
|
|
792
|
+
INSERT INTO guidance_templates (name, description, prompt_text, schedule_config, sort_order, is_default, created_at, updated_at) VALUES
|
|
793
|
+
('群内讨论方案设计',
|
|
794
|
+
'不创建 issue,群内成员讨论完成方案设计',
|
|
795
|
+
'本群通过群内成员讨论完成方案设计。不需要创建 issue 执行任务,所有方案讨论在群内进行。提问对方时用 #reply @对方。',
|
|
796
|
+
NULL,
|
|
797
|
+
1, 1, strftime('%s','now')*1000, strftime('%s','now')*1000),
|
|
798
|
+
('群内讨论 + 老师定时检查',
|
|
799
|
+
'群内讨论完成,老师 agent 每分钟检查一次讨论结果,8 分钟后结束',
|
|
800
|
+
'本群通过群内成员讨论完成方案。不需要创建 issue。老师 {{teacher}} 每分钟会检查一次讨论结果,对 {{student}} 的回答给出赞同/反对/补充意见。8 分钟后结束。',
|
|
801
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":60,"repeat_times":8,"prompt":"检查群内最近的讨论,作为老师 {{teacher}} 对学生 {{student}} 的回答给出赞同/反对/补充意见。"}'),
|
|
802
|
+
2, 1, strftime('%s','now')*1000, strftime('%s','now')*1000),
|
|
803
|
+
('老师提问-学生回答-老师回应',
|
|
804
|
+
'{{teacher}} 提问,{{student}} 回答或提意见,{{teacher}} 再赞同/反对/补充',
|
|
805
|
+
'{{teacher}} 作为老师提问,{{student}} 作为学生回答或提出意见,{{teacher}} 再表示赞同/反对/补充。讨论话题:{{topic}}。提问对方时用 #reply @对方。',
|
|
806
|
+
NULL,
|
|
807
|
+
3, 1, strftime('%s','now')*1000, strftime('%s','now')*1000);
|
|
808
|
+
|
|
809
|
+
-- Schedule patterns (from 037)
|
|
810
|
+
INSERT INTO schedule_patterns (name, description, schedule_config, sort_order, is_default, created_at, updated_at) VALUES
|
|
811
|
+
('每 60 秒轮询检查',
|
|
812
|
+
'interval 模式,固定 60 秒触发一次,适合高频巡检类任务',
|
|
813
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":60,"repeat_times":10,"prompt":"检查最新进展并给出反馈。"}'),
|
|
814
|
+
1, 1, strftime('%s','now')*1000, strftime('%s','now')*1000),
|
|
815
|
+
('一次性定时提醒',
|
|
816
|
+
'once 模式,在指定时间点触发一次后结束',
|
|
817
|
+
json('{"mode":"message","schedule_kind":"once","run_at":0,"prompt":"到点了,该开始了。"}'),
|
|
818
|
+
2, 1, strftime('%s','now')*1000, strftime('%s','now')*1000),
|
|
819
|
+
('每日固定周期播报',
|
|
820
|
+
'interval 模式,86400 秒(一天)周期触发,适合每日晨会/日报类任务',
|
|
821
|
+
json('{"mode":"agent","agent_name":"{{teacher}}","schedule_kind":"interval","interval_sec":86400,"repeat_times":null,"prompt":"生成今日总结并发到群里。"}'),
|
|
822
|
+
3, 1, strftime('%s','now')*1000, strftime('%s','now')*1000);
|
|
823
|
+
|
|
824
|
+
-- Issue patrol rules skill seed (from 043)
|
|
825
|
+
INSERT OR IGNORE INTO agent_skills (id, name, description, content, category, source_type, source_ref, created_by, created_at, updated_at, active, view_count, last_viewed_at)
|
|
826
|
+
VALUES (
|
|
827
|
+
'sk_issue_patrol_rules_seed',
|
|
828
|
+
'issue-patrol-rules',
|
|
829
|
+
'Issue 巡检规则:判断一个 open issue 是否可以直接认领开工',
|
|
830
|
+
'# Issue 巡检规则
|
|
831
|
+
|
|
832
|
+
巡检员的任务:对每个候选 issue 给出 verdict(ready / not_ready / uncertain)和理由,
|
|
833
|
+
**不要**认领、分配、或操作任何候选 issue,只输出判断。
|
|
834
|
+
|
|
835
|
+
## 可直接认领 (verdict=ready) 的信号
|
|
836
|
+
|
|
837
|
+
满足以下任一即为 ready:
|
|
838
|
+
|
|
839
|
+
- **小需求**:改动范围 <= 2 个文件,不动 DB schema、不动 CI/部署配置
|
|
840
|
+
- 信号:title 含「小改」「修」「补」「tweak」等,或 description 明确范围
|
|
841
|
+
- **出方案 / 调研**:产物是文档/markdown,不改业务代码
|
|
842
|
+
- 信号:slash_command 含 /plan /research /investigate,title 含「调研」「方案」「设计」「评估」
|
|
843
|
+
- **纯文档 / 单测补充**:artifacts 预期是 .md 或 .test.ts,不动实现
|
|
844
|
+
- 信号:title 含「文档」「补充测试」「补单测」
|
|
845
|
+
|
|
846
|
+
## 不建议认领 (verdict=not_ready) 的信号
|
|
847
|
+
|
|
848
|
+
满足以下任一即为 not_ready:
|
|
849
|
+
|
|
850
|
+
- **重构 / 跨模块改动**:影响 3+ 文件,或横跨多个领域模块
|
|
851
|
+
- 信号:title 含「重构」「refactor」「迁移」「改造」
|
|
852
|
+
- **改 schema / 部署**:动 migrations、改 CI、动部署脚本
|
|
853
|
+
- 信号:title 含「schema」「migration」「CI」「部署」「release」
|
|
854
|
+
- **依赖外部决策**:需要真人拍板、或依赖未完成的协作
|
|
855
|
+
- 信号:description 里出现「等确认」「待拍板」「需要 X 先完成」
|
|
856
|
+
|
|
857
|
+
## 不确定 (verdict=uncertain)
|
|
858
|
+
|
|
859
|
+
信息不足、或规则都没命中时标 uncertain,rationale 说明缺什么信息。
|
|
860
|
+
|
|
861
|
+
## 输出格式
|
|
862
|
+
|
|
863
|
+
patrol issue 的 result 字段必须是 JSON 数组,每条:
|
|
864
|
+
```
|
|
865
|
+
{
|
|
866
|
+
"issue_id": "<候选 id>",
|
|
867
|
+
"verdict": "ready" | "not_ready" | "uncertain",
|
|
868
|
+
"rule_matched": "<命中的规则名,如 small-requirement / heavy-refactor / 等>",
|
|
869
|
+
"rationale": "<一句话理由>"
|
|
870
|
+
}
|
|
871
|
+
```',
|
|
872
|
+
'workflow',
|
|
873
|
+
'manual',
|
|
874
|
+
NULL,
|
|
875
|
+
'system:patrol-bootstrap',
|
|
876
|
+
datetime('now'),
|
|
877
|
+
datetime('now'),
|
|
878
|
+
1,
|
|
879
|
+
0,
|
|
880
|
+
NULL
|
|
881
|
+
);
|
|
882
|
+
|
|
883
|
+
-- Link patrol rules skill seed (from 053)
|
|
884
|
+
INSERT OR IGNORE INTO agent_skills (id, name, description, content, category, source_type, source_ref, created_by, created_at, updated_at, active, view_count, last_viewed_at)
|
|
885
|
+
VALUES (
|
|
886
|
+
'sk_link_patrol_rules_seed',
|
|
887
|
+
'link-patrol-rules',
|
|
888
|
+
'链接智能分类巡检规则:对候选链接给出 category/tags/title',
|
|
889
|
+
'# 链接智能分类规则
|
|
890
|
+
|
|
891
|
+
你的任务:对每条候选链接给出 category + tags[] + title + rationale。
|
|
892
|
+
**不要**直接修改 links 表(只输出 JSON,系统会落库)。
|
|
893
|
+
|
|
894
|
+
## 分类目(category 单选,从下列选一个)
|
|
895
|
+
|
|
896
|
+
- reference : 文档/规范/Wiki/参考资料
|
|
897
|
+
- code : GitHub/GitLab/代码仓库 PR/Issue
|
|
898
|
+
- tool : 工具/服务/产品官网
|
|
899
|
+
- article : 博客/技术文章/教程
|
|
900
|
+
- paper : 论文/研究报告
|
|
901
|
+
- discussion : 论坛/HN/Reddit/Stack Overflow 讨论
|
|
902
|
+
- issue-tracker : 内部 Issue / 工单系统链接
|
|
903
|
+
- media : 图片/视频/演示
|
|
904
|
+
- other : 兜底
|
|
905
|
+
|
|
906
|
+
## Tags(自由字符串数组,推断规则)
|
|
907
|
+
|
|
908
|
+
按 host + path 关键词推断,例:
|
|
909
|
+
- react 官方文档 -> ["react", "hooks"]
|
|
910
|
+
- anthropic SDK 仓库 -> ["anthropic", "claude-api", "sdk"]
|
|
911
|
+
- pnpm monorepo 文档 -> ["pnpm", "monorepo"]
|
|
912
|
+
|
|
913
|
+
## Title 提取规则
|
|
914
|
+
|
|
915
|
+
- 优先用 context snippet 里 markdown [text](url) 的 text
|
|
916
|
+
- 否则用 url path 末段 + host(例:react.dev/hooks -> hooks . react.dev)
|
|
917
|
+
|
|
918
|
+
## 输出格式
|
|
919
|
+
|
|
920
|
+
issue result 字段必须是 JSON 数组(用 markdown code block 包裹):
|
|
921
|
+
|
|
922
|
+
```json
|
|
923
|
+
[
|
|
924
|
+
{
|
|
925
|
+
"link_id": "<uuid>",
|
|
926
|
+
"category": "reference",
|
|
927
|
+
"tags": ["react", "hooks"],
|
|
928
|
+
"title": "React Hooks 官方文档",
|
|
929
|
+
"rationale": "react.dev 是官方域名,路径 /hooks 属参考资料"
|
|
930
|
+
}
|
|
931
|
+
]
|
|
932
|
+
```',
|
|
933
|
+
'patrol',
|
|
934
|
+
'manual',
|
|
935
|
+
NULL,
|
|
936
|
+
'system:link-patrol-bootstrap',
|
|
937
|
+
datetime('now'),
|
|
938
|
+
datetime('now'),
|
|
939
|
+
1,
|
|
940
|
+
0,
|
|
941
|
+
NULL
|
|
942
|
+
);
|