@spaceflow/core 0.1.3 → 0.3.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 (56) hide show
  1. package/dist/index.js +2642 -3247
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -13
  4. package/src/config/config-loader.ts +5 -6
  5. package/src/config/config-reader.service.ts +6 -11
  6. package/src/config/config-reader.ts +75 -0
  7. package/src/config/index.ts +4 -1
  8. package/src/config/load-env.ts +15 -0
  9. package/src/config/schema-generator.service.ts +0 -2
  10. package/src/config/spaceflow.config.ts +7 -20
  11. package/src/extension-system/define-extension.ts +25 -0
  12. package/src/extension-system/extension.interface.ts +0 -63
  13. package/src/extension-system/index.ts +5 -0
  14. package/src/extension-system/types.ts +201 -0
  15. package/src/index.ts +15 -18
  16. package/src/shared/claude-setup/claude-setup.service.ts +3 -8
  17. package/src/shared/claude-setup/index.ts +0 -1
  18. package/src/shared/feishu-sdk/feishu-sdk.service.ts +33 -21
  19. package/src/shared/feishu-sdk/fieshu-card.service.ts +9 -11
  20. package/src/shared/feishu-sdk/index.ts +0 -1
  21. package/src/shared/git-provider/adapters/gitea.adapter.ts +59 -22
  22. package/src/shared/git-provider/adapters/github.adapter.spec.ts +2 -1
  23. package/src/shared/git-provider/adapters/github.adapter.ts +200 -29
  24. package/src/shared/git-provider/adapters/gitlab.adapter.ts +78 -26
  25. package/src/shared/git-provider/git-provider.interface.ts +20 -1
  26. package/src/shared/git-provider/git-provider.service.ts +28 -6
  27. package/src/shared/git-provider/index.ts +0 -1
  28. package/src/shared/git-provider/types.ts +27 -0
  29. package/src/shared/git-sdk/git-sdk.service.ts +0 -2
  30. package/src/shared/git-sdk/index.ts +0 -1
  31. package/src/shared/llm-proxy/adapters/claude-code.adapter.spec.ts +15 -32
  32. package/src/shared/llm-proxy/adapters/claude-code.adapter.ts +5 -6
  33. package/src/shared/llm-proxy/adapters/open-code.adapter.ts +1 -3
  34. package/src/shared/llm-proxy/adapters/openai.adapter.spec.ts +7 -21
  35. package/src/shared/llm-proxy/adapters/openai.adapter.ts +1 -3
  36. package/src/shared/llm-proxy/index.ts +0 -1
  37. package/src/shared/llm-proxy/interfaces/config.interface.ts +8 -0
  38. package/src/shared/llm-proxy/llm-proxy.service.spec.ts +91 -68
  39. package/src/shared/llm-proxy/llm-proxy.service.ts +5 -8
  40. package/src/shared/mcp/index.ts +1 -33
  41. package/src/shared/output/index.ts +0 -1
  42. package/src/shared/output/output.service.ts +43 -13
  43. package/src/shared/rspack-config/rspack-config.ts +0 -6
  44. package/src/shared/storage/index.ts +0 -1
  45. package/src/shared/storage/storage.service.ts +16 -8
  46. package/src/shared/storage/types.ts +0 -44
  47. package/src/shared/verbose/index.ts +15 -0
  48. package/src/app.module.ts +0 -18
  49. package/src/config/config-reader.module.ts +0 -16
  50. package/src/shared/claude-setup/claude-setup.module.ts +0 -8
  51. package/src/shared/feishu-sdk/feishu-sdk.module.ts +0 -77
  52. package/src/shared/git-provider/git-provider.module.ts +0 -73
  53. package/src/shared/git-sdk/git-sdk.module.ts +0 -8
  54. package/src/shared/llm-proxy/llm-proxy.module.ts +0 -140
  55. package/src/shared/output/output.module.ts +0 -9
  56. package/src/shared/storage/storage.module.ts +0 -150
