feique 1.1.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.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +220 -0
  3. package/README.md +265 -0
  4. package/dist/backend/claude.d.ts +36 -0
  5. package/dist/backend/claude.js +358 -0
  6. package/dist/backend/claude.js.map +1 -0
  7. package/dist/backend/codex.d.ts +31 -0
  8. package/dist/backend/codex.js +100 -0
  9. package/dist/backend/codex.js.map +1 -0
  10. package/dist/backend/factory.d.ts +9 -0
  11. package/dist/backend/factory.js +56 -0
  12. package/dist/backend/factory.js.map +1 -0
  13. package/dist/backend/types.d.ts +54 -0
  14. package/dist/backend/types.js +2 -0
  15. package/dist/backend/types.js.map +1 -0
  16. package/dist/bridge/commands.d.ts +135 -0
  17. package/dist/bridge/commands.js +860 -0
  18. package/dist/bridge/commands.js.map +1 -0
  19. package/dist/bridge/service.d.ts +160 -0
  20. package/dist/bridge/service.js +3785 -0
  21. package/dist/bridge/service.js.map +1 -0
  22. package/dist/bridge/task-queue.d.ts +14 -0
  23. package/dist/bridge/task-queue.js +81 -0
  24. package/dist/bridge/task-queue.js.map +1 -0
  25. package/dist/bridge/types.d.ts +39 -0
  26. package/dist/bridge/types.js +2 -0
  27. package/dist/bridge/types.js.map +1 -0
  28. package/dist/cli.d.ts +2 -0
  29. package/dist/cli.js +1199 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/codex/capabilities.d.ts +20 -0
  32. package/dist/codex/capabilities.js +41 -0
  33. package/dist/codex/capabilities.js.map +1 -0
  34. package/dist/codex/runner.d.ts +47 -0
  35. package/dist/codex/runner.js +294 -0
  36. package/dist/codex/runner.js.map +1 -0
  37. package/dist/codex/session-index.d.ts +22 -0
  38. package/dist/codex/session-index.js +205 -0
  39. package/dist/codex/session-index.js.map +1 -0
  40. package/dist/collaboration/awareness.d.ts +36 -0
  41. package/dist/collaboration/awareness.js +107 -0
  42. package/dist/collaboration/awareness.js.map +1 -0
  43. package/dist/collaboration/digest.d.ts +65 -0
  44. package/dist/collaboration/digest.js +178 -0
  45. package/dist/collaboration/digest.js.map +1 -0
  46. package/dist/collaboration/handoff.d.ts +66 -0
  47. package/dist/collaboration/handoff.js +94 -0
  48. package/dist/collaboration/handoff.js.map +1 -0
  49. package/dist/collaboration/insights.d.ts +24 -0
  50. package/dist/collaboration/insights.js +243 -0
  51. package/dist/collaboration/insights.js.map +1 -0
  52. package/dist/collaboration/knowledge.d.ts +26 -0
  53. package/dist/collaboration/knowledge.js +105 -0
  54. package/dist/collaboration/knowledge.js.map +1 -0
  55. package/dist/collaboration/timeline.d.ts +31 -0
  56. package/dist/collaboration/timeline.js +150 -0
  57. package/dist/collaboration/timeline.js.map +1 -0
  58. package/dist/collaboration/trust.d.ts +49 -0
  59. package/dist/collaboration/trust.js +176 -0
  60. package/dist/collaboration/trust.js.map +1 -0
  61. package/dist/config/codex-skill.d.ts +7 -0
  62. package/dist/config/codex-skill.js +44 -0
  63. package/dist/config/codex-skill.js.map +1 -0
  64. package/dist/config/doctor.d.ts +12 -0
  65. package/dist/config/doctor.js +314 -0
  66. package/dist/config/doctor.js.map +1 -0
  67. package/dist/config/init.d.ts +3 -0
  68. package/dist/config/init.js +123 -0
  69. package/dist/config/init.js.map +1 -0
  70. package/dist/config/load.d.ts +33 -0
  71. package/dist/config/load.js +252 -0
  72. package/dist/config/load.js.map +1 -0
  73. package/dist/config/mutate.d.ts +21 -0
  74. package/dist/config/mutate.js +86 -0
  75. package/dist/config/mutate.js.map +1 -0
  76. package/dist/config/paths.d.ts +3 -0
  77. package/dist/config/paths.js +33 -0
  78. package/dist/config/paths.js.map +1 -0
  79. package/dist/config/schema.d.ts +308 -0
  80. package/dist/config/schema.js +250 -0
  81. package/dist/config/schema.js.map +1 -0
  82. package/dist/control-plane/project-session.d.ts +67 -0
  83. package/dist/control-plane/project-session.js +234 -0
  84. package/dist/control-plane/project-session.js.map +1 -0
  85. package/dist/feishu/base.d.ts +19 -0
  86. package/dist/feishu/base.js +93 -0
  87. package/dist/feishu/base.js.map +1 -0
  88. package/dist/feishu/cards.d.ts +22 -0
  89. package/dist/feishu/cards.js +144 -0
  90. package/dist/feishu/cards.js.map +1 -0
  91. package/dist/feishu/client.d.ts +61 -0
  92. package/dist/feishu/client.js +315 -0
  93. package/dist/feishu/client.js.map +1 -0
  94. package/dist/feishu/diagnostics.d.ts +42 -0
  95. package/dist/feishu/diagnostics.js +194 -0
  96. package/dist/feishu/diagnostics.js.map +1 -0
  97. package/dist/feishu/doc.d.ts +13 -0
  98. package/dist/feishu/doc.js +59 -0
  99. package/dist/feishu/doc.js.map +1 -0
  100. package/dist/feishu/extractors.d.ts +7 -0
  101. package/dist/feishu/extractors.js +215 -0
  102. package/dist/feishu/extractors.js.map +1 -0
  103. package/dist/feishu/long-connection.d.ts +12 -0
  104. package/dist/feishu/long-connection.js +41 -0
  105. package/dist/feishu/long-connection.js.map +1 -0
  106. package/dist/feishu/message-resource.d.ts +14 -0
  107. package/dist/feishu/message-resource.js +309 -0
  108. package/dist/feishu/message-resource.js.map +1 -0
  109. package/dist/feishu/replay.d.ts +37 -0
  110. package/dist/feishu/replay.js +114 -0
  111. package/dist/feishu/replay.js.map +1 -0
  112. package/dist/feishu/task.d.ts +18 -0
  113. package/dist/feishu/task.js +86 -0
  114. package/dist/feishu/task.js.map +1 -0
  115. package/dist/feishu/text.d.ts +23 -0
  116. package/dist/feishu/text.js +155 -0
  117. package/dist/feishu/text.js.map +1 -0
  118. package/dist/feishu/webhook.d.ts +23 -0
  119. package/dist/feishu/webhook.js +130 -0
  120. package/dist/feishu/webhook.js.map +1 -0
  121. package/dist/feishu/wiki.d.ts +52 -0
  122. package/dist/feishu/wiki.js +300 -0
  123. package/dist/feishu/wiki.js.map +1 -0
  124. package/dist/index.d.ts +9 -0
  125. package/dist/index.js +9 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/knowledge/search.d.ts +11 -0
  128. package/dist/knowledge/search.js +83 -0
  129. package/dist/knowledge/search.js.map +1 -0
  130. package/dist/logging.d.ts +3 -0
  131. package/dist/logging.js +40 -0
  132. package/dist/logging.js.map +1 -0
  133. package/dist/mcp/server.d.ts +34 -0
  134. package/dist/mcp/server.js +1196 -0
  135. package/dist/mcp/server.js.map +1 -0
  136. package/dist/memory/embedding-factory.d.ts +6 -0
  137. package/dist/memory/embedding-factory.js +20 -0
  138. package/dist/memory/embedding-factory.js.map +1 -0
  139. package/dist/memory/embeddings.d.ts +40 -0
  140. package/dist/memory/embeddings.js +150 -0
  141. package/dist/memory/embeddings.js.map +1 -0
  142. package/dist/memory/ollama-embeddings.d.ts +63 -0
  143. package/dist/memory/ollama-embeddings.js +215 -0
  144. package/dist/memory/ollama-embeddings.js.map +1 -0
  145. package/dist/memory/retrieve.d.ts +17 -0
  146. package/dist/memory/retrieve.js +29 -0
  147. package/dist/memory/retrieve.js.map +1 -0
  148. package/dist/memory/summarize.d.ts +13 -0
  149. package/dist/memory/summarize.js +58 -0
  150. package/dist/memory/summarize.js.map +1 -0
  151. package/dist/observability/cost.d.ts +12 -0
  152. package/dist/observability/cost.js +22 -0
  153. package/dist/observability/cost.js.map +1 -0
  154. package/dist/observability/dashboard-html.d.ts +5 -0
  155. package/dist/observability/dashboard-html.js +304 -0
  156. package/dist/observability/dashboard-html.js.map +1 -0
  157. package/dist/observability/metrics.d.ts +36 -0
  158. package/dist/observability/metrics.js +230 -0
  159. package/dist/observability/metrics.js.map +1 -0
  160. package/dist/observability/readiness.d.ts +31 -0
  161. package/dist/observability/readiness.js +57 -0
  162. package/dist/observability/readiness.js.map +1 -0
  163. package/dist/observability/server.d.ts +84 -0
  164. package/dist/observability/server.js +181 -0
  165. package/dist/observability/server.js.map +1 -0
  166. package/dist/projects/paths.d.ts +9 -0
  167. package/dist/projects/paths.js +30 -0
  168. package/dist/projects/paths.js.map +1 -0
  169. package/dist/runtime/instance-lock.d.ts +12 -0
  170. package/dist/runtime/instance-lock.js +99 -0
  171. package/dist/runtime/instance-lock.js.map +1 -0
  172. package/dist/runtime/process.d.ts +2 -0
  173. package/dist/runtime/process.js +43 -0
  174. package/dist/runtime/process.js.map +1 -0
  175. package/dist/runtime/shutdown.d.ts +11 -0
  176. package/dist/runtime/shutdown.js +38 -0
  177. package/dist/runtime/shutdown.js.map +1 -0
  178. package/dist/security/access.d.ts +13 -0
  179. package/dist/security/access.js +160 -0
  180. package/dist/security/access.js.map +1 -0
  181. package/dist/service/install.d.ts +19 -0
  182. package/dist/service/install.js +35 -0
  183. package/dist/service/install.js.map +1 -0
  184. package/dist/service/templates.d.ts +22 -0
  185. package/dist/service/templates.js +118 -0
  186. package/dist/service/templates.js.map +1 -0
  187. package/dist/state/audit-log.d.ts +33 -0
  188. package/dist/state/audit-log.js +116 -0
  189. package/dist/state/audit-log.js.map +1 -0
  190. package/dist/state/config-history-store.d.ts +27 -0
  191. package/dist/state/config-history-store.js +65 -0
  192. package/dist/state/config-history-store.js.map +1 -0
  193. package/dist/state/handoff-store.d.ts +20 -0
  194. package/dist/state/handoff-store.js +97 -0
  195. package/dist/state/handoff-store.js.map +1 -0
  196. package/dist/state/idempotency-store.d.ts +19 -0
  197. package/dist/state/idempotency-store.js +84 -0
  198. package/dist/state/idempotency-store.js.map +1 -0
  199. package/dist/state/memory-store.d.ts +137 -0
  200. package/dist/state/memory-store.js +713 -0
  201. package/dist/state/memory-store.js.map +1 -0
  202. package/dist/state/pending-command-store.d.ts +30 -0
  203. package/dist/state/pending-command-store.js +108 -0
  204. package/dist/state/pending-command-store.js.map +1 -0
  205. package/dist/state/run-state-store.d.ts +58 -0
  206. package/dist/state/run-state-store.js +269 -0
  207. package/dist/state/run-state-store.js.map +1 -0
  208. package/dist/state/session-store.d.ts +56 -0
  209. package/dist/state/session-store.js +275 -0
  210. package/dist/state/session-store.js.map +1 -0
  211. package/dist/state/trust-store.d.ts +15 -0
  212. package/dist/state/trust-store.js +53 -0
  213. package/dist/state/trust-store.js.map +1 -0
  214. package/dist/utils/fs.d.ts +4 -0
  215. package/dist/utils/fs.js +26 -0
  216. package/dist/utils/fs.js.map +1 -0
  217. package/dist/utils/json.d.ts +1 -0
  218. package/dist/utils/json.js +9 -0
  219. package/dist/utils/json.js.map +1 -0
  220. package/dist/utils/path.d.ts +3 -0
  221. package/dist/utils/path.js +22 -0
  222. package/dist/utils/path.js.map +1 -0
  223. package/dist/utils/serial-executor.d.ts +5 -0
  224. package/dist/utils/serial-executor.js +12 -0
  225. package/dist/utils/serial-executor.js.map +1 -0
  226. package/package.json +71 -0
  227. package/skills/feique-session/SKILL.md +27 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Direction 3: 接力与评审 — Relay & Review Workflows
