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,314 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ensureDir } from '../utils/fs.js';
4
+ import { inspectFeishuEnvironment } from '../feishu/diagnostics.js';
5
+ import { detectCodexCliCapabilities } from '../codex/capabilities.js';
6
+ import { spawnSync } from 'node:child_process';
7
+ import { getProjectCacheDir, getProjectDownloadsDir, getProjectLogDir, getProjectTempDir } from '../projects/paths.js';
8
+ import { OllamaEmbeddingProvider } from '../memory/ollama-embeddings.js';
9
+ export function hasDoctorErrors(findings) {
10
+ return findings.some((finding) => finding.level === 'error');
11
+ }
12
+ export function formatDoctorFinding(finding) {
13
+ return `[${finding.level}] ${finding.message}`;
14
+ }
15
+ export async function runDoctor(config) {
16
+ const findings = [];
17
+ const defaultBackend = config.backend?.default ?? 'codex';
18
+ findings.push({ level: 'info', message: `Default backend: ${defaultBackend}` });
19
+ try {
20
+ const capabilities = detectCodexCliCapabilities(config.codex.bin);
21
+ findings.push({ level: 'info', message: `Codex detected: ${capabilities.version}` });
22
+ findings.push({
23
+ level: 'info',
24
+ message: `Codex resume capabilities: json=${capabilities.resume.supportsJson} output_last_message=${capabilities.resume.supportsOutputLastMessage} cd=${capabilities.resume.supportsCd}`,
25
+ });
26
+ }
27
+ catch {
28
+ const level = defaultBackend === 'codex' ? 'error' : 'warn';
29
+ findings.push({ level, message: `Codex binary not runnable: ${config.codex.bin}` });
30
+ }
31
+ const claudeBin = config.claude?.bin ?? 'claude';
32
+ try {
33
+ const claudeVersion = spawnSync(claudeBin, ['--version'], { encoding: 'utf8' });
34
+ if (claudeVersion.status === 0) {
35
+ findings.push({ level: 'info', message: `Claude CLI detected: ${claudeVersion.stdout.trim()}` });
36
+ }
37
+ else {
38
+ const level = defaultBackend === 'claude' ? 'error' : 'info';
39
+ findings.push({ level, message: `Claude CLI not available: ${claudeBin}` });
40
+ }
41
+ }
42
+ catch {
43
+ const level = defaultBackend === 'claude' ? 'error' : 'info';
44
+ findings.push({ level, message: `Claude CLI not found: ${claudeBin}` });
45
+ }
46
+ const projectsUsingClaude = Object.entries(config.projects).filter(([, p]) => p.backend === 'claude');
47
+ if (projectsUsingClaude.length > 0) {
48
+ findings.push({ level: 'info', message: `Projects using Claude backend: ${projectsUsingClaude.map(([a]) => a).join(', ')}` });
49
+ }
50
+ if (!config.service.default_project) {
51
+ findings.push({ level: 'warn', message: 'service.default_project is empty; first project alias will be used implicitly.' });
52
+ }
53
+ else if (!config.projects[config.service.default_project]) {
54
+ findings.push({ level: 'error', message: `service.default_project does not exist: ${config.service.default_project}` });
55
+ }
56
+ if (config.service.reply_mode === 'card' && config.feishu.transport === 'long-connection') {
57
+ findings.push({
58
+ level: 'warn',
59
+ message: 'Card display works in long-connection mode, but card callbacks still require webhook transport.',
60
+ });
61
+ }
62
+ if (config.feishu.dry_run) {
63
+ findings.push({
64
+ level: 'warn',
65
+ message: 'Feishu outbound dry_run is enabled. Incoming flows work, but replies are only logged locally.',
66
+ });
67
+ }
68
+ if (config.feishu.allowed_chat_ids.length === 0) {
69
+ findings.push({ level: 'warn', message: 'feishu.allowed_chat_ids is empty; all p2p chats are allowed.' });
70
+ }
71
+ if (config.feishu.allowed_group_ids.length === 0) {
72
+ findings.push({ level: 'warn', message: 'feishu.allowed_group_ids is empty; all groups are allowed.' });
73
+ }
74
+ if (config.feishu.transport === 'webhook' && !config.feishu.verification_token) {
75
+ findings.push({ level: 'warn', message: 'Webhook mode is enabled but verification_token is empty.' });
76
+ }
77
+ if (config.feishu.transport === 'webhook' && !config.feishu.encrypt_key) {
78
+ findings.push({ level: 'warn', message: 'Webhook mode is enabled but encrypt_key is empty.' });
79
+ }
80
+ if (config.feishu.event_path === config.feishu.card_path) {
81
+ findings.push({ level: 'error', message: 'feishu.event_path and feishu.card_path must not be identical.' });
82
+ }
83
+ if (config.service.idempotency_ttl_seconds < 60) {
84
+ findings.push({ level: 'warn', message: 'service.idempotency_ttl_seconds is very low; duplicate message suppression may be ineffective.' });
85
+ }
86
+ if (config.codex.run_timeout_ms < 1000) {
87
+ findings.push({ level: 'warn', message: 'codex.run_timeout_ms is very low; Codex runs may abort before producing output.' });
88
+ }
89
+ if (config.service.transcribe_audio_messages && !config.service.download_message_resources) {
90
+ findings.push({
91
+ level: 'warn',
92
+ message: 'service.transcribe_audio_messages is enabled but download_message_resources is disabled; audio files cannot be transcribed.',
93
+ });
94
+ }
95
+ if (config.service.transcribe_audio_messages && !process.env.OPENAI_API_KEY) {
96
+ findings.push({
97
+ level: 'warn',
98
+ message: 'service.transcribe_audio_messages is enabled but OPENAI_API_KEY is missing; audio transcription will be skipped.',
99
+ });
100
+ }
101
+ if (config.service.describe_image_messages && !config.service.download_message_resources) {
102
+ findings.push({
103
+ level: 'warn',
104
+ message: 'service.describe_image_messages is enabled but download_message_resources is disabled; images cannot be described.',
105
+ });
106
+ }
107
+ if (config.service.describe_image_messages && !process.env.OPENAI_API_KEY) {
108
+ findings.push({
109
+ level: 'warn',
110
+ message: 'service.describe_image_messages is enabled but OPENAI_API_KEY is missing; image descriptions will be skipped.',
111
+ });
112
+ }
113
+ if (config.service.memory_group_enabled && config.feishu.allowed_group_ids.length === 0) {
114
+ findings.push({
115
+ level: 'warn',
116
+ message: 'service.memory_group_enabled is enabled while feishu.allowed_group_ids is empty; group shared memory will be available in every group.',
117
+ });
118
+ }
119
+ if (config.service.memory_group_enabled && !config.security.require_group_mentions) {
120
+ findings.push({
121
+ level: 'warn',
122
+ message: 'service.memory_group_enabled is enabled while security.require_group_mentions=false; group memory can be influenced by non-@ messages if the project also disables mention_required.',
123
+ });
124
+ }
125
+ if (config.service.memory_cleanup_interval_seconds < 60) {
126
+ findings.push({
127
+ level: 'warn',
128
+ message: 'service.memory_cleanup_interval_seconds is very low; background memory cleanup may generate unnecessary churn.',
129
+ });
130
+ }
131
+ if (config.service.audit_cleanup_interval_seconds < 300) {
132
+ findings.push({
133
+ level: 'warn',
134
+ message: 'service.audit_cleanup_interval_seconds is very low; audit retention cleanup may generate unnecessary churn.',
135
+ });
136
+ }
137
+ if (config.service.audit_archive_after_days >= config.service.audit_retention_days) {
138
+ findings.push({
139
+ level: 'warn',
140
+ message: 'service.audit_archive_after_days should be lower than service.audit_retention_days, otherwise archived audit events may be removed immediately.',
141
+ });
142
+ }
143
+ try {
144
+ await ensureDir(config.storage.dir);
145
+ findings.push({ level: 'info', message: `Storage directory ready: ${config.storage.dir}` });
146
+ }
147
+ catch {
148
+ findings.push({ level: 'error', message: `Storage directory is not writable: ${config.storage.dir}` });
149
+ }
150
+ const allowedRoots = config.security.allowed_project_roots.map((root) => path.resolve(root));
151
+ const enabledMcpTokens = [
152
+ ...(config.mcp.auth_token ? ['legacy'] : []),
153
+ ...config.mcp.auth_tokens.filter((token) => token.enabled !== false).map((token) => token.id),
154
+ ];
155
+ if (config.mcp.transport === 'http' && enabledMcpTokens.length === 0) {
156
+ findings.push({
157
+ level: 'warn',
158
+ message: 'mcp.transport=http is enabled without any MCP auth token; MCP HTTP/SSE endpoints will be exposed without authentication.',
159
+ });
160
+ }
161
+ if (config.mcp.active_auth_token_id && !config.mcp.auth_tokens.some((token) => token.id === config.mcp.active_auth_token_id && token.enabled !== false)) {
162
+ findings.push({
163
+ level: 'warn',
164
+ message: `mcp.active_auth_token_id does not point to an enabled token: ${config.mcp.active_auth_token_id}`,
165
+ });
166
+ }
167
+ for (const [alias, project] of Object.entries(config.projects)) {
168
+ const resolvedRoot = path.resolve(project.root);
169
+ try {
170
+ const stats = await fs.stat(resolvedRoot);
171
+ if (!stats.isDirectory()) {
172
+ findings.push({ level: 'error', message: `Project ${alias} root is not a directory: ${resolvedRoot}` });
173
+ continue;
174
+ }
175
+ findings.push({ level: 'info', message: `Project ${alias} root found: ${resolvedRoot}` });
176
+ if (allowedRoots.length > 0 && !allowedRoots.some((allowedRoot) => isSubPath(resolvedRoot, allowedRoot))) {
177
+ findings.push({ level: 'error', message: `Project ${alias} root is outside security.allowed_project_roots: ${resolvedRoot}` });
178
+ }
179
+ if (!project.mention_required && !config.security.require_group_mentions) {
180
+ findings.push({ level: 'warn', message: `Project ${alias} has mention_required=false; group chats can trigger runs without @mention.` });
181
+ }
182
+ for (const [label, dir] of [
183
+ ['download dir', getProjectDownloadsDir(config.storage.dir, alias, project)],
184
+ ['temp dir', getProjectTempDir(config.storage.dir, alias, project)],
185
+ ['cache dir', getProjectCacheDir(config.storage.dir, alias, project)],
186
+ ['log dir', getProjectLogDir(config.storage.dir, alias, project)],
187
+ ]) {
188
+ try {
189
+ await ensureDir(dir);
190
+ findings.push({ level: 'info', message: `Project ${alias} ${label} ready: ${dir}` });
191
+ }
192
+ catch {
193
+ findings.push({ level: 'error', message: `Project ${alias} ${label} is not writable: ${dir}` });
194
+ }
195
+ }
196
+ const gitDir = path.join(resolvedRoot, '.git');
197
+ try {
198
+ await fs.access(gitDir);
199
+ }
200
+ catch {
201
+ findings.push({ level: 'warn', message: `Project ${alias} is not a Git repository: ${resolvedRoot}` });
202
+ }
203
+ }
204
+ catch {
205
+ findings.push({ level: 'error', message: `Project ${alias} root does not exist: ${resolvedRoot}` });
206
+ }
207
+ }
208
+ if (Object.keys(config.projects).length === 0) {
209
+ findings.push({ level: 'error', message: 'No projects configured.' });
210
+ }
211
+ // ── Embedding provider check ──
212
+ if (config.embedding.provider === 'ollama') {
213
+ const ollamaProvider = new OllamaEmbeddingProvider({
214
+ base_url: config.embedding.ollama_base_url,
215
+ model: config.embedding.ollama_model,
216
+ timeout_ms: config.embedding.ollama_timeout_ms,
217
+ });
218
+ const discovery = await ollamaProvider.discoverModels();
219
+ if (discovery.resolved_model) {
220
+ findings.push({
221
+ level: 'info',
222
+ message: `Ollama 嵌入服务可用,模型: ${discovery.resolved_model}`,
223
+ });
224
+ }
225
+ else if (discovery.available_models.length > 0) {
226
+ // Ollama is reachable but no embedding models found
227
+ findings.push({
228
+ level: 'warn',
229
+ message: 'Ollama 可用但未找到嵌入模型,将回退到本地向量化',
230
+ });
231
+ }
232
+ else {
233
+ // Ollama not reachable or returned no models at all
234
+ findings.push({
235
+ level: 'error',
236
+ message: `Ollama 不可达 (${config.embedding.ollama_base_url}),嵌入功能降级`,
237
+ });
238
+ }
239
+ }
240
+ else {
241
+ findings.push({
242
+ level: 'info',
243
+ message: '使用本地向量化(无需外部服务)',
244
+ });
245
+ }
246
+ return findings;
247
+ }
248
+ export async function findMissingEnvRefs(configPaths) {
249
+ const missing = new Set();
250
+ for (const configPath of configPaths) {
251
+ try {
252
+ const content = await fs.readFile(configPath, 'utf8');
253
+ for (const match of content.matchAll(/env:([A-Z0-9_]+)/g)) {
254
+ const envKey = match[1];
255
+ if (envKey && !process.env[envKey]) {
256
+ missing.add(envKey);
257
+ }
258
+ }
259
+ }
260
+ catch {
261
+ // ignore missing files here
262
+ }
263
+ }
264
+ return Array.from(missing)
265
+ .sort()
266
+ .map((envKey) => ({ level: 'error', message: `Missing environment variable: ${envKey}` }));
267
+ }
268
+ export async function runRemoteDoctor(config) {
269
+ const result = await inspectFeishuEnvironment(config.feishu);
270
+ return mapInspectResultToDoctorFindings(result);
271
+ }
272
+ export function mapInspectResultToDoctorFindings(result) {
273
+ const findings = [];
274
+ if (result.token.ok) {
275
+ findings.push({ level: 'info', message: `Feishu token check passed (expire=${result.token.expire ?? '-'})` });
276
+ }
277
+ else {
278
+ findings.push({ level: 'error', message: `Feishu token check failed: ${result.token.msg ?? 'unknown error'}` });
279
+ }
280
+ if (result.app.ok) {
281
+ findings.push({
282
+ level: 'info',
283
+ message: `Feishu app reachable: ${result.app.name ?? result.app_id ?? 'unknown app'} (status=${result.app.status ?? '-'})`,
284
+ });
285
+ }
286
+ else {
287
+ findings.push({ level: 'error', message: `Feishu app check failed: ${result.app.msg ?? 'unknown error'}` });
288
+ }
289
+ if (result.bot.ok) {
290
+ findings.push({
291
+ level: result.bot.activate_status === 0 ? 'warn' : 'info',
292
+ message: `Feishu bot reachable: ${result.bot.name ?? 'unknown bot'} (activate_status=${result.bot.activate_status ?? '-'})`,
293
+ });
294
+ }
295
+ else {
296
+ findings.push({ level: 'error', message: `Feishu bot check failed: ${result.bot.msg ?? 'unknown error'}` });
297
+ }
298
+ if (result.chats_probe.ok) {
299
+ findings.push({ level: 'info', message: `Feishu IM availability check passed (visible chats=${result.chats_probe.count ?? 0})` });
300
+ }
301
+ else {
302
+ const code = result.chats_probe.code !== undefined ? ` code=${result.chats_probe.code}` : '';
303
+ findings.push({
304
+ level: 'error',
305
+ message: `Feishu IM availability check failed:${code} ${result.chats_probe.msg ?? 'unknown error'}`.trim(),
306
+ });
307
+ }
308
+ return findings;
309
+ }
310
+ function isSubPath(candidate, parent) {
311
+ const relative = path.relative(parent, candidate);
312
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
313
+ }
314
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/config/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type InitMode = 'global' | 'project';
2
+ export declare function getInitTargetPath(mode: InitMode, cwd: string): string;
3
+ export declare function buildInitialConfig(mode: InitMode, cwd: string): string;
@@ -0,0 +1,123 @@
1
+ import path from 'node:path';
2
+ import { PROJECT_CONFIG_RELATIVE_PATH, getGlobalConfigPath } from './paths.js';
3
+ export function getInitTargetPath(mode, cwd) {
4
+ return mode === 'global' ? getGlobalConfigPath() : path.join(cwd, PROJECT_CONFIG_RELATIVE_PATH);
5
+ }
6
+ export function buildInitialConfig(mode, cwd) {
7
+ const defaultRoot = mode === 'project' ? '.' : cwd;
8
+ return `version = 1
9
+
10
+ [service]
11
+ default_project = "default"
12
+ project_switch_auto_adopt_latest = false
13
+ reply_mode = "text"
14
+ emit_progress_updates = false
15
+ progress_update_interval_ms = 4000
16
+ metrics_host = "127.0.0.1"
17
+ idempotency_ttl_seconds = 86400
18
+ session_history_limit = 20
19
+ log_tail_lines = 100
20
+ log_rotate_max_bytes = 10485760
21
+ log_rotate_keep_files = 5
22
+ reply_quote_user_message = true
23
+ reply_quote_max_chars = 120
24
+ download_message_resources = false
25
+ transcribe_audio_messages = false
26
+ describe_image_messages = false
27
+ # openai_image_model = "gpt-4.1-mini"
28
+ memory_enabled = true
29
+ memory_search_limit = 3
30
+ memory_recent_limit = 5
31
+ memory_prompt_max_chars = 1600
32
+ thread_summary_max_chars = 1200
33
+ memory_group_enabled = false
34
+ memory_cleanup_interval_seconds = 1800
35
+ audit_archive_after_days = 7
36
+ audit_retention_days = 30
37
+ audit_cleanup_interval_seconds = 3600
38
+ memory_max_pinned_per_scope = 5
39
+ memory_pin_overflow_strategy = "age-out"
40
+ memory_pin_age_basis = "updated_at"
41
+ # memory_default_ttl_days = 30
42
+ # transcribe_cli_path = "~/.codex/skills/transcribe/scripts/transcribe_diarize.py"
43
+ # metrics_port = 9464
44
+
45
+ [codex]
46
+ bin = "codex"
47
+ # shell = "/bin/zsh"
48
+ # pre_exec = "proxy_on"
49
+ default_sandbox = "workspace-write"
50
+ skip_git_repo_check = true
51
+ output_token_limit = 4000
52
+ run_timeout_ms = 1800000
53
+ bridge_instructions = "Reply concisely for Feishu. Include changed files and verification when relevant."
54
+
55
+ [storage]
56
+ dir = "~/.feique/state"
57
+
58
+ [security]
59
+ allowed_project_roots = []
60
+ # viewer_chat_ids = ["oc_viewer_chat_1"]
61
+ # operator_chat_ids = ["oc_operator_chat_1"]
62
+ admin_chat_ids = []
63
+ # service_observer_chat_ids = ["oc_service_observer_1"]
64
+ # service_restart_chat_ids = ["oc_service_restart_1"]
65
+ # config_admin_chat_ids = ["oc_config_admin_1"]
66
+ require_group_mentions = true
67
+
68
+ [mcp]
69
+ transport = "stdio"
70
+ host = "127.0.0.1"
71
+ port = 8765
72
+ path = "/mcp"
73
+ sse_path = "/mcp/sse"
74
+ message_path = "/mcp/message"
75
+ # auth_token = "env:MCP_AUTH_TOKEN"
76
+ # active_auth_token_id = "primary"
77
+ # [[mcp.auth_tokens]]
78
+ # id = "primary"
79
+ # token = "env:MCP_AUTH_TOKEN_PRIMARY"
80
+ # enabled = true
81
+ # [[mcp.auth_tokens]]
82
+ # id = "rollover"
83
+ # token = "env:MCP_AUTH_TOKEN_ROLLOVER"
84
+ # enabled = true
85
+
86
+ [feishu]
87
+ app_id = "env:FEISHU_APP_ID"
88
+ app_secret = "env:FEISHU_APP_SECRET"
89
+ # dry_run = true
90
+ # transport = "long-connection" for local-only messaging; use "webhook" when you need interactive card callbacks.
91
+ transport = "long-connection"
92
+ # encrypt_key = "env:FEISHU_ENCRYPT_KEY"
93
+ # verification_token = "env:FEISHU_VERIFICATION_TOKEN"
94
+ host = "0.0.0.0"
95
+ port = 3333
96
+ event_path = "/webhook/event"
97
+ card_path = "/webhook/card"
98
+ allowed_chat_ids = []
99
+ allowed_group_ids = []
100
+
101
+ [projects.default]
102
+ root = "${defaultRoot}"
103
+ session_scope = "chat"
104
+ mention_required = true
105
+ # viewer_chat_ids = ["oc_project_viewer_1"]
106
+ # operator_chat_ids = ["oc_project_operator_1"]
107
+ admin_chat_ids = []
108
+ # session_operator_chat_ids = ["oc_session_operator_1"]
109
+ # run_operator_chat_ids = ["oc_run_operator_1"]
110
+ # config_admin_chat_ids = ["oc_project_config_admin_1"]
111
+ chat_rate_limit_window_seconds = 60
112
+ chat_rate_limit_max_runs = 20
113
+ # profile = "default"
114
+ # sandbox = "workspace-write"
115
+ # description = "Main repo"
116
+ # download_dir = "./.feique/downloads"
117
+ # temp_dir = "./.feique/tmp"
118
+ # cache_dir = "./.feique/cache"
119
+ # log_dir = "./.feique/logs"
120
+ # run_priority = 100
121
+ `;
122
+ }
123
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/config/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAI/E,MAAM,UAAU,iBAAiB,CAAC,IAAc,EAAE,GAAW;IAC3D,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAc,EAAE,GAAW;IAC5D,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8FC,WAAW;;;;;;;;;;;;;;;;;;;CAmBpB,CAAC;AACF,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type BridgeConfig } from './schema.js';
2
+ export interface LoadedConfig {
3
+ config: BridgeConfig;
4
+ sources: string[];
5
+ }
6
+ export interface LoadedRuntimeConfig {
7
+ config: {
8
+ service: {
9
+ name: string;
10
+ log_tail_lines: number;
11
+ log_rotate_max_bytes: number;
12
+ log_rotate_keep_files: number;
13
+ };
14
+ storage: {
15
+ dir: string;
16
+ };
17
+ };
18
+ sources: string[];
19
+ }
20
+ export declare function loadBridgeConfig(options?: {
21
+ cwd?: string;
22
+ configPath?: string;
23
+ }): Promise<LoadedConfig>;
24
+ export declare function loadBridgeConfigFile(configPath: string, behavior?: {
25
+ resolveEnv?: boolean;
26
+ }): Promise<LoadedConfig>;
27
+ export declare function loadRuntimeConfig(options?: {
28
+ cwd?: string;
29
+ configPath?: string;
30
+ }): Promise<LoadedRuntimeConfig>;
31
+ export declare function findNearestProjectConfig(cwd: string): Promise<string | null>;
32
+ export declare function readRawToml(filePath: string): Promise<Record<string, unknown>>;
33
+ export declare function writeToml(filePath: string, data: Record<string, unknown>): Promise<void>;