team-anya-cli 0.1.3 → 0.1.5

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.
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Anya Gateway Dashboard</title>
7
- <script type="module" crossorigin src="/assets/index-CJzAjoVH.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-CHIT0Dya.css">
7
+ <script type="module" crossorigin src="/assets/index-DT5NuALG.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BiiEB0qZ.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "team-anya-cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "description": "Team Anya - AI 数字员工系统",
6
6
  "bin": {
@@ -124,7 +124,7 @@ export function getOrgMember(db, memberId) {
124
124
  export function upsertOrgMember(db, data) {
125
125
  const setFields = {
126
126
  name: data.name,
127
- updated_at: sql `(datetime('now'))`,
127
+ updated_at: sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`,
128
128
  };
129
129
  if (data.platform !== undefined)
130
130
  setFields.platform = data.platform;
@@ -236,11 +236,32 @@ export function getRecentMessages(db, opts = {}) {
236
236
  conditions.push(eq(messageLog.chat_id, chat_id));
237
237
  if (chat_type)
238
238
  conditions.push(eq(messageLog.chat_type, chat_type));
239
- const query = conditions.length > 0
240
- ? db.select().from(messageLog).where(and(...conditions))
241
- : db.select().from(messageLog);
239
+ const whereClause = conditions.length > 0 ? and(...conditions) : undefined;
242
240
  const orderBy = sortOrder === 'asc' ? messageLog.created_at : desc(messageLog.created_at);
243
- return query
241
+ return db
242
+ .select({
243
+ id: messageLog.id,
244
+ direction: messageLog.direction,
245
+ source_type: messageLog.source_type,
246
+ source_ref: messageLog.source_ref,
247
+ sender: messageLog.sender,
248
+ sender_name: sql `(SELECT name FROM org_members WHERE member_id = ${messageLog.sender})`,
249
+ receiver: messageLog.receiver,
250
+ receiver_name: sql `(SELECT name FROM org_members WHERE member_id = ${messageLog.receiver})`,
251
+ chat_id: messageLog.chat_id,
252
+ chat_type: messageLog.chat_type,
253
+ content: messageLog.content,
254
+ message_type: messageLog.message_type,
255
+ intent_level: messageLog.intent_level,
256
+ related_task_id: messageLog.related_task_id,
257
+ metadata: messageLog.metadata,
258
+ trace_id: messageLog.trace_id,
259
+ created_at: messageLog.created_at,
260
+ chat_name: chats.name,
261
+ })
262
+ .from(messageLog)
263
+ .leftJoin(chats, eq(messageLog.chat_id, chats.chat_id))
264
+ .where(whereClause)
244
265
  .orderBy(orderBy)
245
266
  .limit(limit)
246
267
  .offset(offset)
@@ -354,7 +375,7 @@ export function upsertChat(db, data) {
354
375
  bot_count: data.bot_count,
355
376
  metadata: data.metadata,
356
377
  last_synced_at: data.last_synced_at,
357
- updated_at: sql `(datetime('now'))`,
378
+ updated_at: sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`,
358
379
  },
359
380
  })
360
381
  .returning()
@@ -391,7 +412,7 @@ export function upsertChatMember(db, data) {
391
412
  .get();
392
413
  if (existing) {
393
414
  return db.update(chatMembers)
394
- .set({ role: data.role ?? existing.role, synced_at: sql `(datetime('now'))` })
415
+ .set({ role: data.role ?? existing.role, synced_at: sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))` })
395
416
  .where(eq(chatMembers.id, existing.id))
396
417
  .returning()
397
418
  .get();
@@ -425,7 +446,7 @@ export function getMemberChats(db, memberId) {
425
446
  return db.select({
426
447
  chat_id: chats.chat_id,
427
448
  name: chats.name,
428
- chat_type: chats.chat_type,
449
+ chat_mode: chats.chat_mode,
429
450
  chat_tag: chats.chat_tag,
430
451
  user_count: chats.user_count,
431
452
  role: chatMembers.role,
@@ -452,7 +473,7 @@ export function upsertProject(db, data) {
452
473
  description: data.description,
453
474
  platform: data.platform,
454
475
  claude_md: data.claude_md,
455
- updated_at: sql `(datetime('now'))`,
476
+ updated_at: sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`,
456
477
  },
457
478
  })
