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,275 @@
1
+ import path from 'node:path';
2
+ import { fileExists, readUtf8, writeUtf8Atomic } from '../utils/fs.js';
3
+ import { SerialExecutor } from '../utils/serial-executor.js';
4
+ const DEFAULT_STATE = {
5
+ version: 1,
6
+ conversations: {},
7
+ };
8
+ export class SessionStore {
9
+ stateFilePath;
10
+ serial = new SerialExecutor();
11
+ constructor(stateDir) {
12
+ this.stateFilePath = path.join(stateDir, 'sessions.json');
13
+ }
14
+ async listConversations() {
15
+ await this.serial.wait();
16
+ const state = await this.readState();
17
+ return Object.entries(state.conversations)
18
+ .map(([key, value]) => [key, normalizeConversation(value)])
19
+ .sort((left, right) => right[1].updated_at.localeCompare(left[1].updated_at));
20
+ }
21
+ async getConversation(conversationKey) {
22
+ await this.serial.wait();
23
+ const state = await this.readState();
24
+ const conversation = state.conversations[conversationKey];
25
+ return conversation ? normalizeConversation(conversation) : null;
26
+ }
27
+ async ensureConversation(conversationKey, seed) {
28
+ return this.serial.run(async () => {
29
+ const state = await this.readState();
30
+ const existing = state.conversations[conversationKey];
31
+ if (existing) {
32
+ return normalizeConversation(existing);
33
+ }
34
+ const created = {
35
+ ...seed,
36
+ updated_at: new Date().toISOString(),
37
+ projects: {},
38
+ };
39
+ state.conversations[conversationKey] = created;
40
+ await this.writeState(state);
41
+ return normalizeConversation(created);
42
+ });
43
+ }
44
+ async selectProject(conversationKey, projectAlias) {
45
+ await this.serial.run(async () => {
46
+ const state = await this.readState();
47
+ const conversation = state.conversations[conversationKey];
48
+ if (!conversation) {
49
+ throw new Error(`Conversation not found: ${conversationKey}`);
50
+ }
51
+ conversation.selected_project_alias = projectAlias;
52
+ conversation.updated_at = new Date().toISOString();
53
+ await this.writeState(state);
54
+ });
55
+ }
56
+ async upsertProjectSession(conversationKey, projectAlias, patch) {
57
+ return this.serial.run(async () => {
58
+ const state = await this.readState();
59
+ const conversation = state.conversations[conversationKey];
60
+ if (!conversation) {
61
+ throw new Error(`Conversation not found: ${conversationKey}`);
62
+ }
63
+ const now = new Date().toISOString();
64
+ const current = normalizeProjectSession(conversation.projects[projectAlias]);
65
+ const next = {
66
+ ...current,
67
+ ...patch,
68
+ updated_at: now,
69
+ sessions: { ...(current.sessions ?? {}) },
70
+ };
71
+ const activeThreadId = patch.thread_id ?? patch.active_thread_id ?? next.active_thread_id ?? next.thread_id;
72
+ if (activeThreadId) {
73
+ const existingHistory = next.sessions?.[activeThreadId];
74
+ next.sessions ??= {};
75
+ next.sessions[activeThreadId] = {
76
+ thread_id: activeThreadId,
77
+ created_at: existingHistory?.created_at ?? now,
78
+ updated_at: now,
79
+ last_prompt: patch.last_prompt ?? next.last_prompt ?? existingHistory?.last_prompt,
80
+ last_response_excerpt: patch.last_response_excerpt ?? next.last_response_excerpt ?? existingHistory?.last_response_excerpt,
81
+ };
82
+ next.active_thread_id = activeThreadId;
83
+ next.thread_id = activeThreadId;
84
+ next.last_prompt = next.sessions[activeThreadId].last_prompt;
85
+ next.last_response_excerpt = next.sessions[activeThreadId].last_response_excerpt;
86
+ }
87
+ conversation.projects[projectAlias] = next;
88
+ conversation.updated_at = now;
89
+ await this.writeState(state);
90
+ return normalizeProjectSession(next);
91
+ });
92
+ }
93
+ async listProjectSessions(conversationKey, projectAlias) {
94
+ await this.serial.wait();
95
+ const conversation = await this.getConversation(conversationKey);
96
+ const project = conversation?.projects[projectAlias];
97
+ return Object.values(project?.sessions ?? {}).sort((left, right) => right.updated_at.localeCompare(left.updated_at));
98
+ }
99
+ async setActiveProjectSession(conversationKey, projectAlias, threadId) {
100
+ return this.serial.run(async () => {
101
+ const state = await this.readState();
102
+ const conversation = state.conversations[conversationKey];
103
+ if (!conversation) {
104
+ throw new Error(`Conversation not found: ${conversationKey}`);
105
+ }
106
+ const current = normalizeProjectSession(conversation.projects[projectAlias]);
107
+ const history = current.sessions?.[threadId];
108
+ if (!history) {
109
+ throw new Error(`Session not found for project ${projectAlias}: ${threadId}`);
110
+ }
111
+ const next = {
112
+ ...current,
113
+ thread_id: threadId,
114
+ active_thread_id: threadId,
115
+ last_prompt: history.last_prompt,
116
+ last_response_excerpt: history.last_response_excerpt,
117
+ updated_at: new Date().toISOString(),
118
+ sessions: current.sessions,
119
+ };
120
+ conversation.projects[projectAlias] = next;
121
+ conversation.updated_at = next.updated_at;
122
+ await this.writeState(state);
123
+ return normalizeProjectSession(next);
124
+ });
125
+ }
126
+ async clearActiveProjectSession(conversationKey, projectAlias) {
127
+ return this.serial.run(async () => {
128
+ const state = await this.readState();
129
+ const conversation = state.conversations[conversationKey];
130
+ if (!conversation) {
131
+ return null;
132
+ }
133
+ const current = normalizeProjectSession(conversation.projects[projectAlias]);
134
+ if (!current.updated_at) {
135
+ return null;
136
+ }
137
+ const next = {
138
+ ...current,
139
+ thread_id: undefined,
140
+ active_thread_id: undefined,
141
+ last_prompt: undefined,
142
+ last_response_excerpt: undefined,
143
+ updated_at: new Date().toISOString(),
144
+ sessions: current.sessions,
145
+ };
146
+ conversation.projects[projectAlias] = next;
147
+ conversation.updated_at = next.updated_at;
148
+ await this.writeState(state);
149
+ return normalizeProjectSession(next);
150
+ });
151
+ }
152
+ async setProjectBackend(conversationKey, projectAlias, backendName) {
153
+ await this.serial.run(async () => {
154
+ const state = await this.readState();
155
+ const conversation = state.conversations[conversationKey];
156
+ if (!conversation) {
157
+ throw new Error(`Conversation not found: ${conversationKey}`);
158
+ }
159
+ const current = normalizeProjectSession(conversation.projects[projectAlias]);
160
+ conversation.projects[projectAlias] = {
161
+ ...current,
162
+ active_backend: backendName,
163
+ updated_at: new Date().toISOString(),
164
+ };
165
+ conversation.updated_at = new Date().toISOString();
166
+ await this.writeState(state);
167
+ });
168
+ }
169
+ async getProjectBackend(conversationKey, projectAlias) {
170
+ await this.serial.wait();
171
+ const state = await this.readState();
172
+ const conversation = state.conversations[conversationKey];
173
+ return conversation?.projects[projectAlias]?.active_backend;
174
+ }
175
+ async dropProjectSession(conversationKey, projectAlias, threadId) {
176
+ return this.serial.run(async () => {
177
+ const state = await this.readState();
178
+ const conversation = state.conversations[conversationKey];
179
+ if (!conversation) {
180
+ return null;
181
+ }
182
+ const current = normalizeProjectSession(conversation.projects[projectAlias]);
183
+ if (!current.sessions?.[threadId]) {
184
+ return current.updated_at ? current : null;
185
+ }
186
+ const sessions = { ...(current.sessions ?? {}) };
187
+ delete sessions[threadId];
188
+ const nextActive = Object.values(sessions).sort((left, right) => right.updated_at.localeCompare(left.updated_at))[0];
189
+ const next = {
190
+ updated_at: new Date().toISOString(),
191
+ sessions,
192
+ thread_id: nextActive?.thread_id,
193
+ active_thread_id: nextActive?.thread_id,
194
+ last_prompt: nextActive?.last_prompt,
195
+ last_response_excerpt: nextActive?.last_response_excerpt,
196
+ };
197
+ if (Object.keys(sessions).length === 0) {
198
+ conversation.projects[projectAlias] = next;
199
+ }
200
+ else {
201
+ conversation.projects[projectAlias] = next;
202
+ }
203
+ conversation.updated_at = next.updated_at;
204
+ await this.writeState(state);
205
+ return normalizeProjectSession(next);
206
+ });
207
+ }
208
+ async resetProjectSession(conversationKey, projectAlias) {
209
+ await this.serial.run(async () => {
210
+ const state = await this.readState();
211
+ const conversation = state.conversations[conversationKey];
212
+ if (!conversation) {
213
+ return;
214
+ }
215
+ delete conversation.projects[projectAlias];
216
+ conversation.updated_at = new Date().toISOString();
217
+ await this.writeState(state);
218
+ });
219
+ }
220
+ async clearConversation(conversationKey) {
221
+ await this.serial.run(async () => {
222
+ const state = await this.readState();
223
+ delete state.conversations[conversationKey];
224
+ await this.writeState(state);
225
+ });
226
+ }
227
+ async readState() {
228
+ if (!(await fileExists(this.stateFilePath))) {
229
+ return structuredClone(DEFAULT_STATE);
230
+ }
231
+ const content = await readUtf8(this.stateFilePath);
232
+ const parsed = JSON.parse(content);
233
+ return {
234
+ version: 1,
235
+ conversations: Object.fromEntries(Object.entries(parsed.conversations ?? {}).map(([key, value]) => [key, normalizeConversation(value)])),
236
+ };
237
+ }
238
+ async writeState(state) {
239
+ await writeUtf8Atomic(this.stateFilePath, `${JSON.stringify(state, null, 2)}\n`);
240
+ }
241
+ }
242
+ export function buildConversationKey(input) {
243
+ const scopeId = input.scope === 'chat-user' ? input.actorId ?? 'unknown-actor' : 'shared';
244
+ return [input.tenantKey ?? 'tenant', input.chatId, input.scope, scopeId].join('::');
245
+ }
246
+ function normalizeConversation(input) {
247
+ return {
248
+ ...input,
249
+ projects: Object.fromEntries(Object.entries(input.projects ?? {}).map(([alias, project]) => [alias, normalizeProjectSession(project)])),
250
+ };
251
+ }
252
+ function normalizeProjectSession(input) {
253
+ const updatedAt = input?.updated_at ?? new Date(0).toISOString();
254
+ const sessions = { ...(input?.sessions ?? {}) };
255
+ const activeThreadId = input?.active_thread_id ?? input?.thread_id;
256
+ if (activeThreadId && !sessions[activeThreadId]) {
257
+ sessions[activeThreadId] = {
258
+ thread_id: activeThreadId,
259
+ created_at: updatedAt,
260
+ updated_at: updatedAt,
261
+ last_prompt: input?.last_prompt,
262
+ last_response_excerpt: input?.last_response_excerpt,
263
+ };
264
+ }
265
+ return {
266
+ thread_id: activeThreadId,
267
+ active_thread_id: activeThreadId,
268
+ active_backend: input?.active_backend,
269
+ last_prompt: activeThreadId ? sessions[activeThreadId]?.last_prompt ?? input?.last_prompt : input?.last_prompt,
270
+ last_response_excerpt: activeThreadId ? sessions[activeThreadId]?.last_response_excerpt ?? input?.last_response_excerpt : input?.last_response_excerpt,
271
+ updated_at: updatedAt,
272
+ sessions,
273
+ };
274
+ }
275
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/state/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * JSON-backed store for per-project trust state.
3
+ */
4
+ import type { TrustState } from '../collaboration/trust.js';
5
+ export declare class TrustStore {
6
+ private readonly filePath;
7
+ private readonly executor;
8
+ constructor(stateDir: string);
9
+ private load;
10
+ private save;
11
+ getOrCreate(projectAlias: string): Promise<TrustState>;
12
+ update(projectAlias: string, state: TrustState): Promise<void>;
13
+ get(projectAlias: string): Promise<TrustState | null>;
14
+ listAll(): Promise<TrustState[]>;
15
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * JSON-backed store for per-project trust state.
3
+ */
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { createInitialTrustState } from '../collaboration/trust.js';
7
+ import { SerialExecutor } from '../utils/serial-executor.js';
8
+ export class TrustStore {
9
+ filePath;
10
+ executor = new SerialExecutor();
11
+ constructor(stateDir) {
12
+ this.filePath = path.join(stateDir, 'trust.json');
13
+ }
14
+ async load() {
15
+ try {
16
+ const content = await fs.readFile(this.filePath, 'utf8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ async save(data) {
24
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
25
+ await fs.writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf8');
26
+ }
27
+ async getOrCreate(projectAlias) {
28
+ return this.executor.run(async () => {
29
+ const data = await this.load();
30
+ if (!data[projectAlias]) {
31
+ data[projectAlias] = createInitialTrustState(projectAlias);
32
+ await this.save(data);
33
+ }
34
+ return data[projectAlias];
35
+ });
36
+ }
37
+ async update(projectAlias, state) {
38
+ await this.executor.run(async () => {
39
+ const data = await this.load();
40
+ data[projectAlias] = state;
41
+ await this.save(data);
42
+ });
43
+ }
44
+ async get(projectAlias) {
45
+ const data = await this.executor.run(() => this.load());
46
+ return data[projectAlias] ?? null;
47
+ }
48
+ async listAll() {
49
+ const data = await this.executor.run(() => this.load());
50
+ return Object.values(data);
51
+ }
52
+ }
53
+ //# sourceMappingURL=trust-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-store.js","sourceRoot":"","sources":["../../src/state/trust-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,OAAO,UAAU;IACJ,QAAQ,CAAS;IACjB,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAEjD,YAAmB,QAAgB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAoB;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAoB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;gBAC3D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB,EAAE,KAAiB;QAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;YAC3B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,YAAoB;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export declare function ensureDir(dirPath: string): Promise<void>;
2
+ export declare function fileExists(filePath: string): Promise<boolean>;
3
+ export declare function readUtf8(filePath: string): Promise<string>;
4
+ export declare function writeUtf8Atomic(filePath: string, content: string): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ export async function ensureDir(dirPath) {
5
+ await fs.mkdir(dirPath, { recursive: true });
6
+ }
7
+ export async function fileExists(filePath) {
8
+ try {
9
+ await fs.access(filePath);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export async function readUtf8(filePath) {
17
+ return fs.readFile(filePath, 'utf8');
18
+ }
19
+ export async function writeUtf8Atomic(filePath, content) {
20
+ const dirPath = path.dirname(filePath);
21
+ await ensureDir(dirPath);
22
+ const tempPath = path.join(dirPath, `.${path.basename(filePath)}.${randomUUID()}.tmp`);
23
+ await fs.writeFile(tempPath, content, 'utf8');
24
+ await fs.rename(tempPath, filePath);
25
+ }
26
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function tryParseJson<T>(value: string): T | null;
@@ -0,0 +1,9 @@
1
+ export function tryParseJson(value) {
2
+ try {
3
+ return JSON.parse(value);
4
+ }
5
+ catch {
6
+ return null;
7
+ }
8
+ }
9
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAI,KAAa;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function expandHomePath(input: string): string;
2
+ export declare function resolveMaybeRelative(input: string, baseDir: string): string;
3
+ export declare function normalizePath(input: string): string;
@@ -0,0 +1,22 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export function expandHomePath(input) {
4
+ if (input === '~') {
5
+ return os.homedir();
6
+ }
7
+ if (input.startsWith('~/')) {
8
+ return path.join(os.homedir(), input.slice(2));
9
+ }
10
+ return input;
11
+ }
12
+ export function resolveMaybeRelative(input, baseDir) {
13
+ const expanded = expandHomePath(input);
14
+ if (path.isAbsolute(expanded)) {
15
+ return path.normalize(expanded);
16
+ }
17
+ return path.resolve(baseDir, expanded);
18
+ }
19
+ export function normalizePath(input) {
20
+ return path.normalize(expandHomePath(input));
21
+ }
22
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,OAAe;IACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class SerialExecutor {
2
+ private tail;
3
+ wait(): Promise<void>;
4
+ run<T>(task: () => Promise<T>): Promise<T>;
5
+ }
@@ -0,0 +1,12 @@
1
+ export class SerialExecutor {
2
+ tail = Promise.resolve();
3
+ async wait() {
4
+ await this.tail.then(() => undefined, () => undefined);
5
+ }
6
+ run(task) {
7
+ const result = this.tail.then(task, task);
8
+ this.tail = result.then(() => undefined, () => undefined);
9
+ return result;
10
+ }
11
+ }
12
+ //# sourceMappingURL=serial-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-executor.js","sourceRoot":"","sources":["../../src/utils/serial-executor.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAc;IACjB,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE5C,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAClB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;IAEM,GAAG,CAAI,IAAsB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CACrB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "feique",
3
+ "version": "1.1.0",
4
+ "description": "飞鹊 (Feique) — Team AI Collaboration Hub. From individual productivity to team synergy, weave AI into every stage of work through Feishu.",
5
+ "homepage": "https://colorcross.github.io/feique/",
6
+ "type": "module",
7
+ "bin": {
8
+ "feique": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE",
14
+ "skills"
15
+ ],
16
+ "engines": {
17
+ "node": ">=24"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json",
21
+ "clean": "rm -rf dist .vitest coverage",
22
+ "demo:down": "bash scripts/dev-stack.sh down",
23
+ "demo:logs": "bash scripts/dev-stack.sh logs",
24
+ "demo:smoke": "bash scripts/dev-stack.sh smoke",
25
+ "demo:status": "bash scripts/dev-stack.sh status",
26
+ "demo:up": "bash scripts/dev-stack.sh up",
27
+ "dev": "tsx src/cli.ts",
28
+ "install:global": "bash scripts/install.sh",
29
+ "prepublishOnly": "npm run build && npm run test",
30
+ "typecheck": "tsc --noEmit -p tsconfig.json",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest"
33
+ },
34
+ "keywords": [
35
+ "codex",
36
+ "claude",
37
+ "claude-code",
38
+ "feishu",
39
+ "lark",
40
+ "bridge",
41
+ "cli",
42
+ "agent"
43
+ ],
44
+ "author": "",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/colorcross/feique.git"
48
+ },
49
+ "bugs": {
50
+ "url": "https://github.com/colorcross/feique/issues"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "license": "MIT",
56
+ "dependencies": {
57
+ "@iarna/toml": "^2.2.5",
58
+ "@larksuiteoapi/node-sdk": "^1.59.0",
59
+ "axios": "^1.13.6",
60
+ "commander": "^14.0.1",
61
+ "https-proxy-agent": "^7.0.6",
62
+ "pino": "^9.11.0",
63
+ "zod": "^4.1.11"
64
+ },
65
+ "devDependencies": {
66
+ "@types/node": "^24.5.2",
67
+ "tsx": "^4.20.5",
68
+ "typescript": "^5.9.2",
69
+ "vitest": "^3.2.4"
70
+ }
71
+ }
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: "feique-session"
3
+ description: "Guidance for Codex sessions that are driven from Feishu. Use when the conversation originates from the 飞鹊 (Feique) or when output must fit Feishu chat constraints."
4
+ ---
5
+
6
+ # 飞鹊 (Feique) Session
7
+
8
+ When this skill is active, assume the user is reading your output inside Feishu chat.
9
+
10
+ ## Output rules
11
+
12
+ - Prefer concise Chinese unless the user writes in another language.
13
+ - Put the answer first.
14
+ - If files changed, list the key paths and the validation you ran.
15
+ - If blocked by approvals, auth, or missing context, say that directly and give the next action.
16
+ - Avoid long walls of text. Use short sections when needed.
17
+
18
+ ## Interaction rules
19
+
20
+ - Feishu is not a full terminal UI. Do not assume the user can inspect streaming reasoning.
21
+ - If a step is risky or destructive, call it out explicitly.
22
+ - If the user needs to continue the same work later, mention that the bridge can resume the same session.
23
+
24
+ ## Project context
25
+
26
+ - Respect repo-local `AGENTS.md` and project-level `.codex/config.toml`.
27
+ - Keep answers friendly to asynchronous chat: final state, changed files, verification, next step.