@intrect/openswarm 0.2.2 → 0.4.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 (176) hide show
  1. package/README.md +236 -331
  2. package/config.example.yaml +36 -13
  3. package/dist/adapters/agenticLoop.d.ts +90 -0
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -0
  5. package/dist/adapters/agenticLoop.js +141 -0
  6. package/dist/adapters/agenticLoop.js.map +1 -0
  7. package/dist/adapters/base.d.ts.map +1 -1
  8. package/dist/adapters/base.js +4 -0
  9. package/dist/adapters/base.js.map +1 -1
  10. package/dist/adapters/cryptoQuantAdapter.js +1 -1
  11. package/dist/adapters/cryptoQuantAdapter.js.map +1 -1
  12. package/dist/adapters/gpt.d.ts +19 -0
  13. package/dist/adapters/gpt.d.ts.map +1 -0
  14. package/dist/adapters/gpt.js +251 -0
  15. package/dist/adapters/gpt.js.map +1 -0
  16. package/dist/adapters/index.d.ts +2 -0
  17. package/dist/adapters/index.d.ts.map +1 -1
  18. package/dist/adapters/index.js +6 -0
  19. package/dist/adapters/index.js.map +1 -1
  20. package/dist/adapters/local.d.ts +31 -0
  21. package/dist/adapters/local.d.ts.map +1 -0
  22. package/dist/adapters/local.js +320 -0
  23. package/dist/adapters/local.js.map +1 -0
  24. package/dist/adapters/tools.d.ts +30 -0
  25. package/dist/adapters/tools.d.ts.map +1 -0
  26. package/dist/adapters/tools.js +219 -0
  27. package/dist/adapters/tools.js.map +1 -0
  28. package/dist/adapters/types.d.ts +6 -1
  29. package/dist/adapters/types.d.ts.map +1 -1
  30. package/dist/agents/pairPipeline.d.ts +7 -0
  31. package/dist/agents/pairPipeline.d.ts.map +1 -1
  32. package/dist/agents/pairPipeline.js +99 -7
  33. package/dist/agents/pairPipeline.js.map +1 -1
  34. package/dist/agents/pipelineGuards.d.ts.map +1 -1
  35. package/dist/agents/pipelineGuards.js +84 -2
  36. package/dist/agents/pipelineGuards.js.map +1 -1
  37. package/dist/agents/worker.d.ts +3 -0
  38. package/dist/agents/worker.d.ts.map +1 -1
  39. package/dist/agents/worker.js +1 -0
  40. package/dist/agents/worker.js.map +1 -1
  41. package/dist/auth/index.d.ts +3 -0
  42. package/dist/auth/index.d.ts.map +1 -0
  43. package/dist/auth/index.js +6 -0
  44. package/dist/auth/index.js.map +1 -0
  45. package/dist/auth/oauthPkce.d.ts +21 -0
  46. package/dist/auth/oauthPkce.d.ts.map +1 -0
  47. package/dist/auth/oauthPkce.js +212 -0
  48. package/dist/auth/oauthPkce.js.map +1 -0
  49. package/dist/auth/oauthStore.d.ts +24 -0
  50. package/dist/auth/oauthStore.d.ts.map +1 -0
  51. package/dist/auth/oauthStore.js +96 -0
  52. package/dist/auth/oauthStore.js.map +1 -0
  53. package/dist/automation/autonomousRunner.d.ts +5 -5
  54. package/dist/automation/runnerTypes.d.ts +1 -1
  55. package/dist/automation/runnerTypes.d.ts.map +1 -1
  56. package/dist/cli/authHandler.d.ts +16 -0
  57. package/dist/cli/authHandler.d.ts.map +1 -0
  58. package/dist/cli/authHandler.js +93 -0
  59. package/dist/cli/authHandler.js.map +1 -0
  60. package/dist/cli/checkHandler.d.ts +25 -0
  61. package/dist/cli/checkHandler.d.ts.map +1 -0
  62. package/dist/cli/checkHandler.js +465 -0
  63. package/dist/cli/checkHandler.js.map +1 -0
  64. package/dist/cli.js +64 -0
  65. package/dist/cli.js.map +1 -1
  66. package/dist/core/config.d.ts +17 -4
  67. package/dist/core/config.d.ts.map +1 -1
  68. package/dist/core/config.js +21 -8
  69. package/dist/core/config.js.map +1 -1
  70. package/dist/core/service.d.ts.map +1 -1
  71. package/dist/core/service.js +18 -8
  72. package/dist/core/service.js.map +1 -1
  73. package/dist/core/types.d.ts +4 -2
  74. package/dist/core/types.d.ts.map +1 -1
  75. package/dist/issues/graphql/resolvers.d.ts +252 -0
  76. package/dist/issues/graphql/resolvers.d.ts.map +1 -0
  77. package/dist/issues/graphql/resolvers.js +88 -0
  78. package/dist/issues/graphql/resolvers.js.map +1 -0
  79. package/dist/issues/graphql/server.d.ts +13 -0
  80. package/dist/issues/graphql/server.d.ts.map +1 -0
  81. package/dist/issues/graphql/server.js +56 -0
  82. package/dist/issues/graphql/server.js.map +1 -0
  83. package/dist/issues/graphql/typeDefs.d.ts +2 -0
  84. package/dist/issues/graphql/typeDefs.d.ts.map +1 -0
  85. package/dist/issues/graphql/typeDefs.js +251 -0
  86. package/dist/issues/graphql/typeDefs.js.map +1 -0
  87. package/dist/issues/index.d.ts +8 -0
  88. package/dist/issues/index.d.ts.map +1 -0
  89. package/dist/issues/index.js +11 -0
  90. package/dist/issues/index.js.map +1 -0
  91. package/dist/issues/issueBoardHtml.d.ts +2 -0
  92. package/dist/issues/issueBoardHtml.d.ts.map +1 -0
  93. package/dist/issues/issueBoardHtml.js +677 -0
  94. package/dist/issues/issueBoardHtml.js.map +1 -0
  95. package/dist/issues/linearBridge.d.ts +27 -0
  96. package/dist/issues/linearBridge.d.ts.map +1 -0
  97. package/dist/issues/linearBridge.js +211 -0
  98. package/dist/issues/linearBridge.js.map +1 -0
  99. package/dist/issues/memoryBridge.d.ts +35 -0
  100. package/dist/issues/memoryBridge.d.ts.map +1 -0
  101. package/dist/issues/memoryBridge.js +184 -0
  102. package/dist/issues/memoryBridge.js.map +1 -0
  103. package/dist/issues/schema.d.ts +162 -0
  104. package/dist/issues/schema.d.ts.map +1 -0
  105. package/dist/issues/schema.js +121 -0
  106. package/dist/issues/schema.js.map +1 -0
  107. package/dist/issues/sqliteStore.d.ts +90 -0
  108. package/dist/issues/sqliteStore.d.ts.map +1 -0
  109. package/dist/issues/sqliteStore.js +488 -0
  110. package/dist/issues/sqliteStore.js.map +1 -0
  111. package/dist/knowledge/index.d.ts.map +1 -1
  112. package/dist/knowledge/index.js +9 -3
  113. package/dist/knowledge/index.js.map +1 -1
  114. package/dist/linear/linear.d.ts +4 -0
  115. package/dist/linear/linear.d.ts.map +1 -1
  116. package/dist/linear/linear.js +27 -0
  117. package/dist/linear/linear.js.map +1 -1
  118. package/dist/locale/prompts/en.d.ts.map +1 -1
  119. package/dist/locale/prompts/en.js +32 -2
  120. package/dist/locale/prompts/en.js.map +1 -1
  121. package/dist/locale/prompts/ko.d.ts.map +1 -1
  122. package/dist/locale/prompts/ko.js +32 -2
  123. package/dist/locale/prompts/ko.js.map +1 -1
  124. package/dist/locale/types.d.ts +17 -0
  125. package/dist/locale/types.d.ts.map +1 -1
  126. package/dist/registry/bsDetector.d.ts +24 -0
  127. package/dist/registry/bsDetector.d.ts.map +1 -0
  128. package/dist/registry/bsDetector.js +276 -0
  129. package/dist/registry/bsDetector.js.map +1 -0
  130. package/dist/registry/entityScanner.d.ts +36 -0
  131. package/dist/registry/entityScanner.d.ts.map +1 -0
  132. package/dist/registry/entityScanner.js +693 -0
  133. package/dist/registry/entityScanner.js.map +1 -0
  134. package/dist/registry/graphql/resolvers.d.ts +778 -0
  135. package/dist/registry/graphql/resolvers.d.ts.map +1 -0
  136. package/dist/registry/graphql/resolvers.js +127 -0
  137. package/dist/registry/graphql/resolvers.js.map +1 -0
  138. package/dist/registry/graphql/typeDefs.d.ts +2 -0
  139. package/dist/registry/graphql/typeDefs.d.ts.map +1 -0
  140. package/dist/registry/graphql/typeDefs.js +276 -0
  141. package/dist/registry/graphql/typeDefs.js.map +1 -0
  142. package/dist/registry/index.d.ts +12 -0
  143. package/dist/registry/index.d.ts.map +1 -0
  144. package/dist/registry/index.js +18 -0
  145. package/dist/registry/index.js.map +1 -0
  146. package/dist/registry/issueBridge.d.ts +8 -0
  147. package/dist/registry/issueBridge.d.ts.map +1 -0
  148. package/dist/registry/issueBridge.js +30 -0
  149. package/dist/registry/issueBridge.js.map +1 -0
  150. package/dist/registry/memoryBridge.d.ts +13 -0
  151. package/dist/registry/memoryBridge.d.ts.map +1 -0
  152. package/dist/registry/memoryBridge.js +60 -0
  153. package/dist/registry/memoryBridge.js.map +1 -0
  154. package/dist/registry/schema.d.ts +307 -0
  155. package/dist/registry/schema.d.ts.map +1 -0
  156. package/dist/registry/schema.js +139 -0
  157. package/dist/registry/schema.js.map +1 -0
  158. package/dist/registry/sqliteStore.d.ts +101 -0
  159. package/dist/registry/sqliteStore.d.ts.map +1 -0
  160. package/dist/registry/sqliteStore.js +688 -0
  161. package/dist/registry/sqliteStore.js.map +1 -0
  162. package/dist/support/chatBackend.d.ts.map +1 -1
  163. package/dist/support/chatBackend.js +35 -4
  164. package/dist/support/chatBackend.js.map +1 -1
  165. package/dist/support/chatTui.d.ts.map +1 -1
  166. package/dist/support/chatTui.js +109 -3
  167. package/dist/support/chatTui.js.map +1 -1
  168. package/dist/support/dashboardHtml.d.ts +1 -1
  169. package/dist/support/dashboardHtml.d.ts.map +1 -1
  170. package/dist/support/dashboardHtml.js +1 -0
  171. package/dist/support/dashboardHtml.js.map +1 -1
  172. package/dist/support/web.d.ts.map +1 -1
  173. package/dist/support/web.js +16 -3
  174. package/dist/support/web.js.map +1 -1
  175. package/package.json +8 -2
  176. package/templates/TOOLS.md +2 -2