458
479
  .returning()
@@ -506,7 +527,7 @@ export function getProjectWithRepos(db, projectId) {
506
527
  }
507
528
  // ── CC Sessions CRUD ──
508
529
  export function insertCCSession(db, data) {
509
- return db.insert(ccSessions).values(data).returning().get();
530
+ return db.insert(ccSessions).values(data).onConflictDoNothing({ target: ccSessions.session_id }).returning().get();
510
531
  }
511
532
  export function getCCSessionsByTask(db, taskId) {
512
533
  return db.select().from(ccSessions)
@@ -8,6 +8,6 @@ export const auditEvents = sqliteTable('audit_events', {
8
8
  summary: text('summary').notNull(),
9
9
  detail: text('detail'), // JSON 字符串
10
10
  file_ref: text('file_ref'),
11
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
11
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
12
12
  });
13
13
  //# sourceMappingURL=audit-events.js.map
@@ -2,13 +2,13 @@ import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
2
2
  import { sql } from 'drizzle-orm';
3
3
  export const ccSessions = sqliteTable('cc_sessions', {
4
4
  id: integer('id').primaryKey({ autoIncrement: true }),
5
- session_id: text('session_id').notNull(),
5
+ session_id: text('session_id').notNull().unique(),
6
6
  role: text('role').notNull(), // 'loid' | 'yor'
7
7
  instance_id: text('instance_id'),
8
8
  task_id: text('task_id'),
9
9
  chat_id: text('chat_id'),
10
10
  project_path: text('project_path'),
11
- started_at: text('started_at').notNull().default(sql `(datetime('now'))`),
11
+ started_at: text('started_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
12
12
  ended_at: text('ended_at'),
13
13
  });
14
14
  //# sourceMappingURL=cc-sessions.js.map
@@ -18,9 +18,9 @@ export const chats = sqliteTable('chats', {
18
18
  user_count: integer('user_count'),
19
19
  bot_count: integer('bot_count'),
20
20
  metadata: text('metadata'), // JSON 扩展
21
- first_seen_at: text('first_seen_at').notNull().default(sql `(datetime('now'))`),
21
+ first_seen_at: text('first_seen_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
22
22
  last_synced_at: text('last_synced_at'),
23
- updated_at: text('updated_at').notNull().default(sql `(datetime('now'))`),
23
+ updated_at: text('updated_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
24
24
  });
25
25
  // chat_members 关联表 — 群 ↔ 人 多对多
26
26
  export const chatMembers = sqliteTable('chat_members', {
@@ -28,6 +28,6 @@ export const chatMembers = sqliteTable('chat_members', {
28
28
  chat_id: text('chat_id').notNull().references(() => chats.chat_id),
29
29
  member_id: text('member_id').notNull().references(() => orgMembers.member_id),
30
30
  role: text('role').default('member'), // owner / admin / member
31
- synced_at: text('synced_at').notNull().default(sql `(datetime('now'))`),
31
+ synced_at: text('synced_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
32
32
  });
33
33
  //# sourceMappingURL=chats.js.map
@@ -13,6 +13,6 @@ export const commitments = sqliteTable('commitments', {
13
13
  deadline: text('deadline'),
14
14
  status: text('status').notNull().default('active'),
15
15
  break_reason: text('break_reason'),
16
- promised_at: text('promised_at').notNull().default(sql `(datetime('now'))`),
16
+ promised_at: text('promised_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
17
17
  });
18
18
  //# sourceMappingURL=commitments.js.map
@@ -9,6 +9,6 @@ export const communicationEvents = sqliteTable('communication_events', {
9
9
  summary: text('summary').notNull(),
10
10
  raw_content_path: text('raw_content_path'),
11
11
  opportunity_id: text('opportunity_id'),
12
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
12
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
13
13
  });
14
14
  //# sourceMappingURL=communication-events.js.map
@@ -15,6 +15,6 @@ export const messageLog = sqliteTable('message_log', {
15
15
  related_task_id: text('related_task_id'),
16
16
  metadata: text('metadata'), // JSON
17
17
  trace_id: text('trace_id'),
18
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
18
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
19
19
  });
20
20
  //# sourceMappingURL=message-log.js.map
@@ -17,7 +17,7 @@ export const opportunities = sqliteTable('opportunities', {
17
17
  score_permission: real('score_permission'),
18
18
  total_score: real('total_score'),
19
19
  converted_task_id: text('converted_task_id').references(() => tasks.task_id),
20
- detected_at: text('detected_at').notNull().default(sql `(datetime('now'))`),
20
+ detected_at: text('detected_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
21
21
  claimed_at: text('claimed_at'),
22
22
  });
23
23
  //# sourceMappingURL=opportunities.js.map
@@ -17,7 +17,7 @@ export const orgMembers = sqliteTable('org_members', {
17
17
  avatar_url: text('avatar_url'),
18
18
  metadata: text('metadata'), // JSON 扩展
19
19
  last_synced_at: text('last_synced_at'),
20
- updated_at: text('updated_at').notNull().default(sql `(datetime('now'))`),
20
+ updated_at: text('updated_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
21
21
  });
22
22
  export const orgOwnership = sqliteTable('org_ownership', {
23
23
  id: integer('id').primaryKey({ autoIncrement: true }),
@@ -6,8 +6,8 @@ export const projects = sqliteTable('projects', {
6
6
  description: text('description'),
7
7
  platform: text('platform').default('github'), // github | gitlab | local
8
8
  claude_md: text('claude_md'),
9
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
10
- updated_at: text('updated_at').notNull().default(sql `(datetime('now'))`),
9
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
10
+ updated_at: text('updated_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
11
11
  deleted_at: text('deleted_at'), // null = 活跃,有值 = 已软删除
12
12
  });
13
13
  // project_repos 关联表 — 项目 ↔ 仓库 一对多
@@ -18,6 +18,6 @@ export const projectRepos = sqliteTable('project_repos', {
18
18
  git_url: text('git_url'), // 远程仓库地址,用于自动 clone
19
19
  repo_path: text('repo_path'), // 主仓库绝对路径
20
20
  default_branch: text('default_branch').default('main'),
21
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
21
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
22
22
  });
23
23
  //# sourceMappingURL=projects.js.map
@@ -30,8 +30,8 @@ export const tasks = sqliteTable('tasks', {
30
30
  // 文件路径
31
31
  workspace_path: text('workspace_path'),
32
32
  // 时间戳
33
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
34
- updated_at: text('updated_at').notNull().default(sql `(datetime('now'))`),
33
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
34
+ updated_at: text('updated_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
35
35
  });
36
36
  export const taskClarifications = sqliteTable('task_clarifications', {
37
37
  id: integer('id').primaryKey({ autoIncrement: true }),
@@ -40,7 +40,7 @@ export const taskClarifications = sqliteTable('task_clarifications', {
40
40
  answer: text('answer'),
41
41
  asked_by: text('asked_by').notNull().default('loid'),
42
42
  answered_by: text('answered_by'),
43
- asked_at: text('asked_at').notNull().default(sql `(datetime('now'))`),
43
+ asked_at: text('asked_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
44
44
  answered_at: text('answered_at'),
45
45
  });
46
46
  //# sourceMappingURL=tasks.js.map
@@ -14,6 +14,6 @@ export const traceSpans = sqliteTable('trace_spans', {
14
14
  output: text('output'), // JSON
15
15
  error: text('error'),
16
16
  metadata: text('metadata'), // JSON
17
- created_at: text('created_at').notNull().default(sql `(datetime('now'))`),
17
+ created_at: text('created_at').notNull().default(sql `(strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))`),
18
18
  });
19
19
  //# sourceMappingURL=trace-spans.js.map
@@ -0,0 +1,5 @@
1
+ -- 先删除重复的 cc_sessions 记录(保留每个 session_id 中 id 最小的那条)
2
+ DELETE FROM `cc_sessions` WHERE `id` NOT IN (
3
+ SELECT MIN(`id`) FROM `cc_sessions` GROUP BY `session_id`
4
+ );--> statement-breakpoint
5
+ CREATE UNIQUE INDEX `cc_sessions_session_id_unique` ON `cc_sessions` (`session_id`);