@@ -1,16 +0,0 @@
1
- import { Global, Module } from "@nestjs/common";
2
- import { ConfigReaderService } from "./config-reader.service";
3
- import { SchemaGeneratorService } from "./schema-generator.service";
4
-
5
- /**
6
- * 配置读取模块
7
- * 提供插件配置读取服务和 Schema 生成服务
8
- *
9
- * 插件的 defaultConfig 通过 getMetadata() 返回,在插件加载时自动注册
10
- */
11
- @Global()
12
- @Module({
13
- providers: [ConfigReaderService, SchemaGeneratorService],
14
- exports: [ConfigReaderService, SchemaGeneratorService],
15
- })
16
- export class ConfigReaderModule {}
@@ -1,8 +0,0 @@
1
- import { Module } from "@nestjs/common";
2
- import { ClaudeSetupService } from "./claude-setup.service";
3
-
4
- @Module({
5
- providers: [ClaudeSetupService],
6
- exports: [ClaudeSetupService],
7
- })
8
- export class ClaudeSetupModule {}
@@ -1,77 +0,0 @@
1
- import { DynamicModule, Module } from "@nestjs/common";
2
- import { ConfigModule, ConfigService } from "@nestjs/config";
3
- import { EventEmitterModule } from "@nestjs/event-emitter";
4
- import { FeishuSdkService } from "./feishu-sdk.service";
5
- import { FeishuCardService } from "./fieshu-card.service";
6
- import { FeishuModuleOptions, FeishuModuleAsyncOptions, FEISHU_MODULE_OPTIONS } from "./types";
7
- import { feishuConfig, FeishuConfig } from "../../config";
8
-
9
- @Module({})
10
- export class FeishuSdkModule {
11
- /**
12
- * 同步注册模块
13
- */
14
- static forRoot(options: FeishuModuleOptions): DynamicModule {
15
- return {
16
- module: FeishuSdkModule,
17
- imports: [EventEmitterModule.forRoot()],
18
- providers: [
19
- {
20
- provide: FEISHU_MODULE_OPTIONS,
21
- useValue: options,
22
- },
23
- FeishuSdkService,
24
- FeishuCardService,
25
- ],
26
- exports: [FeishuSdkService, FeishuCardService],
27
- };
28
- }
29
-
30
- /**
31
- * 异步注册模块 - 支持从环境变量等动态获取配置
32
- */
33
- static forRootAsync(options: FeishuModuleAsyncOptions): DynamicModule {
34
- return {
35
- module: FeishuSdkModule,
36
- imports: [EventEmitterModule.forRoot()],
37
- providers: [
38
- {
39
- provide: FEISHU_MODULE_OPTIONS,
40
- useFactory: options.useFactory,
41
- inject: options.inject || [],
42
- },
43
- FeishuSdkService,
44
- FeishuCardService,
45
- ],
46
- exports: [FeishuSdkService, FeishuCardService],
47
- };
48
- }
49
-
50
- /**
51
- * 使用 ConfigService 注册模块
52
- */
53
- static forFeature(): DynamicModule {
54
- return {
55
- module: FeishuSdkModule,
56
- imports: [ConfigModule.forFeature(feishuConfig), EventEmitterModule.forRoot()],
57
- providers: [
58
- {
59
- provide: FEISHU_MODULE_OPTIONS,
60
- useFactory: (configService: ConfigService): FeishuModuleOptions => {
61
- const config = configService.get<FeishuConfig>("feishu");
62
- return {
63
- appId: config?.appId || "",
64
- appSecret: config?.appSecret || "",
65
- appType: config?.appType,
66
- domain: config?.domain,
67
- };
68
- },
69
- inject: [ConfigService],
70
- },
71
- FeishuSdkService,
72
- FeishuCardService,
73
- ],
74
- exports: [FeishuSdkService, FeishuCardService],
75
- };
76
- }
77
- }
@@ -1,73 +0,0 @@
1
- import { DynamicModule, Module } from "@nestjs/common";
2
- import { ConfigModule, ConfigService } from "@nestjs/config";
3
- import { GitProviderService } from "./git-provider.service";
4
- import {
5
- type GitProviderModuleOptions,
6
- type GitProviderModuleAsyncOptions,
7
- GIT_PROVIDER_MODULE_OPTIONS,
8
- } from "./types";
9
- import { gitProviderConfig, type GitProviderConfig } from "../../config/git-provider.config";
10
-
11
- @Module({})
12
- export class GitProviderModule {
13
- /**
14
- * 同步注册模块
15
- */
16
- static forRoot(options: GitProviderModuleOptions): DynamicModule {
17
- return {
18
- module: GitProviderModule,
19
- providers: [
20
- {
21
- provide: GIT_PROVIDER_MODULE_OPTIONS,
22
- useValue: options,
23
- },
24
- GitProviderService,
25
- ],
26
- exports: [GitProviderService],
27
- };
28
- }
29
-
30
- /**
31
- * 异步注册模块 - 支持从环境变量等动态获取配置
32
- */
33
- static forRootAsync(options: GitProviderModuleAsyncOptions): DynamicModule {
34
- return {
35
- module: GitProviderModule,
36
- providers: [
37
- {
38
- provide: GIT_PROVIDER_MODULE_OPTIONS,
39
- useFactory: options.useFactory,
40
- inject: options.inject || [],
41
- },
42
- GitProviderService,
43
- ],
44
- exports: [GitProviderService],
45
- };
46
- }
47
-
48
- /**
49
- * 使用 ConfigService 注册模块
50
- */
51
- static forFeature(): DynamicModule {
52
- return {
53
- module: GitProviderModule,
54
- imports: [ConfigModule.forFeature(gitProviderConfig)],
55
- providers: [
56
- {
57
- provide: GIT_PROVIDER_MODULE_OPTIONS,
58
- useFactory: (configService: ConfigService): GitProviderModuleOptions => {
59
- const config = configService.get<GitProviderConfig>("gitProvider");
60
- return {
61
- provider: config?.provider || "gitea",
62
- baseUrl: config?.serverUrl || "",
63
- token: config?.token || "",
64
- };
65
- },
66
- inject: [ConfigService],
67
- },
68
- GitProviderService,
69
- ],
70
- exports: [GitProviderService],
71
- };
72
- }
73
- }
@@ -1,8 +0,0 @@
1
- import { Module } from "@nestjs/common";
2
- import { GitSdkService } from "./git-sdk.service";
3
-
4
- @Module({
5
- providers: [GitSdkService],
6
- exports: [GitSdkService],
7
- })
8
- export class GitSdkModule {}
@@ -1,140 +0,0 @@
1
- import { Module, DynamicModule, Provider, Type } from "@nestjs/common";
2
- import { LlmProxyService } from "./llm-proxy.service";
3
- import { ClaudeCodeAdapter } from "./adapters/claude-code.adapter";
4
- import { OpenAIAdapter } from "./adapters/openai.adapter";
5
- import { ClaudeSetupModule } from "../claude-setup";
6
- import type { LlmProxyConfig } from "./interfaces";
7
- import { OpenCodeAdapter } from "./adapters";
8
-
9
- export interface LlmProxyModuleOptions extends LlmProxyConfig {}
10
-
11
- export interface LlmProxyModuleAsyncOptions {
12
- imports?: any[];
13
- useFactory?: (...args: any[]) => Promise<LlmProxyConfig> | LlmProxyConfig;
14
- inject?: any[];
15
- useClass?: Type<LlmProxyOptionsFactory>;
16
- useExisting?: Type<LlmProxyOptionsFactory>;
17
- }
18
-
19
- export interface LlmProxyOptionsFactory {
20
- createLlmProxyOptions(): Promise<LlmProxyConfig> | LlmProxyConfig;
21
- }
22
-
23
- @Module({})
24
- export class LlmProxyModule {
25
- static forRoot(options: LlmProxyModuleOptions): DynamicModule {
26
- const resolvedOptions = this.resolveOpenCodeConfig(options);
27
- return {
28
- module: LlmProxyModule,
29
- imports: [ClaudeSetupModule],
30
- providers: [
31
- {
32
- provide: "LLM_PROXY_CONFIG",
33
- useValue: resolvedOptions,
34
- },
35
- ClaudeCodeAdapter,
36
- OpenAIAdapter,
37
- OpenCodeAdapter,
38
- LlmProxyService,
39
- ],
40
- exports: [LlmProxyService, ClaudeCodeAdapter, OpenCodeAdapter, OpenAIAdapter],
41
- };
42
- }
43
-
44
- static forRootAsync(options: LlmProxyModuleAsyncOptions): DynamicModule {
45
- const asyncProviders = this.createAsyncProviders(options);
46
-
47
- return {
48
- module: LlmProxyModule,
49
- imports: [...(options.imports || []), ClaudeSetupModule],
50
- providers: [
51
- ...asyncProviders,
52
- ClaudeCodeAdapter,
53
- OpenAIAdapter,
54
- OpenCodeAdapter,
55
- LlmProxyService,
56
- ],
57
- exports: [LlmProxyService, ClaudeCodeAdapter, OpenCodeAdapter, OpenAIAdapter],
58
- };
59
- }
60
-
61
- private static createAsyncProviders(options: LlmProxyModuleAsyncOptions): Provider[] {
62
- if (options.useFactory) {
63
- const originalFactory = options.useFactory;
64
- return [
65
- {
66
- provide: "LLM_PROXY_CONFIG",
67
- useFactory: async (...args: any[]) => {
68
- const config = await originalFactory(...args);
69
- return this.resolveOpenCodeConfig(config);
70
- },
71
- inject: options.inject || [],
72
- },
73
- ];
74
- }
75
-
76
- if (options.useClass) {
77
- return [
78
- {
79
- provide: "LLM_PROXY_CONFIG",
80
- useFactory: async (optionsFactory: LlmProxyOptionsFactory) =>
81
- optionsFactory.createLlmProxyOptions(),
82
- inject: [options.useClass],
83
- },
84
- {
85
- provide: options.useClass,
86
- useClass: options.useClass,
87
- },
88
- ];
89
- }
90
-
91
- if (options.useExisting) {
92
- return [
93
- {
94
- provide: "LLM_PROXY_CONFIG",
95
- useFactory: async (optionsFactory: LlmProxyOptionsFactory) =>
96
- optionsFactory.createLlmProxyOptions(),
97
- inject: [options.useExisting],
98
- },
99
- ];
100
- }
101
-
102
- return [];
103
- }
104
-
105
- private static resolveOpenCodeConfig(config: LlmProxyConfig): LlmProxyConfig {
106
- if (!config.openCode) {
107
- return config;
108
- }
109
-
110
- const providerID = config.openCode.providerID || "openai";
111
- let apiKey = config.openCode.apiKey;
112
- let baseUrl = config.openCode.baseUrl;
113
- let model = config.openCode.model;
114
-
115
- // 根据 providerID 从对应的 adapter 配置中读取缺失的值
116
- if (providerID === "openai" && config.openai) {
117
- if (!apiKey) apiKey = config.openai.apiKey;
118
- if (!baseUrl) baseUrl = config.openai.baseUrl;
119
- if (!model) model = config.openai.model;
120
- } else if (providerID === "anthropic" && config.claudeCode) {
121
- if (!apiKey) apiKey = config.claudeCode.authToken;
122
- if (!baseUrl) baseUrl = config.claudeCode.baseUrl;
123
- if (!model) model = config.claudeCode.model;
124
- }
125
-
126
- // 如果有任何值需要更新
127
- if (
128
- apiKey !== config.openCode.apiKey ||
129
- baseUrl !== config.openCode.baseUrl ||
130
- model !== config.openCode.model
131
- ) {
132
- return {
133
- ...config,
134
- openCode: { ...config.openCode, apiKey, baseUrl, model },
135
- };
136
- }
137
-
138
- return config;
139
- }
140
- }
@@ -1,9 +0,0 @@
1
- import { Global, Module } from "@nestjs/common";
2
- import { OutputService } from "./output.service";
3
-
4
- @Global()
5
- @Module({
6
- providers: [OutputService],
7
- exports: [OutputService],
8
- })
9
- export class OutputModule {}
@@ -1,150 +0,0 @@
1
- import { DynamicModule, Module } from "@nestjs/common";
2
- import { ConfigModule, ConfigService } from "@nestjs/config";
3
- import { StorageService } from "./storage.service";
4
- import { MemoryAdapter } from "./adapters/memory.adapter";
5
- import { FileAdapter } from "./adapters/file.adapter";
6
- import { StorageAdapter } from "./adapters/storage-adapter.interface";
7
- import {
8
- type StorageModuleOptions,
9
- type StorageModuleAsyncOptions,
10
- STORAGE_MODULE_OPTIONS,
11
- STORAGE_ADAPTER,
12
- } from "./types";
13
- import { storageConfig, StorageConfig } from "../../config";
14
-
15
- /**
16
- * 创建适配器实例
17
- */
18
- function createAdapter(options: StorageModuleOptions): StorageAdapter {
19
- switch (options.adapter) {
20
- case "file":
21
- if (!options.filePath) {
22
- throw new Error("filePath is required for file adapter");
23
- }
24
- return new FileAdapter(options.filePath);
25
- case "memory":
26
- default:
27
- return new MemoryAdapter();
28
- }
29
- }
30
-
31
- @Module({})
32
- export class StorageModule {
33
- /**
34
- * 同步注册模块
35
- *
36
- * @example
37
- * ```ts
38
- * StorageModule.forRoot({
39
- * adapter: 'memory',
40
- * defaultTtl: 3600000, // 1 hour
41
- * })
42
- * ```
43
- *
44
- * @example
45
- * ```ts
46
- * StorageModule.forRoot({
47
- * adapter: 'file',
48
- * filePath: './data/storage.json',
49
- * })
50
- * ```
51
- */
52
- static forRoot(options: StorageModuleOptions): DynamicModule {
53
- return {
54
- module: StorageModule,
55
- providers: [
56
- {
57
- provide: STORAGE_MODULE_OPTIONS,
58
- useValue: options,
59
- },
60
- {
61
- provide: STORAGE_ADAPTER,
62
- useValue: createAdapter(options),
63
- },
64
- StorageService,
65
- ],
66
- exports: [StorageService],
67
- };
68
- }
69
-
70
- /**
71
- * 异步注册模块
72
- *
73
- * @example
74
- * ```ts
75
- * StorageModule.forRootAsync({
76
- * useFactory: (configService: ConfigService) => ({
77
- * adapter: configService.get('STORAGE_ADAPTER') || 'memory',
78
- * filePath: configService.get('STORAGE_FILE_PATH'),
79
- * }),
80
- * inject: [ConfigService],
81
- * })
82
- * ```
83
- */
84
- static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {
85
- return {
86
- module: StorageModule,
87
- providers: [
88
- {
89
- provide: STORAGE_MODULE_OPTIONS,
90
- useFactory: options.useFactory,
91
- inject: options.inject || [],
92
- },
93
- {
94
- provide: STORAGE_ADAPTER,
95
- useFactory: (opts: StorageModuleOptions) => createAdapter(opts),
96
- inject: [STORAGE_MODULE_OPTIONS],
97
- },
98
- StorageService,
99
- ],
100
- exports: [StorageService],
101
- };
102
- }
103
-
104
- /**
105
- * 使用 ConfigService 注册模块
106
- *
107
- * 环境变量:
108
- * - STORAGE_ADAPTER: 'memory' | 'file'
109
- * - STORAGE_FILE_PATH: 文件存储路径
110
- * - STORAGE_DEFAULT_TTL: 默认过期时间(毫秒)
111
- * - STORAGE_MAX_KEYS: 最大 key 数量
112
- *
113
- * @example
114
- * ```ts
115
- * @Module({
116
- * imports: [StorageModule.forFeature()],
117
- * })
118
- * export class AppModule {}
119
- * ```
120
- */
121
- static forFeature(): DynamicModule {
122
- return {
123
- global: true,
124
- module: StorageModule,
125
- imports: [ConfigModule.forFeature(storageConfig)],
126
- providers: [
127
- {
128
- provide: STORAGE_MODULE_OPTIONS,
129
- useFactory: (configService: ConfigService): StorageModuleOptions => {
130
- const config = configService.get<StorageConfig>("storage");
131
- return {
132
- adapter: config?.adapter || "memory",
133
- filePath: config?.filePath,
134
- defaultTtl: config?.defaultTtl,
135
- maxKeys: config?.maxKeys,
136
- };
137
- },
138
- inject: [ConfigService],
139
- },
140
- {
141
- provide: STORAGE_ADAPTER,
142
- useFactory: (opts: StorageModuleOptions) => createAdapter(opts),
143
- inject: [STORAGE_MODULE_OPTIONS],
144
- },
145
- StorageService,
146
- ],
147
- exports: [StorageService],
148
- };
149
- }
150
- }