@@ -0,0 +1,27 @@
1
+ import type { SqliteIssueStore } from './sqliteStore.js';
2
+ import type { IssueStatus } from './schema.js';
3
+ /**
4
+ * Linear 브릿지 초기화
5
+ * config.yaml에서 linear.enabled: true 일 때만 호출
6
+ */
7
+ export declare function initLinearBridge(apiKey: string, teamId: string): void;
8
+ /**
9
+ * Linear → 로컬: Linear 이슈를 로컬 DB에 동기화
10
+ */
11
+ export declare function syncFromLinear(store: SqliteIssueStore, projectId: string, options?: {
12
+ states?: string[];
13
+ limit?: number;
14
+ }): Promise<{
15
+ created: number;
16
+ updated: number;
17
+ }>;
18
+ /**
19
+ * 로컬 → Linear: 로컬 이슈를 Linear에 생성
20
+ */
21
+ export declare function pushToLinear(store: SqliteIssueStore, issueId: string): Promise<string | null>;
22
+ /**
23
+ * 상태 동기화: 로컬 상태 변경 → Linear 반영
24
+ */
25
+ export declare function syncStatusToLinear(store: SqliteIssueStore, issueId: string, newStatus: IssueStatus): Promise<boolean>;
26
+ export declare function isLinearBridgeReady(): boolean;
27
+ //# sourceMappingURL=linearBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearBridge.d.ts","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAS,WAAW,EAAiB,MAAM,aAAa,CAAC;AAMrE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CASrE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD/C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0CxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,OAAO,CAAC,CAelB;AA4FD,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
@@ -0,0 +1,211 @@
1
+ // ============================================
2
+ // OpenSwarm - Linear ↔ Local Issue Bridge
3
+ // Created: 2026-04-03
4
+ // Purpose: Linear 이슈를 로컬 DB와 양방향 동기화 (optional)
5
+ // Dependencies: @linear/sdk, sqliteStore
6
+ // ============================================
7
+ // Linear SDK는 동적 import (Linear 미사용 시 로드 안 함)
8
+ let linearClient = null;
9
+ let linearTeamId = '';
10
+ /**
11
+ * Linear 브릿지 초기화
12
+ * config.yaml에서 linear.enabled: true 일 때만 호출
13
+ */
14
+ export function initLinearBridge(apiKey, teamId) {
15
+ // 기존 linear.ts의 클라이언트를 재사용하기 위해 동적 import
16
+ linearTeamId = teamId;
17
+ import('@linear/sdk').then(({ LinearClient }) => {
18
+ linearClient = new LinearClient({ apiKey });
19
+ console.log('[LinearBridge] 초기화 완료 — team:', teamId);
20
+ }).catch((err) => {
21
+ console.warn('[LinearBridge] Linear SDK 로드 실패:', err);
22
+ });
23
+ }
24
+ /**
25
+ * Linear → 로컬: Linear 이슈를 로컬 DB에 동기화
26
+ */
27
+ export async function syncFromLinear(store, projectId, options) {
28
+ if (!linearClient) {
29
+ console.warn('[LinearBridge] 클라이언트 미초기화');
30
+ return { created: 0, updated: 0 };
31
+ }
32
+ const states = options?.states ?? ['In Progress', 'Todo', 'Backlog'];
33
+ const limit = options?.limit ?? 50;
34
+ let created = 0;
35
+ let updated = 0;
36
+ try {
37
+ const issues = await linearClient.issues({
38
+ filter: {
39
+ team: { id: { eq: linearTeamId } },
40
+ state: { name: { in: states } },
41
+ },
42
+ first: limit,
43
+ orderBy: 'updatedAt',
44
+ });
45
+ for (const issue of issues.nodes) {
46
+ const existing = findByLinearId(store, issue.id);
47
+ const linearData = await mapLinearToLocal(issue, projectId);
48
+ if (existing) {
49
+ // 이미 존재 → 업데이트
50
+ store.updateIssue(existing.id, linearData);
51
+ updated++;
52
+ }
53
+ else {
54
+ // 새 이슈 → 생성
55
+ store.createIssue({
56
+ ...linearData,
57
+ source: 'linear',
58
+ linearId: issue.id,
59
+ linearIdentifier: issue.identifier,
60
+ linearUrl: issue.url,
61
+ });
62
+ created++;
63
+ }
64
+ }
65
+ console.log(`[LinearBridge] 동기화 완료 — created: ${created}, updated: ${updated}`);
66
+ }
67
+ catch (err) {
68
+ console.error('[LinearBridge] 동기화 실패:', err);
69
+ }
70
+ return { created, updated };
71
+ }
72
+ /**
73
+ * 로컬 → Linear: 로컬 이슈를 Linear에 생성
74
+ */
75
+ export async function pushToLinear(store, issueId) {
76
+ if (!linearClient) {
77
+ console.warn('[LinearBridge] 클라이언트 미초기화');
78
+ return null;
79
+ }
80
+ const issue = store.getIssue(issueId);
81
+ if (!issue)
82
+ return null;
83
+ if (issue.linearId)
84
+ return issue.linearId; // 이미 연결됨
85
+ try {
86
+ const stateId = await resolveLinearStateId(mapStatusToLinear(issue.status));
87
+ const created = await linearClient.createIssue({
88
+ teamId: linearTeamId,
89
+ title: issue.title,
90
+ description: issue.description || undefined,
91
+ priority: mapPriorityToLinear(issue.priority),
92
+ stateId,
93
+ });
94
+ const linearIssue = await created.issue;
95
+ if (!linearIssue)
96
+ return null;
97
+ // 로컬 이슈에 Linear ID 연결
98
+ store.updateIssue(issueId, {
99
+ linearId: linearIssue.id,
100
+ linearIdentifier: linearIssue.identifier,
101
+ linearUrl: linearIssue.url,
102
+ });
103
+ store.addEvent(issueId, 'linked', {
104
+ content: `Linear에 생성: ${linearIssue.identifier}`,
105
+ newValue: linearIssue.identifier,
106
+ });
107
+ console.log(`[LinearBridge] 이슈 ${issueId} → Linear ${linearIssue.identifier}`);
108
+ return linearIssue.id;
109
+ }
110
+ catch (err) {
111
+ console.error('[LinearBridge] Linear 생성 실패:', err);
112
+ return null;
113
+ }
114
+ }
115
+ /**
116
+ * 상태 동기화: 로컬 상태 변경 → Linear 반영
117
+ */
118
+ export async function syncStatusToLinear(store, issueId, newStatus) {
119
+ if (!linearClient)
120
+ return false;
121
+ const issue = store.getIssue(issueId);
122
+ if (!issue?.linearId)
123
+ return false;
124
+ try {
125
+ const stateId = await resolveLinearStateId(mapStatusToLinear(newStatus));
126
+ await linearClient.updateIssue(issue.linearId, { stateId });
127
+ console.log(`[LinearBridge] Linear 상태 업데이트: ${issue.linearIdentifier} → ${newStatus}`);
128
+ return true;
129
+ }
130
+ catch (err) {
131
+ console.error('[LinearBridge] 상태 동기화 실패:', err);
132
+ return false;
133
+ }
134
+ }
135
+ // ============ 매핑 유틸 ============
136
+ function findByLinearId(store, linearId) {
137
+ const { issues } = store.listIssues({ limit: 1, offset: 0 });
138
+ // linear ID로 검색하려면 직접 쿼리가 필요
139
+ // 간단히 전체 목록에서 찾기 (비효율적이지만 동기화는 드물게 실행)
140
+ const { issues: all } = store.listIssues({ limit: 1000, offset: 0 });
141
+ return all.find((i) => i.linearId === linearId) ?? null;
142
+ }
143
+ async function mapLinearToLocal(linearIssue, projectId) {
144
+ const state = await linearIssue.state;
145
+ const stateName = state?.name ?? 'Backlog';
146
+ return {
147
+ projectId,
148
+ title: linearIssue.title,
149
+ description: linearIssue.description ?? '',
150
+ status: mapLinearStatusToLocal(stateName),
151
+ priority: mapLinearPriorityToLocal(linearIssue.priority),
152
+ };
153
+ }
154
+ function mapLinearStatusToLocal(stateName) {
155
+ const map = {
156
+ 'Backlog': 'backlog',
157
+ 'Todo': 'todo',
158
+ 'In Progress': 'in_progress',
159
+ 'In Review': 'in_review',
160
+ 'Done': 'done',
161
+ 'Cancelled': 'cancelled',
162
+ 'Canceled': 'cancelled',
163
+ };
164
+ return map[stateName] ?? 'backlog';
165
+ }
166
+ function mapStatusToLinear(status) {
167
+ const map = {
168
+ backlog: 'Backlog',
169
+ todo: 'Todo',
170
+ in_progress: 'In Progress',
171
+ in_review: 'In Review',
172
+ done: 'Done',
173
+ cancelled: 'Cancelled',
174
+ };
175
+ return map[status];
176
+ }
177
+ function mapLinearPriorityToLocal(priority) {
178
+ // Linear: 0=none, 1=urgent, 2=high, 3=medium, 4=low
179
+ const map = {
180
+ 0: 'none',
181
+ 1: 'urgent',
182
+ 2: 'high',
183
+ 3: 'medium',
184
+ 4: 'low',
185
+ };
186
+ return map[priority] ?? 'medium';
187
+ }
188
+ function mapPriorityToLinear(priority) {
189
+ const map = {
190
+ urgent: 1,
191
+ high: 2,
192
+ medium: 3,
193
+ low: 4,
194
+ none: 0,
195
+ };
196
+ return map[priority];
197
+ }
198
+ async function resolveLinearStateId(stateName) {
199
+ if (!linearClient)
200
+ throw new Error('Linear 클라이언트 미초기화');
201
+ const team = await linearClient.team(linearTeamId);
202
+ const states = await team.states();
203
+ const state = states.nodes.find((s) => s.name === stateName);
204
+ if (!state)
205
+ throw new Error(`Linear 상태 "${stateName}" 없음`);
206
+ return state.id;
207
+ }
208
+ export function isLinearBridgeReady() {
209
+ return linearClient !== null;
210
+ }
211
+ //# sourceMappingURL=linearBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearBridge.js","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { SqliteIssueStore } from './sqliteStore.js';
2
+ import type { Issue } from './schema.js';
3
+ /**
4
+ * 이슈 생성 시 관련 기억 자동 연결
5
+ * - 이슈 제목+설명으로 기존 메모리 검색
6
+ * - 유사도 높은 기억을 자동 링크
7
+ */
8
+ export declare function autoLinkMemories(store: SqliteIssueStore, issue: Issue): Promise<string[]>;
9
+ /**
10
+ * 이슈 완료 시 학습 기억 저장
11
+ * - 해결 과정에서 얻은 통찰을 장기 기억으로 수선
12
+ */
13
+ export declare function saveCompletionInsight(store: SqliteIssueStore, issue: Issue): Promise<string | null>;
14
+ /**
15
+ * 이슈 블로킹 시 제약 조건 기억 저장
16
+ * - 블로킹 원인을 constraint 타입으로 저장 → 향후 유사 이슈 방지
17
+ */
18
+ export declare function saveBlockingConstraint(store: SqliteIssueStore, issue: Issue, reason: string): Promise<string | null>;
19
+ /**
20
+ * 이슈 컨텍스트 강화: 관련 기억 + 유사 이슈 조회
21
+ */
22
+ export declare function enrichIssueContext(store: SqliteIssueStore, issue: Issue): Promise<{
23
+ linkedMemories: Array<{
24
+ id: string;
25
+ content: string;
26
+ score: number;
27
+ }>;
28
+ similarIssues: Issue[];
29
+ }>;
30
+ /**
31
+ * 이벤트 스트림 → 메모리 수선 (백그라운드)
32
+ * - 주기적으로 최근 이벤트를 분석하여 패턴/전략 기억 생성
33
+ */
34
+ export declare function digestRecentEvents(store: SqliteIssueStore, limit?: number): Promise<number>;
35
+ //# sourceMappingURL=memoryBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryBridge.d.ts","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,aAAa,CAAC;AAErD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDxB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC;IACT,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,aAAa,EAAE,KAAK,EAAE,CAAC;CACxB,CAAC,CAwCD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
@@ -0,0 +1,184 @@
1
+ // ============================================
2
+ // OpenSwarm - Issue ↔ Memory Bridge
3
+ // Created: 2026-04-03
4
+ // Purpose: 이슈 이벤트를 장기 기억으로 수선 + 메모리 검색으로 이슈 컨텍스트 강화
5
+ // Dependencies: memoryCore, sqliteStore
6
+ // ============================================
7
+ import { saveMemory, searchMemorySafe, saveCognitiveMemory } from '../memory/memoryCore.js';
8
+ /**
9
+ * 이슈 생성 시 관련 기억 자동 연결
10
+ * - 이슈 제목+설명으로 기존 메모리 검색
11
+ * - 유사도 높은 기억을 자동 링크
12
+ */
13
+ export async function autoLinkMemories(store, issue) {
14
+ const query = `${issue.title} ${issue.description}`.trim();
15
+ if (query.length < 10)
16
+ return [];
17
+ const result = await searchMemorySafe(query, {
18
+ limit: 5,
19
+ minSimilarity: 0.6,
20
+ types: ['belief', 'strategy', 'system_pattern', 'constraint', 'decision'],
21
+ });
22
+ if (!result.success || result.memories.length === 0)
23
+ return [];
24
+ const linkedIds = [];
25
+ for (const mem of result.memories) {
26
+ store.linkMemory(issue.id, mem.id);
27
+ linkedIds.push(mem.id);
28
+ }
29
+ console.log(`[MemoryBridge] 이슈 ${issue.id}에 ${linkedIds.length}개 기억 자동 연결`);
30
+ return linkedIds;
31
+ }
32
+ /**
33
+ * 이슈 완료 시 학습 기억 저장
34
+ * - 해결 과정에서 얻은 통찰을 장기 기억으로 수선
35
+ */
36
+ export async function saveCompletionInsight(store, issue) {
37
+ // 이슈 이벤트 히스토리 수집
38
+ const events = store.getEvents(issue.id, 100);
39
+ if (events.length === 0)
40
+ return null;
41
+ // 이벤트에서 코멘트 추출
42
+ const comments = events
43
+ .filter((e) => e.type === 'commented' && e.content)
44
+ .map((e) => e.content)
45
+ .join('\n');
46
+ // 상태 전이 히스토리
47
+ const statusChanges = events
48
+ .filter((e) => e.type === 'status_changed')
49
+ .map((e) => `${e.oldValue} → ${e.newValue}`)
50
+ .join(', ');
51
+ // 이슈에 대한 요약 컨텐츠 생성
52
+ const content = [
53
+ `## 이슈 해결: ${issue.title}`,
54
+ `프로젝트: ${issue.projectId}`,
55
+ `우선순위: ${issue.priority}`,
56
+ issue.complexity ? `복잡도: ${issue.complexity}` : '',
57
+ statusChanges ? `상태 전이: ${statusChanges}` : '',
58
+ issue.relevantFiles.length > 0 ? `관련 파일: ${issue.relevantFiles.join(', ')}` : '',
59
+ comments ? `\n### 코멘트\n${comments}` : '',
60
+ issue.acceptanceCriteria.length > 0
61
+ ? `\n### 수용 기준\n${issue.acceptanceCriteria.map((c) => `- ${c}`).join('\n')}`
62
+ : '',
63
+ ].filter(Boolean).join('\n');
64
+ // 장기 기억으로 저장
65
+ const memoryId = await saveMemory('decision', issue.projectId, issue.title, content, {
66
+ trust: 0.85,
67
+ importance: issue.priority === 'urgent' ? 0.95 : issue.priority === 'high' ? 0.85 : 0.7,
68
+ isVerified: true,
69
+ skipDistillation: true,
70
+ derivedFrom: `issue:${issue.id}`,
71
+ metadata: {
72
+ issueId: issue.id,
73
+ projectId: issue.projectId,
74
+ labels: issue.labels,
75
+ complexity: issue.complexity,
76
+ relevantFiles: issue.relevantFiles,
77
+ },
78
+ });
79
+ if (memoryId) {
80
+ store.linkMemory(issue.id, memoryId);
81
+ console.log(`[MemoryBridge] 이슈 완료 인사이트 저장: ${memoryId}`);
82
+ }
83
+ return memoryId;
84
+ }
85
+ /**
86
+ * 이슈 블로킹 시 제약 조건 기억 저장
87
+ * - 블로킹 원인을 constraint 타입으로 저장 → 향후 유사 이슈 방지
88
+ */
89
+ export async function saveBlockingConstraint(store, issue, reason) {
90
+ const content = `이슈 "${issue.title}" (${issue.projectId}) 블로킹 원인: ${reason}`;
91
+ const memoryId = await saveCognitiveMemory('constraint', content, {
92
+ importance: 0.85,
93
+ confidence: 0.8,
94
+ derivedFrom: `issue:${issue.id}`,
95
+ });
96
+ if (memoryId) {
97
+ store.linkMemory(issue.id, memoryId);
98
+ store.addEvent(issue.id, 'memory_linked', {
99
+ memoryId,
100
+ content: `블로킹 제약 조건 기억 저장: ${reason}`,
101
+ });
102
+ }
103
+ return memoryId;
104
+ }
105
+ /**
106
+ * 이슈 컨텍스트 강화: 관련 기억 + 유사 이슈 조회
107
+ */
108
+ export async function enrichIssueContext(store, issue) {
109
+ // 1. 기존 연결된 기억 조회
110
+ const memoryIds = store.getLinkedMemories(issue.id);
111
+ const linkedMemories = [];
112
+ // 2. 의미적으로 유사한 기억 검색
113
+ const query = `${issue.title} ${issue.description}`;
114
+ const result = await searchMemorySafe(query, {
115
+ limit: 10,
116
+ minSimilarity: 0.5,
117
+ });
118
+ if (result.success) {
119
+ for (const mem of result.memories) {
120
+ linkedMemories.push({
121
+ id: mem.id,
122
+ content: mem.content,
123
+ score: mem.score,
124
+ });
125
+ }
126
+ }
127
+ // 3. 유사 이슈 검색 (FTS)
128
+ const searchTerms = issue.title.split(/\s+/).filter((t) => t.length > 2).slice(0, 3);
129
+ const similarIssues = [];
130
+ if (searchTerms.length > 0) {
131
+ const { issues } = store.listIssues({
132
+ search: searchTerms.join(' OR '),
133
+ limit: 5,
134
+ offset: 0,
135
+ });
136
+ for (const si of issues) {
137
+ if (si.id !== issue.id) {
138
+ similarIssues.push(si);
139
+ }
140
+ }
141
+ }
142
+ return { linkedMemories, similarIssues };
143
+ }
144
+ /**
145
+ * 이벤트 스트림 → 메모리 수선 (백그라운드)
146
+ * - 주기적으로 최근 이벤트를 분석하여 패턴/전략 기억 생성
147
+ */
148
+ export async function digestRecentEvents(store, limit = 50) {
149
+ const events = store.getRecentEvents(limit);
150
+ if (events.length === 0)
151
+ return 0;
152
+ // 패턴 분석: 반복 블로킹
153
+ const blockEvents = events.filter((e) => e.type === 'status_changed' && e.newValue === 'blocked');
154
+ if (blockEvents.length >= 3) {
155
+ const reasons = blockEvents
156
+ .map((e) => e.content || e.oldValue || '')
157
+ .filter(Boolean);
158
+ if (reasons.length > 0) {
159
+ await saveCognitiveMemory('strategy', [
160
+ '반복 블로킹 패턴 감지:',
161
+ ...reasons.map((r) => `- ${r}`),
162
+ `총 ${blockEvents.length}건 (최근 ${limit}개 이벤트 중)`,
163
+ ].join('\n'), {
164
+ importance: 0.85,
165
+ confidence: 0.75,
166
+ derivedFrom: 'issue-event-digest',
167
+ });
168
+ }
169
+ }
170
+ // 패턴 분석: 빈번한 우선순위 변경
171
+ const priorityChanges = events.filter((e) => e.type === 'priority_changed');
172
+ if (priorityChanges.length >= 5) {
173
+ await saveCognitiveMemory('system_pattern', [
174
+ `최근 우선순위 변경 빈도 높음 (${priorityChanges.length}건)`,
175
+ '우선순위 기준 재검토 필요',
176
+ ].join('\n'), {
177
+ importance: 0.7,
178
+ confidence: 0.6,
179
+ derivedFrom: 'issue-event-digest',
180
+ });
181
+ }
182
+ return events.length;
183
+ }
184
+ //# sourceMappingURL=memoryBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryBridge.js","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { z } from 'zod';
2
+ export declare const IssueStatusSchema: z.ZodEnum<{
3
+ in_progress: "in_progress";
4
+ backlog: "backlog";
5
+ todo: "todo";
6
+ in_review: "in_review";
7
+ done: "done";
8
+ cancelled: "cancelled";
9
+ }>;
10
+ export declare const IssuePrioritySchema: z.ZodEnum<{
11
+ medium: "medium";
12
+ none: "none";
13
+ low: "low";
14
+ high: "high";
15
+ urgent: "urgent";
16
+ }>;
17
+ export declare const IssueSourceSchema: z.ZodEnum<{
18
+ discord: "discord";
19
+ linear: "linear";
20
+ local: "local";
21
+ github: "github";
22
+ }>;
23
+ export declare const IssueEventTypeSchema: z.ZodEnum<{
24
+ closed: "closed";
25
+ created: "created";
26
+ status_changed: "status_changed";
27
+ memory_linked: "memory_linked";
28
+ priority_changed: "priority_changed";
29
+ assigned: "assigned";
30
+ commented: "commented";
31
+ labeled: "labeled";
32
+ linked: "linked";
33
+ reopened: "reopened";
34
+ }>;
35
+ export declare const IssueEventSchema: z.ZodObject<{
36
+ id: z.ZodString;
37
+ issueId: z.ZodString;
38
+ type: z.ZodEnum<{
39
+ closed: "closed";
40
+ created: "created";
41
+ status_changed: "status_changed";
42
+ memory_linked: "memory_linked";
43
+ priority_changed: "priority_changed";
44
+ assigned: "assigned";
45
+ commented: "commented";
46
+ labeled: "labeled";
47
+ linked: "linked";
48
+ reopened: "reopened";
49
+ }>;
50
+ oldValue: z.ZodOptional<z.ZodString>;
51
+ newValue: z.ZodOptional<z.ZodString>;
52
+ content: z.ZodOptional<z.ZodString>;
53
+ memoryId: z.ZodOptional<z.ZodString>;
54
+ actor: z.ZodDefault<z.ZodString>;
55
+ createdAt: z.ZodString;
56
+ }, z.core.$strip>;
57
+ export declare const IssueSchema: z.ZodObject<{
58
+ id: z.ZodString;
59
+ projectId: z.ZodString;
60
+ title: z.ZodString;
61
+ description: z.ZodDefault<z.ZodString>;
62
+ status: z.ZodDefault<z.ZodEnum<{
63
+ in_progress: "in_progress";
64
+ backlog: "backlog";
65
+ todo: "todo";
66
+ in_review: "in_review";
67
+ done: "done";
68
+ cancelled: "cancelled";
69
+ }>>;
70
+ priority: z.ZodDefault<z.ZodEnum<{
71
+ medium: "medium";
72
+ none: "none";
73
+ low: "low";
74
+ high: "high";
75
+ urgent: "urgent";
76
+ }>>;
77
+ source: z.ZodDefault<z.ZodEnum<{
78
+ discord: "discord";
79
+ linear: "linear";
80
+ local: "local";
81
+ github: "github";
82
+ }>>;
83
+ labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
84
+ assignee: z.ZodOptional<z.ZodString>;
85
+ milestone: z.ZodOptional<z.ZodString>;
86
+ relevantFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
87
+ acceptanceCriteria: z.ZodDefault<z.ZodArray<z.ZodString>>;
88
+ estimateMinutes: z.ZodOptional<z.ZodNumber>;
89
+ complexity: z.ZodOptional<z.ZodEnum<{
90
+ simple: "simple";
91
+ complex: "complex";
92
+ moderate: "moderate";
93
+ very_complex: "very_complex";
94
+ }>>;
95
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString>>;
96
+ parentId: z.ZodOptional<z.ZodString>;
97
+ childIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
98
+ linearId: z.ZodOptional<z.ZodString>;
99
+ linearIdentifier: z.ZodOptional<z.ZodString>;
100
+ linearUrl: z.ZodOptional<z.ZodString>;
101
+ memoryIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
102
+ createdAt: z.ZodString;
103
+ updatedAt: z.ZodString;
104
+ closedAt: z.ZodOptional<z.ZodString>;
105
+ }, z.core.$strip>;
106
+ export declare const LabelSchema: z.ZodObject<{
107
+ id: z.ZodString;
108
+ name: z.ZodString;
109
+ color: z.ZodDefault<z.ZodString>;
110
+ description: z.ZodOptional<z.ZodString>;
111
+ }, z.core.$strip>;
112
+ export declare const MilestoneSchema: z.ZodObject<{
113
+ id: z.ZodString;
114
+ name: z.ZodString;
115
+ description: z.ZodOptional<z.ZodString>;
116
+ dueDate: z.ZodOptional<z.ZodString>;
117
+ status: z.ZodDefault<z.ZodEnum<{
118
+ closed: "closed";
119
+ active: "active";
120
+ }>>;
121
+ createdAt: z.ZodString;
122
+ }, z.core.$strip>;
123
+ export declare const IssueFilterSchema: z.ZodObject<{
124
+ projectId: z.ZodOptional<z.ZodString>;
125
+ status: z.ZodOptional<z.ZodArray<z.ZodEnum<{
126
+ in_progress: "in_progress";
127
+ backlog: "backlog";
128
+ todo: "todo";
129
+ in_review: "in_review";
130
+ done: "done";
131
+ cancelled: "cancelled";
132
+ }>>>;
133
+ priority: z.ZodOptional<z.ZodArray<z.ZodEnum<{
134
+ medium: "medium";
135
+ none: "none";
136
+ low: "low";
137
+ high: "high";
138
+ urgent: "urgent";
139
+ }>>>;
140
+ labels: z.ZodOptional<z.ZodArray<z.ZodString>>;
141
+ assignee: z.ZodOptional<z.ZodString>;
142
+ source: z.ZodOptional<z.ZodEnum<{
143
+ discord: "discord";
144
+ linear: "linear";
145
+ local: "local";
146
+ github: "github";
147
+ }>>;
148
+ parentId: z.ZodOptional<z.ZodString>;
149
+ search: z.ZodOptional<z.ZodString>;
150
+ limit: z.ZodDefault<z.ZodNumber>;
151
+ offset: z.ZodDefault<z.ZodNumber>;
152
+ }, z.core.$strip>;
153
+ export type IssueStatus = z.infer<typeof IssueStatusSchema>;
154
+ export type IssuePriority = z.infer<typeof IssuePrioritySchema>;
155
+ export type IssueSource = z.infer<typeof IssueSourceSchema>;
156
+ export type IssueEventType = z.infer<typeof IssueEventTypeSchema>;
157
+ export type IssueEvent = z.infer<typeof IssueEventSchema>;
158
+ export type Issue = z.infer<typeof IssueSchema>;
159
+ export type Label = z.infer<typeof LabelSchema>;
160
+ export type Milestone = z.infer<typeof MilestoneSchema>;
161
+ export type IssueFilter = z.infer<typeof IssueFilterSchema>;
162
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/issues/schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;EAO5B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;EAM9B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;EAK5B,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;;;;;;;;;EAW/B,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;iBAc3B,CAAC;AAGH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqCtB,CAAC;AAGH,eAAO,MAAM,WAAW;;;;;iBAKtB,CAAC;AAGH,eAAO,MAAM,eAAe;;;;;;;;;;iBAO1B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW5B,CAAC;AAGH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}