3
+ *
4
+ * Enables structured handoff of AI sessions between team members
5
+ * and review workflows for AI-generated output.
6
+ */
7
+ export type HandoffStatus = 'pending' | 'accepted' | 'expired';
8
+ export type ReviewStatus = 'pending' | 'approved' | 'rejected';
9
+ export interface HandoffRecord {
10
+ id: string;
11
+ from_actor_id: string;
12
+ from_actor_name?: string;
13
+ to_actor_id?: string;
14
+ project_alias: string;
15
+ conversation_key: string;
16
+ thread_id?: string;
17
+ summary: string;
18
+ context_snapshot: {
19
+ last_prompt?: string;
20
+ last_response_excerpt?: string;
21
+ files_touched?: string[];
22
+ decisions?: string[];
23
+ };
24
+ status: HandoffStatus;
25
+ created_at: string;
26
+ accepted_at?: string;
27
+ accepted_by?: string;
28
+ }
29
+ export interface ReviewRecord {
30
+ id: string;
31
+ run_id: string;
32
+ project_alias: string;
33
+ chat_id: string;
34
+ actor_id: string;
35
+ content_excerpt: string;
36
+ status: ReviewStatus;
37
+ reviewer_id?: string;
38
+ review_comment?: string;
39
+ created_at: string;
40
+ resolved_at?: string;
41
+ }
42
+ export declare function createHandoff(input: {
43
+ from_actor_id: string;
44
+ from_actor_name?: string;
45
+ to_actor_id?: string;
46
+ project_alias: string;
47
+ conversation_key: string;
48
+ thread_id?: string;
49
+ summary: string;
50
+ last_prompt?: string;
51
+ last_response_excerpt?: string;
52
+ files_touched?: string[];
53
+ decisions?: string[];
54
+ }): HandoffRecord;
55
+ export declare function acceptHandoff(record: HandoffRecord, acceptedBy: string): HandoffRecord;
56
+ export declare function createReview(input: {
57
+ run_id: string;
58
+ project_alias: string;
59
+ chat_id: string;
60
+ actor_id: string;
61
+ content_excerpt: string;
62
+ }): ReviewRecord;
63
+ export declare function resolveReview(record: ReviewRecord, decision: 'approved' | 'rejected', reviewerId: string, comment?: string): ReviewRecord;
64
+ export declare function formatHandoff(record: HandoffRecord): string;
65
+ export declare function formatReview(record: ReviewRecord): string;
66
+ export declare function formatReviewResult(record: ReviewRecord): string;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Direction 3: 接力与评审 — Relay & Review Workflows
3
+ *
4
+ * Enables structured handoff of AI sessions between team members
5
+ * and review workflows for AI-generated output.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ export function createHandoff(input) {
9
+ return {
10
+ id: randomUUID(),
11
+ from_actor_id: input.from_actor_id,
12
+ from_actor_name: input.from_actor_name,
13
+ to_actor_id: input.to_actor_id,
14
+ project_alias: input.project_alias,
15
+ conversation_key: input.conversation_key,
16
+ thread_id: input.thread_id,
17
+ summary: input.summary,
18
+ context_snapshot: {
19
+ last_prompt: input.last_prompt,
20
+ last_response_excerpt: input.last_response_excerpt,
21
+ files_touched: input.files_touched,
22
+ decisions: input.decisions,
23
+ },
24
+ status: 'pending',
25
+ created_at: new Date().toISOString(),
26
+ };
27
+ }
28
+ export function acceptHandoff(record, acceptedBy) {
29
+ return {
30
+ ...record,
31
+ status: 'accepted',
32
+ accepted_at: new Date().toISOString(),
33
+ accepted_by: acceptedBy,
34
+ };
35
+ }
36
+ export function createReview(input) {
37
+ return {
38
+ id: randomUUID(),
39
+ run_id: input.run_id,
40
+ project_alias: input.project_alias,
41
+ chat_id: input.chat_id,
42
+ actor_id: input.actor_id,
43
+ content_excerpt: input.content_excerpt,
44
+ status: 'pending',
45
+ created_at: new Date().toISOString(),
46
+ };
47
+ }
48
+ export function resolveReview(record, decision, reviewerId, comment) {
49
+ return {
50
+ ...record,
51
+ status: decision,
52
+ reviewer_id: reviewerId,
53
+ review_comment: comment,
54
+ resolved_at: new Date().toISOString(),
55
+ };
56
+ }
57
+ export function formatHandoff(record) {
58
+ const lines = [];
59
+ const target = record.to_actor_id ? `→ ${record.to_actor_id}` : '→ 任何人可接';
60
+ lines.push(`🤝 会话交接 [${record.project_alias}]`);
61
+ lines.push(` 发起: ${record.from_actor_name ?? record.from_actor_id} ${target}`);
62
+ lines.push(` 摘要: ${record.summary}`);
63
+ if (record.context_snapshot.last_prompt) {
64
+ lines.push(` 最近提问: "${truncate(record.context_snapshot.last_prompt, 80)}"`);
65
+ }
66
+ if (record.context_snapshot.files_touched?.length) {
67
+ lines.push(` 涉及文件: ${record.context_snapshot.files_touched.join(', ')}`);
68
+ }
69
+ if (record.context_snapshot.decisions?.length) {
70
+ lines.push(` 已有决策: ${record.context_snapshot.decisions.join('; ')}`);
71
+ }
72
+ lines.push(`\n使用 /pickup ${record.id.slice(0, 8)} 接手此任务`);
73
+ return lines.join('\n');
74
+ }
75
+ export function formatReview(record) {
76
+ const lines = [];
77
+ lines.push(`📋 评审请求 [${record.project_alias}]`);
78
+ lines.push(` 发起人: ${record.actor_id}`);
79
+ lines.push(` 内容: "${truncate(record.content_excerpt, 120)}"`);
80
+ lines.push(`\n使用 /approve 或 /reject [原因] 来完成评审`);
81
+ return lines.join('\n');
82
+ }
83
+ export function formatReviewResult(record) {
84
+ const icon = record.status === 'approved' ? '✅' : '❌';
85
+ const action = record.status === 'approved' ? '已批准' : '已打回';
86
+ const comment = record.review_comment ? `\n 评语: ${record.review_comment}` : '';
87
+ return `${icon} 评审${action} by ${record.reviewer_id ?? '评审人'}${comment}`;
88
+ }
89
+ function truncate(text, maxLength) {
90
+ if (text.length <= maxLength)
91
+ return text;
92
+ return text.slice(0, maxLength - 1) + '…';
93
+ }
94
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/collaboration/handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Direction 4: 瓶颈诊断与效率体检 — Bottleneck Diagnostics
3
+ *
4
+ * Analyzes audit logs and run history to detect patterns:
5
+ * retry loops, duplicate work, queue bottlenecks, error clusters.
6
+ */
7
+ import type { RunState } from '../state/run-state-store.js';
8
+ import type { AuditEvent } from '../state/audit-log.js';
9
+ export type InsightSeverity = 'info' | 'warning' | 'critical';
10
+ export type InsightKind = 'retry_pattern' | 'duplicate_work' | 'queue_bottleneck' | 'error_cluster' | 'long_running' | 'idle_project';
11
+ export interface TeamInsight {
12
+ kind: InsightKind;
13
+ severity: InsightSeverity;
14
+ title: string;
15
+ detail: string;
16
+ affected_projects: string[];
17
+ affected_actors: string[];
18
+ suggestion: string;
19
+ }
20
+ /**
21
+ * Run all analysis passes on recent run data.
22
+ */
23
+ export declare function analyzeTeamHealth(runs: RunState[], auditEvents: AuditEvent[]): TeamInsight[];
24
+ export declare function formatInsightsReport(insights: TeamInsight[]): string;
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Direction 4: 瓶颈诊断与效率体检 — Bottleneck Diagnostics
3
+ *
4
+ * Analyzes audit logs and run history to detect patterns:
5
+ * retry loops, duplicate work, queue bottlenecks, error clusters.
6
+ */
7
+ /**
8
+ * Run all analysis passes on recent run data.
9
+ */
10
+ export function analyzeTeamHealth(runs, auditEvents) {
11
+ const insights = [];
12
+ insights.push(...detectRetryPatterns(runs));
13
+ insights.push(...detectDuplicateWork(runs));
14
+ insights.push(...detectQueueBottlenecks(runs));
15
+ insights.push(...detectErrorClusters(runs));
16
+ insights.push(...detectLongRunning(runs));
17
+ // Sort: critical first, then warning, then info
18
+ const order = { critical: 0, warning: 1, info: 2 };
19
+ insights.sort((a, b) => order[a.severity] - order[b.severity]);
20
+ return insights;
21
+ }
22
+ /**
23
+ * Detect actors who start multiple sessions on the same project in a short window.
24
+ * This suggests the AI is not being effective and the person is retrying.
25
+ */
26
+ function detectRetryPatterns(runs) {
27
+ const insights = [];
28
+ const byActorProject = groupBy(runs, (r) => `${r.actor_id}::${r.project_alias}`);
29
+ for (const [key, group] of Object.entries(byActorProject)) {
30
+ const recent = group.filter((r) => isWithinHours(r.started_at, 4));
31
+ const failures = recent.filter((r) => r.status === 'failure');
32
+ if (recent.length >= 4 && failures.length >= 2) {
33
+ const parts = key.split('::');
34
+ const actorId = parts[0] ?? 'unknown';
35
+ const projectAlias = parts[1] ?? 'unknown';
36
+ insights.push({
37
+ kind: 'retry_pattern',
38
+ severity: 'warning',
39
+ title: `${actorId} 在 ${projectAlias} 上反复重试`,
40
+ detail: `过去 4 小时内发起 ${recent.length} 次运行,其中 ${failures.length} 次失败`,
41
+ affected_projects: [projectAlias],
42
+ affected_actors: [actorId],
43
+ suggestion: '可能需要换个思路,或者寻求团队协助',
44
+ });
45
+ }
46
+ }
47
+ return insights;
48
+ }
49
+ /**
50
+ * Detect similar prompts from different actors on the same project.
51
+ */
52
+ function detectDuplicateWork(runs) {
53
+ const insights = [];
54
+ const recentRuns = runs.filter((r) => isWithinHours(r.started_at, 24));
55
+ // Group by project, then compare prompts across actors
56
+ const byProject = groupBy(recentRuns, (r) => r.project_alias);
57
+ for (const [project, group] of Object.entries(byProject)) {
58
+ const byActor = groupBy(group, (r) => r.actor_id ?? 'unknown');
59
+ const actors = Object.keys(byActor);
60
+ if (actors.length < 2)
61
+ continue;
62
+ // Compare prompt excerpts between actors (simple overlap check)
63
+ for (let i = 0; i < actors.length; i++) {
64
+ for (let j = i + 1; j < actors.length; j++) {
65
+ const actorA = actors[i];
66
+ const actorB = actors[j];
67
+ const groupA = byActor[actorA];
68
+ const groupB = byActor[actorB];
69
+ if (!groupA || !groupB)
70
+ continue;
71
+ const promptsA = groupA.map((r) => r.prompt_excerpt).filter(Boolean);
72
+ const promptsB = groupB.map((r) => r.prompt_excerpt).filter(Boolean);
73
+ const similar = findSimilarPrompts(promptsA, promptsB);
74
+ if (similar.length > 0) {
75
+ insights.push({
76
+ kind: 'duplicate_work',
77
+ severity: 'info',
78
+ title: `${actorA} 和 ${actorB} 在 ${project} 上可能有重复工作`,
79
+ detail: `发现 ${similar.length} 组相似的提问`,
80
+ affected_projects: [project],
81
+ affected_actors: [actorA, actorB],
82
+ suggestion: '建议沟通确认是否在做相同的事,避免重复劳动',
83
+ });
84
+ }
85
+ }
86
+ }
87
+ }
88
+ return insights;
89
+ }
90
+ /**
91
+ * Detect projects where queuing happens frequently.
92
+ */
93
+ function detectQueueBottlenecks(runs) {
94
+ const insights = [];
95
+ const recentRuns = runs.filter((r) => isWithinHours(r.started_at, 24));
96
+ const byProject = groupBy(recentRuns, (r) => r.project_alias);
97
+ for (const [project, group] of Object.entries(byProject)) {
98
+ const queuedRuns = group.filter((r) => r.status === 'queued' || r.status_detail?.includes('queued'));
99
+ if (queuedRuns.length >= 3) {
100
+ const actors = [...new Set(group.map((r) => r.actor_id).filter(Boolean))];
101
+ insights.push({
102
+ kind: 'queue_bottleneck',
103
+ severity: queuedRuns.length >= 5 ? 'warning' : 'info',
104
+ title: `${project} 频繁出现排队`,
105
+ detail: `过去 24 小时有 ${queuedRuns.length} 次排队,${actors.length} 位成员受影响`,
106
+ affected_projects: [project],
107
+ affected_actors: actors,
108
+ suggestion: '考虑增加并发处理能力或拆分项目粒度',
109
+ });
110
+ }
111
+ }
112
+ return insights;
113
+ }
114
+ /**
115
+ * Detect projects with high failure rates.
116
+ */
117
+ function detectErrorClusters(runs) {
118
+ const insights = [];
119
+ const recentRuns = runs.filter((r) => isWithinHours(r.started_at, 24));
120
+ const byProject = groupBy(recentRuns, (r) => r.project_alias);
121
+ for (const [project, group] of Object.entries(byProject)) {
122
+ const total = group.length;
123
+ const failures = group.filter((r) => r.status === 'failure');
124
+ const failureRate = total > 0 ? failures.length / total : 0;
125
+ if (failures.length >= 3 && failureRate > 0.4) {
126
+ const actors = [...new Set(failures.map((r) => r.actor_id).filter(Boolean))];
127
+ const severity = failureRate > 0.7 ? 'critical' : 'warning';
128
+ insights.push({
129
+ kind: 'error_cluster',
130
+ severity,
131
+ title: `${project} 失败率异常 (${Math.round(failureRate * 100)}%)`,
132
+ detail: `过去 24 小时 ${total} 次运行中 ${failures.length} 次失败`,
133
+ affected_projects: [project],
134
+ affected_actors: actors,
135
+ suggestion: '检查项目配置或底层依赖是否有问题',
136
+ });
137
+ }
138
+ }
139
+ return insights;
140
+ }
141
+ /**
142
+ * Detect runs that are taking unusually long.
143
+ */
144
+ function detectLongRunning(runs) {
145
+ const insights = [];
146
+ const activeRuns = runs.filter((r) => r.status === 'running');
147
+ for (const run of activeRuns) {
148
+ const elapsed = Date.now() - new Date(run.started_at).getTime();
149
+ const minutes = elapsed / 60_000;
150
+ if (minutes > 20) {
151
+ insights.push({
152
+ kind: 'long_running',
153
+ severity: minutes > 45 ? 'warning' : 'info',
154
+ title: `${run.project_alias} 有运行超过 ${Math.round(minutes)} 分钟的任务`,
155
+ detail: `run ${run.run_id.slice(0, 8)} by ${run.actor_id ?? 'unknown'}`,
156
+ affected_projects: [run.project_alias],
157
+ affected_actors: run.actor_id ? [run.actor_id] : [],
158
+ suggestion: '考虑检查任务是否卡住,或取消后重新拆解',
159
+ });
160
+ }
161
+ }
162
+ return insights;
163
+ }
164
+ export function formatInsightsReport(insights) {
165
+ if (insights.length === 0) {
166
+ return '🏥 团队 AI 协作体检: 一切正常,未发现明显瓶颈。';
167
+ }
168
+ const lines = ['🏥 团队 AI 协作体检报告\n'];
169
+ const criticals = insights.filter((i) => i.severity === 'critical');
170
+ const warnings = insights.filter((i) => i.severity === 'warning');
171
+ const infos = insights.filter((i) => i.severity === 'info');
172
+ if (criticals.length > 0) {
173
+ lines.push(`🔴 严重问题 (${criticals.length})`);
174
+ for (const i of criticals) {
175
+ lines.push(` ${i.title}`);
176
+ lines.push(` ${i.detail}`);
177
+ lines.push(` 💡 ${i.suggestion}`);
178
+ }
179
+ }
180
+ if (warnings.length > 0) {
181
+ lines.push(`\n🟡 需要关注 (${warnings.length})`);
182
+ for (const i of warnings) {
183
+ lines.push(` ${i.title}`);
184
+ lines.push(` ${i.detail}`);
185
+ lines.push(` 💡 ${i.suggestion}`);
186
+ }
187
+ }
188
+ if (infos.length > 0) {
189
+ lines.push(`\n🔵 参考信息 (${infos.length})`);
190
+ for (const i of infos) {
191
+ lines.push(` ${i.title}`);
192
+ lines.push(` ${i.detail}`);
193
+ }
194
+ }
195
+ return lines.join('\n');
196
+ }
197
+ // --- Utility functions ---
198
+ function groupBy(items, keyFn) {
199
+ const result = {};
200
+ for (const item of items) {
201
+ const key = keyFn(item);
202
+ (result[key] ??= []).push(item);
203
+ }
204
+ return result;
205
+ }
206
+ function isWithinHours(isoDate, hours) {
207
+ const ms = Date.now() - new Date(isoDate).getTime();
208
+ return ms < hours * 3600_000;
209
+ }
210
+ /**
211
+ * Simple similarity check: find prompts with significant word overlap.
212
+ */
213
+ function findSimilarPrompts(promptsA, promptsB) {
214
+ const similar = [];
215
+ for (const a of promptsA) {
216
+ for (const b of promptsB) {
217
+ if (computeWordOverlap(a, b) > 0.5) {
218
+ similar.push([a, b]);
219
+ }
220
+ }
221
+ }
222
+ return similar;
223
+ }
224
+ function computeWordOverlap(a, b) {
225
+ const wordsA = new Set(tokenize(a));
226
+ const wordsB = new Set(tokenize(b));
227
+ if (wordsA.size === 0 || wordsB.size === 0)
228
+ return 0;
229
+ let intersection = 0;
230
+ for (const word of wordsA) {
231
+ if (wordsB.has(word))
232
+ intersection++;
233
+ }
234
+ return intersection / Math.min(wordsA.size, wordsB.size);
235
+ }
236
+ function tokenize(text) {
237
+ return text
238
+ .toLowerCase()
239
+ .replace(/[^\p{L}\p{N}\s]/gu, ' ')
240
+ .split(/\s+/)
241
+ .filter((w) => w.length > 1);
242
+ }
243
+ //# sourceMappingURL=insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/collaboration/insights.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,WAAyB;IAC3E,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1C,gDAAgD;IAChD,MAAM,KAAK,GAAoC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAgB;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAEjF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACtC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,GAAG,OAAO,MAAM,YAAY,QAAQ;gBAC3C,MAAM,EAAE,cAAc,MAAM,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,MAAM;gBACnE,iBAAiB,EAAE,CAAC,YAAY,CAAC;gBACjC,eAAe,EAAE,CAAC,OAAO,CAAC;gBAC1B,UAAU,EAAE,mBAAmB;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAgB;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAEvE,uDAAuD;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAE9D,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAEhC,gEAAgE;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;gBACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;gBAEjF,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,gBAAgB;wBACtB,QAAQ,EAAE,MAAM;wBAChB,KAAK,EAAE,GAAG,MAAM,MAAM,MAAM,MAAM,OAAO,WAAW;wBACpD,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,SAAS;wBACrC,iBAAiB,EAAE,CAAC,OAAO,CAAC;wBAC5B,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;wBACjC,UAAU,EAAE,uBAAuB;qBACpC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAgB;IAC9C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAE9D,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAa,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBACrD,KAAK,EAAE,GAAG,OAAO,SAAS;gBAC1B,MAAM,EAAE,aAAa,UAAU,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,SAAS;gBACpE,iBAAiB,EAAE,CAAC,OAAO,CAAC;gBAC5B,eAAe,EAAE,MAAM;gBACvB,UAAU,EAAE,mBAAmB;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAgB;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAE9D,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,GAAG,GAAG,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAa,CAAC;YACzF,MAAM,QAAQ,GAAoB,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAE7E,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,eAAe;gBACrB,QAAQ;gBACR,KAAK,EAAE,GAAG,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI;gBAC7D,MAAM,EAAE,YAAY,KAAK,SAAS,QAAQ,CAAC,MAAM,MAAM;gBACvD,iBAAiB,EAAE,CAAC,OAAO,CAAC;gBAC5B,eAAe,EAAE,MAAM;gBACvB,UAAU,EAAE,kBAAkB;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAgB;IACzC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAE9D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;QAEjC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC3C,KAAK,EAAE,GAAG,GAAG,CAAC,aAAa,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ;gBAChE,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,QAAQ,IAAI,SAAS,EAAE;gBACvE,iBAAiB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;gBACtC,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnD,UAAU,EAAE,qBAAqB;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAuB;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,mBAAmB,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAE5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4BAA4B;AAE5B,SAAS,OAAO,CAAI,KAAU,EAAE,KAA0B;IACxD,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,KAAa;IACnD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACpD,OAAO,EAAE,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAkB,EAAE,QAAkB;IAChE,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAErD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,YAAY,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Direction 2: 会话间知识回路 — Cross-Session Knowledge Loop
3
+ *
4
+ * Extracts insights from completed AI sessions and makes them
5
+ * searchable across the team. Supports manual /learn and /recall.
6
+ */
7
+ import type { MemoryRecord } from '../state/memory-store.js';
8
+ export interface LearnInput {
9
+ project_alias: string;
10
+ chat_id?: string;
11
+ actor_id?: string;
12
+ title: string;
13
+ content: string;
14
+ tags: string[];
15
+ source: 'manual' | 'auto';
16
+ }
17
+ /**
18
+ * Heuristic extraction of key findings from a completed AI run.
19
+ * Returns null if no actionable insight is detected.
20
+ */
21
+ export declare function extractInsights(prompt: string, response: string, projectAlias: string): LearnInput | null;
22
+ /**
23
+ * Build a manual learn input from user command.
24
+ */
25
+ export declare function buildLearnInput(text: string, projectAlias: string, actorId?: string, chatId?: string): LearnInput;
26
+ export declare function formatRecallResults(memories: MemoryRecord[], query: string): string;
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Direction 2: 会话间知识回路 — Cross-Session Knowledge Loop
3
+ *
4
+ * Extracts insights from completed AI sessions and makes them
5
+ * searchable across the team. Supports manual /learn and /recall.
6
+ */
7
+ /**
8
+ * Heuristic extraction of key findings from a completed AI run.
9
+ * Returns null if no actionable insight is detected.
10
+ */
11
+ export function extractInsights(prompt, response, projectAlias) {
12
+ const combined = `${prompt}\n${response}`;
13
+ const lower = combined.toLowerCase();
14
+ // Look for strong signal patterns
15
+ const patterns = [
16
+ { regex: /root\s*cause[::]\s*(.+)/i, tag: 'root-cause' },
17
+ { regex: /根因[::]\s*(.+)/i, tag: 'root-cause' },
18
+ { regex: /solution[::]\s*(.+)/i, tag: 'solution' },
19
+ { regex: /解决方案[::]\s*(.+)/i, tag: 'solution' },
20
+ { regex: /(?:found|discovered)\s+that\s+(.+)/i, tag: 'finding' },
21
+ { regex: /发现[::]\s*(.+)/i, tag: 'finding' },
22
+ { regex: /workaround[::]\s*(.+)/i, tag: 'workaround' },
23
+ { regex: /(?:关键|重要)(?:发现|结论)[::]\s*(.+)/i, tag: 'conclusion' },
24
+ { regex: /breaking\s*change[::]\s*(.+)/i, tag: 'breaking-change' },
25
+ ];
26
+ const findings = [];
27
+ for (const { regex, tag } of patterns) {
28
+ const match = combined.match(regex);
29
+ if (match?.[1]) {
30
+ findings.push({ text: match[1].trim().slice(0, 200), tag });
31
+ }
32
+ }
33
+ if (findings.length === 0)
34
+ return null;
35
+ // Only auto-extract if the response is substantial.
36
+ // Chinese packs ~2x more information per character than English,
37
+ // so 40 chars is a reasonable minimum for both languages.
38
+ if (response.length < 40)
39
+ return null;
40
+ const tags = [...new Set(findings.map((f) => f.tag)), 'auto-extracted'];
41
+ const first = findings[0];
42
+ const title = first.text.slice(0, 80);
43
+ const content = findings.map((f) => `[${f.tag}] ${f.text}`).join('\n');
44
+ return {
45
+ project_alias: projectAlias,
46
+ title,
47
+ content,
48
+ tags,
49
+ source: 'auto',
50
+ };
51
+ }
52
+ /**
53
+ * Build a manual learn input from user command.
54
+ */
55
+ export function buildLearnInput(text, projectAlias, actorId, chatId) {
56
+ // Try to split "title: content" or use first line as title
57
+ const colonIndex = text.indexOf(':');
58
+ const colonIndexEn = text.indexOf(':');
59
+ const splitIndex = colonIndex >= 0 && (colonIndexEn < 0 || colonIndex < colonIndexEn)
60
+ ? colonIndex
61
+ : colonIndexEn;
62
+ let title;
63
+ let content;
64
+ if (splitIndex > 0 && splitIndex < 60) {
65
+ title = text.slice(0, splitIndex).trim();
66
+ content = text.slice(splitIndex + 1).trim() || title;
67
+ }
68
+ else {
69
+ title = text.slice(0, 80).trim();
70
+ content = text;
71
+ }
72
+ return {
73
+ project_alias: projectAlias,
74
+ chat_id: chatId,
75
+ actor_id: actorId,
76
+ title,
77
+ content,
78
+ tags: ['manual'],
79
+ source: 'manual',
80
+ };
81
+ }
82
+ export function formatRecallResults(memories, query) {
83
+ if (memories.length === 0) {
84
+ return `没有找到与 "${query}" 相关的团队知识。`;
85
+ }
86
+ const lines = [`🔍 团队知识检索: "${query}"\n`];
87
+ for (const mem of memories) {
88
+ const pinIcon = mem.pinned ? '📌 ' : '';
89
+ const source = mem.source === 'auto' ? '[自动提取]' : '[手动记录]';
90
+ const by = mem.created_by ? ` by ${mem.created_by}` : '';
91
+ lines.push(`${pinIcon}${mem.title} ${source}${by}`);
92
+ lines.push(` ${truncate(mem.content, 120)}`);
93
+ if (mem.tags.length > 0) {
94
+ lines.push(` 标签: ${mem.tags.join(', ')}`);
95
+ }
96
+ lines.push('');
97
+ }
98
+ return lines.join('\n').trimEnd();
99
+ }
100
+ function truncate(text, maxLength) {
101
+ if (text.length <= maxLength)
102
+ return text;
103
+ return text.slice(0, maxLength - 1) + '…';
104
+ }
105
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/collaboration/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Direction 6: 上下文连续性 — Context Continuity
3
+ *
4
+ * Builds project timelines from audit/run/memory data and generates
5
+ * onboarding context for new team members.
6
+ */
7
+ import type { RunState } from '../state/run-state-store.js';
8
+ import type { MemoryRecord } from '../state/memory-store.js';
9
+ import type { AuditEvent } from '../state/audit-log.js';
10
+ export interface TimelineEvent {
11
+ type: 'run_completed' | 'run_failed' | 'knowledge_added' | 'handoff' | 'config_change' | 'project_switch';
12
+ at: string;
13
+ actor_id?: string;
14
+ project_alias: string;
15
+ summary: string;
16
+ detail?: string;
17
+ }
18
+ /**
19
+ * Build a chronological timeline for a project from multiple data sources.
20
+ */
21
+ export declare function buildProjectTimeline(runs: RunState[], memories: MemoryRecord[], auditEvents: AuditEvent[], projectAlias: string, limit?: number): TimelineEvent[];
22
+ /**
23
+ * Generate an onboarding context summary for a new team member.
24
+ * This is injected into the AI prompt when a new actor_id appears.
25
+ */
26
+ export declare function buildOnboardingContext(timeline: TimelineEvent[], memories: MemoryRecord[], projectAlias: string, maxChars?: number): string;
27
+ export declare function formatTimeline(events: TimelineEvent[]): string;
28
+ /**
29
+ * Detect if an actor is new to a project (never seen in run history).
30
+ */
31
+ export declare function isNewActor(actorId: string, runs: RunState[], projectAlias: string): boolean;