persona-core-opencode 1.1.1 → 1.2.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.
- package/README.md +172 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +5 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/ossService.d.ts +120 -0
- package/dist/services/ossService.d.ts.map +1 -0
- package/dist/services/ossService.js +412 -0
- package/dist/services/ossService.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@ PersonaCore 是一个 AI 人格/角色框架,允许你定义具有特定能力
|
|
|
12
12
|
- **会话管理**:自动管理会话状态,支持多轮对话
|
|
13
13
|
- **工具调用追踪**:记录所有工具调用历史
|
|
14
14
|
- **流式输出**:支持实时回调获取 AI 响应和工具调用过程
|
|
15
|
+
- **OSS 对象存储**:支持将数据上传到 S3 兼容的对象存储服务
|
|
15
16
|
|
|
16
17
|
## 安装
|
|
17
18
|
|
|
@@ -427,6 +428,23 @@ response: {
|
|
|
427
428
|
}
|
|
428
429
|
```
|
|
429
430
|
|
|
431
|
+
**保存到对象存储(OSS):**
|
|
432
|
+
|
|
433
|
+
```typescript
|
|
434
|
+
response: {
|
|
435
|
+
type: 'json',
|
|
436
|
+
saveToOss: {
|
|
437
|
+
enabled: true,
|
|
438
|
+
bucket: 'my-bucket', // OSS bucket 名称
|
|
439
|
+
keyField: 'ossKey', // 从输入参数获取存储路径
|
|
440
|
+
dataPath: 'data.image', // 从响应中提取数据
|
|
441
|
+
sourceType: 'auto', // 'base64' | 'url' | 'auto'
|
|
442
|
+
contentType: 'image/png', // 可选:MIME 类型
|
|
443
|
+
outputField: 'ossUrl', // 输出字段名
|
|
444
|
+
},
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
430
448
|
## 异步任务支持
|
|
431
449
|
|
|
432
450
|
对于需要轮询等待结果的异步 API,可以配置 `asyncMode`:
|
|
@@ -468,6 +486,158 @@ const asyncAction: ActionNodeType = {
|
|
|
468
486
|
};
|
|
469
487
|
```
|
|
470
488
|
|
|
489
|
+
## OSS 服务(对象存储)
|
|
490
|
+
|
|
491
|
+
PersonaCore 提供了 `OssService` 用于将数据上传到 S3 兼容的对象存储服务(如 MinIO、阿里云 OSS、AWS S3 等)。
|
|
492
|
+
|
|
493
|
+
### 配置
|
|
494
|
+
|
|
495
|
+
在 `.env` 中配置 OSS 相关环境变量:
|
|
496
|
+
|
|
497
|
+
```bash
|
|
498
|
+
OSS_ENDPOINT=http://localhost:9000 # S3 兼容的 endpoint
|
|
499
|
+
OSS_ACCESS_KEY_ID=minioadmin # Access Key
|
|
500
|
+
OSS_SECRET_ACCESS_KEY=minioadmin # Secret Key
|
|
501
|
+
OSS_REGION=cn-beijing # 可选
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### 基本使用
|
|
505
|
+
|
|
506
|
+
```typescript
|
|
507
|
+
import { OssService, createOssServiceFromEnv } from 'persona-core-opencode';
|
|
508
|
+
|
|
509
|
+
// 从环境变量创建
|
|
510
|
+
const ossService = createOssServiceFromEnv();
|
|
511
|
+
|
|
512
|
+
// 或手动配置
|
|
513
|
+
const ossService = new OssService({
|
|
514
|
+
endpoint: 'http://localhost:9000',
|
|
515
|
+
accessKeyId: 'minioadmin',
|
|
516
|
+
secretAccessKey: 'minioadmin',
|
|
517
|
+
region: 'cn-beijing',
|
|
518
|
+
});
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### 上传方式
|
|
522
|
+
|
|
523
|
+
**1. 上传 Base64 数据:**
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
const result = await ossService.uploadFromBase64(
|
|
527
|
+
'my-bucket',
|
|
528
|
+
'images/photo.png',
|
|
529
|
+
'data:image/png;base64,iVBORw0KGgoAAAA...',
|
|
530
|
+
{ contentType: 'image/png' }
|
|
531
|
+
);
|
|
532
|
+
console.log(result.url); // http://localhost:9000/my-bucket/images/photo.png
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**2. 从 URL 下载后上传:**
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
const result = await ossService.uploadFromUrl(
|
|
539
|
+
'my-bucket',
|
|
540
|
+
'videos/movie.mp4',
|
|
541
|
+
'https://example.com/video.mp4'
|
|
542
|
+
);
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**3. 上传 Buffer:**
|
|
546
|
+
|
|
547
|
+
```typescript
|
|
548
|
+
const buffer = Buffer.from('Hello, World!', 'utf8');
|
|
549
|
+
const result = await ossService.uploadFromBuffer(
|
|
550
|
+
'my-bucket',
|
|
551
|
+
'files/hello.txt',
|
|
552
|
+
buffer,
|
|
553
|
+
{ contentType: 'text/plain' }
|
|
554
|
+
);
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
### 使用 SaveToOssConfig
|
|
558
|
+
|
|
559
|
+
最灵活的方式是使用 `uploadWithConfig()`,可以自动处理各种数据格式:
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
import { SaveToOssConfig } from 'persona-core-opencode';
|
|
563
|
+
|
|
564
|
+
// API 响应
|
|
565
|
+
const apiResponse = {
|
|
566
|
+
status: 'success',
|
|
567
|
+
data: { images: [{ base64: 'iVBORw0KGgoAAAA...' }] }
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
// 配置
|
|
571
|
+
const config: SaveToOssConfig = {
|
|
572
|
+
enabled: true,
|
|
573
|
+
bucket: 'my-bucket',
|
|
574
|
+
keyField: 'ossKey', // 从 inputs 中获取存储路径
|
|
575
|
+
dataPath: 'data.images[0].base64', // JSONPath 提取数据
|
|
576
|
+
sourceType: 'auto', // 自动检测 base64 或 URL
|
|
577
|
+
outputField: 'ossUrl',
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
// 上传
|
|
581
|
+
const result = await ossService.uploadWithConfig(
|
|
582
|
+
apiResponse,
|
|
583
|
+
config,
|
|
584
|
+
{ ossKey: 'generated/image.png' }
|
|
585
|
+
);
|
|
586
|
+
|
|
587
|
+
console.log(result);
|
|
588
|
+
// { success: true, url: '...', key: '...', bucket: '...', bytesUploaded: 70, contentType: 'image/png' }
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### SaveToOssConfig 字段
|
|
592
|
+
|
|
593
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
594
|
+
|------|------|------|------|
|
|
595
|
+
| `enabled` | boolean | 是 | 是否启用 |
|
|
596
|
+
| `bucket` | string | 是 | OSS bucket 名称 |
|
|
597
|
+
| `keyField` | string | 是 | 从 inputs 中获取 key 的字段名 |
|
|
598
|
+
| `dataPath` | string | 否 | JSONPath 从响应中提取数据 |
|
|
599
|
+
| `sourceType` | 'base64' \| 'url' \| 'auto' | 否 | 数据类型,默认 'auto' |
|
|
600
|
+
| `contentType` | string | 否 | MIME 类型,可自动推断 |
|
|
601
|
+
| `outputField` | string | 否 | 输出字段名,默认 'ossUrl' |
|
|
602
|
+
|
|
603
|
+
### 异步任务结果上传
|
|
604
|
+
|
|
605
|
+
在 `asyncMode.resultFetch` 中配置 `saveToOss`,可以在异步任务完成后自动上传结果:
|
|
606
|
+
|
|
607
|
+
```typescript
|
|
608
|
+
const videoAction: ActionNodeType = {
|
|
609
|
+
kind: 'action',
|
|
610
|
+
id: 'generate_video_to_oss',
|
|
611
|
+
name: '生成视频并上传到 OSS',
|
|
612
|
+
executionType: 'api_call',
|
|
613
|
+
apiConfig: { ... },
|
|
614
|
+
asyncMode: {
|
|
615
|
+
isAsync: true,
|
|
616
|
+
taskIdPath: 'data.taskId',
|
|
617
|
+
statusCheck: { ... },
|
|
618
|
+
resultFetch: {
|
|
619
|
+
extractFromStatus: { videoUrl: 'data.videoUrl' },
|
|
620
|
+
// 任务完成后自动上传到 OSS
|
|
621
|
+
saveToOss: {
|
|
622
|
+
enabled: true,
|
|
623
|
+
bucket: 'videos',
|
|
624
|
+
keyField: 'ossKey',
|
|
625
|
+
dataPath: 'data.videoUrl',
|
|
626
|
+
sourceType: 'url',
|
|
627
|
+
outputField: 'ossUrl',
|
|
628
|
+
},
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
inputFields: [
|
|
632
|
+
{ name: 'prompt', required: true, typeHint: 'string' },
|
|
633
|
+
{ name: 'ossKey', required: true, typeHint: 'string', description: 'OSS 存储路径' },
|
|
634
|
+
],
|
|
635
|
+
outputFields: [
|
|
636
|
+
{ name: 'ossUrl', required: true, typeHint: 'string', description: '上传后的 OSS URL' },
|
|
637
|
+
],
|
|
638
|
+
};
|
|
639
|
+
```
|
|
640
|
+
|
|
471
641
|
## 项目结构
|
|
472
642
|
|
|
473
643
|
```
|
|
@@ -483,6 +653,8 @@ persona-core-opencode/
|
|
|
483
653
|
│ │ └── sessionHandle.ts # 会话句柄
|
|
484
654
|
│ ├── generators/
|
|
485
655
|
│ │ └── toolFileGenerator.ts # 工具文件生成
|
|
656
|
+
│ ├── services/
|
|
657
|
+
│ │ └── ossService.ts # OSS 对象存储服务
|
|
486
658
|
│ └── types/
|
|
487
659
|
│ ├── common.ts # 通用类型
|
|
488
660
|
│ ├── nodes.ts # 节点类型定义
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export { Persona, CreatePersonaInput, findActionType, validatePersonaActionTypes
|
|
|
13
13
|
export { ActionNodeType, ThinkingNodeType, BranchNodeType, NodeType, } from './types/nodes.js';
|
|
14
14
|
export { PersonaId, NodeId, } from './types/common.js';
|
|
15
15
|
export { SessionExecutionResult, ToolCallRecord, StreamCallbacks, StreamLineCallback, } from './session/sessionHandle.js';
|
|
16
|
+
export { OssService, OssConfig, UploadOptions, UploadResult, createOssServiceFromEnv, } from './services/ossService.js';
|
|
17
|
+
export { SaveToOssConfig, SaveToFileConfig, ApiCallConfig, AsyncModeConfig, AsyncResultFetchConfig, } from './types/nodes.js';
|
|
16
18
|
export { PersonaRegistry, RegisteredPersona } from './persona/personaRegistry.js';
|
|
17
19
|
export { SessionManager } from './session/sessionManager.js';
|
|
18
20
|
export { generateToolFile, getToolFileName } from './generators/toolFileGenerator.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,MAAM,GACP,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,MAAM,GACP,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,10 @@ export { PersonaCoreClient, } from './client/personaCoreClient.js';
|
|
|
18
18
|
// Persona 相关类型
|
|
19
19
|
export { findActionType, validatePersonaActionTypes, } from './types/persona.js';
|
|
20
20
|
// ============================================================
|
|
21
|
+
// 服务
|
|
22
|
+
// ============================================================
|
|
23
|
+
export { OssService, createOssServiceFromEnv, } from './services/ossService.js';
|
|
24
|
+
// ============================================================
|
|
21
25
|
// 内部实现(仅供高级用户使用,不保证 API 稳定性)
|
|
22
26
|
// ============================================================
|
|
23
27
|
export { PersonaRegistry } from './persona/personaRegistry.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,OAAO,EACL,iBAAiB,GAIlB,MAAM,+BAA+B,CAAC;AAEvC,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D,eAAe;AACf,OAAO,EAGL,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAwB5B,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAqB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,OAAO,EACL,iBAAiB,GAIlB,MAAM,+BAA+B,CAAC;AAEvC,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D,eAAe;AACf,OAAO,EAGL,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAwB5B,+DAA+D;AAC/D,KAAK;AACL,+DAA+D;AAC/D,OAAO,EACL,UAAU,EAIV,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAWlC,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAqB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,uBAAuB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,EAIV,uBAAuB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSS 服务
|
|
3
|
+
* 提供对象存储(S3 兼容)上传功能
|
|
4
|
+
*/
|
|
5
|
+
import { SaveToOssConfig } from '../types/nodes.js';
|
|
6
|
+
/**
|
|
7
|
+
* OSS 配置
|
|
8
|
+
*/
|
|
9
|
+
export interface OssConfig {
|
|
10
|
+
/** S3 兼容的 endpoint URL */
|
|
11
|
+
endpoint: string;
|
|
12
|
+
/** Access Key ID */
|
|
13
|
+
accessKeyId: string;
|
|
14
|
+
/** Secret Access Key */
|
|
15
|
+
secretAccessKey: string;
|
|
16
|
+
/** Region,默认 'us-east-1' */
|
|
17
|
+
region?: string;
|
|
18
|
+
/** 是否强制使用路径样式访问(适用于 MinIO、RustFS 等) */
|
|
19
|
+
forcePathStyle?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 上传选项
|
|
23
|
+
*/
|
|
24
|
+
export interface UploadOptions {
|
|
25
|
+
/** 内容类型(MIME type) */
|
|
26
|
+
contentType?: string;
|
|
27
|
+
/** 自定义元数据 */
|
|
28
|
+
metadata?: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 上传结果
|
|
32
|
+
*/
|
|
33
|
+
export interface UploadResult {
|
|
34
|
+
/** 上传成功 */
|
|
35
|
+
success: boolean;
|
|
36
|
+
/** 对象的 URL */
|
|
37
|
+
url: string;
|
|
38
|
+
/** 对象的 key */
|
|
39
|
+
key: string;
|
|
40
|
+
/** bucket 名称 */
|
|
41
|
+
bucket: string;
|
|
42
|
+
/** 上传的字节数 */
|
|
43
|
+
bytesUploaded: number;
|
|
44
|
+
/** 内容类型 */
|
|
45
|
+
contentType: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* OSS 服务类
|
|
49
|
+
* 封装 S3 兼容的对象存储操作
|
|
50
|
+
*/
|
|
51
|
+
export declare class OssService {
|
|
52
|
+
private client;
|
|
53
|
+
private config;
|
|
54
|
+
constructor(config: OssConfig);
|
|
55
|
+
/**
|
|
56
|
+
* 从 base64 数据上传
|
|
57
|
+
* @param bucket bucket 名称
|
|
58
|
+
* @param key 对象 key(路径)
|
|
59
|
+
* @param base64Data base64 编码的数据(可能带 data URI 前缀)
|
|
60
|
+
* @param options 上传选项
|
|
61
|
+
*/
|
|
62
|
+
uploadFromBase64(bucket: string, key: string, base64Data: string, options?: UploadOptions): Promise<UploadResult>;
|
|
63
|
+
/**
|
|
64
|
+
* 从 URL 下载并上传
|
|
65
|
+
* @param bucket bucket 名称
|
|
66
|
+
* @param key 对象 key(路径)
|
|
67
|
+
* @param sourceUrl 源文件 URL
|
|
68
|
+
* @param options 上传选项
|
|
69
|
+
*/
|
|
70
|
+
uploadFromUrl(bucket: string, key: string, sourceUrl: string, options?: UploadOptions): Promise<UploadResult>;
|
|
71
|
+
/**
|
|
72
|
+
* 从 Buffer 上传
|
|
73
|
+
* @param bucket bucket 名称
|
|
74
|
+
* @param key 对象 key(路径)
|
|
75
|
+
* @param buffer 数据 buffer
|
|
76
|
+
* @param options 上传选项
|
|
77
|
+
*/
|
|
78
|
+
uploadFromBuffer(bucket: string, key: string, buffer: Buffer, options?: UploadOptions): Promise<UploadResult>;
|
|
79
|
+
/**
|
|
80
|
+
* 根据 SaveToOssConfig 上传数据
|
|
81
|
+
* 统一的上传入口,自动检测数据类型
|
|
82
|
+
*
|
|
83
|
+
* @param data 要上传的数据(base64、URL 或 Buffer)
|
|
84
|
+
* @param config SaveToOss 配置
|
|
85
|
+
* @param inputs 输入字段,用于获取 ossKey
|
|
86
|
+
*/
|
|
87
|
+
uploadWithConfig(data: unknown, config: SaveToOssConfig, inputs: Record<string, unknown>): Promise<UploadResult>;
|
|
88
|
+
/**
|
|
89
|
+
* 检测字符串是否看起来像 base64
|
|
90
|
+
*/
|
|
91
|
+
private looksLikeBase64;
|
|
92
|
+
/**
|
|
93
|
+
* 通过路径从对象中提取值
|
|
94
|
+
* 支持 JSONPath 风格的表达式,如 "data.result" 或 "items[0].url"
|
|
95
|
+
*/
|
|
96
|
+
private extractByPath;
|
|
97
|
+
/**
|
|
98
|
+
* 解析 base64 数据
|
|
99
|
+
* 支持 data URI 格式和纯 base64
|
|
100
|
+
*/
|
|
101
|
+
private parseBase64Data;
|
|
102
|
+
/**
|
|
103
|
+
* 构建对象的 URL
|
|
104
|
+
*/
|
|
105
|
+
private buildObjectUrl;
|
|
106
|
+
/**
|
|
107
|
+
* 根据 URL 猜测内容类型
|
|
108
|
+
*/
|
|
109
|
+
private guessContentTypeFromUrl;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 从环境变量创建 OSS 服务
|
|
113
|
+
* 使用以下环境变量:
|
|
114
|
+
* - OSS_ENDPOINT
|
|
115
|
+
* - OSS_ACCESS_KEY_ID
|
|
116
|
+
* - OSS_SECRET_ACCESS_KEY
|
|
117
|
+
* - OSS_REGION (可选)
|
|
118
|
+
*/
|
|
119
|
+
export declare function createOssServiceFromEnv(): OssService;
|
|
120
|
+
//# sourceMappingURL=ossService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ossService.d.ts","sourceRoot":"","sources":["../../src/services/ossService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAa7B;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IAwCxB;;;;;;OAMG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IA0FxB;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IAsCxB;;;;;;;OAOG;IACG,gBAAgB,CACpB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,YAAY,CAAC;IA+ExB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CA6BhC;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAsBpD"}
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSS 服务
|
|
3
|
+
* 提供对象存储(S3 兼容)上传功能
|
|
4
|
+
*/
|
|
5
|
+
import { S3Client, PutObjectCommand, } from '@aws-sdk/client-s3';
|
|
6
|
+
/**
|
|
7
|
+
* OSS 服务类
|
|
8
|
+
* 封装 S3 兼容的对象存储操作
|
|
9
|
+
*/
|
|
10
|
+
export class OssService {
|
|
11
|
+
client;
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.client = new S3Client({
|
|
16
|
+
endpoint: config.endpoint,
|
|
17
|
+
region: config.region ?? 'us-east-1',
|
|
18
|
+
credentials: {
|
|
19
|
+
accessKeyId: config.accessKeyId,
|
|
20
|
+
secretAccessKey: config.secretAccessKey,
|
|
21
|
+
},
|
|
22
|
+
forcePathStyle: config.forcePathStyle ?? true, // 默认使用路径样式
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 从 base64 数据上传
|
|
27
|
+
* @param bucket bucket 名称
|
|
28
|
+
* @param key 对象 key(路径)
|
|
29
|
+
* @param base64Data base64 编码的数据(可能带 data URI 前缀)
|
|
30
|
+
* @param options 上传选项
|
|
31
|
+
*/
|
|
32
|
+
async uploadFromBase64(bucket, key, base64Data, options) {
|
|
33
|
+
// 解析 data URI 或纯 base64
|
|
34
|
+
const { buffer, mimeType } = this.parseBase64Data(base64Data);
|
|
35
|
+
const contentType = options?.contentType ?? mimeType ?? 'application/octet-stream';
|
|
36
|
+
const params = {
|
|
37
|
+
Bucket: bucket,
|
|
38
|
+
Key: key,
|
|
39
|
+
Body: buffer,
|
|
40
|
+
ContentType: contentType,
|
|
41
|
+
Metadata: options?.metadata,
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
await this.client.send(new PutObjectCommand(params));
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`[OssService] Base64 upload failed`, {
|
|
48
|
+
bucket,
|
|
49
|
+
key,
|
|
50
|
+
contentType,
|
|
51
|
+
dataSize: buffer.length,
|
|
52
|
+
error: error instanceof Error ? {
|
|
53
|
+
message: error.message,
|
|
54
|
+
stack: error.stack,
|
|
55
|
+
name: error.name,
|
|
56
|
+
} : error,
|
|
57
|
+
});
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
url: this.buildObjectUrl(bucket, key),
|
|
63
|
+
key,
|
|
64
|
+
bucket,
|
|
65
|
+
bytesUploaded: buffer.length,
|
|
66
|
+
contentType,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 从 URL 下载并上传
|
|
71
|
+
* @param bucket bucket 名称
|
|
72
|
+
* @param key 对象 key(路径)
|
|
73
|
+
* @param sourceUrl 源文件 URL
|
|
74
|
+
* @param options 上传选项
|
|
75
|
+
*/
|
|
76
|
+
async uploadFromUrl(bucket, key, sourceUrl, options) {
|
|
77
|
+
// 下载文件
|
|
78
|
+
let response;
|
|
79
|
+
try {
|
|
80
|
+
response = await fetch(sourceUrl, {
|
|
81
|
+
headers: {
|
|
82
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
|
|
83
|
+
'Accept': '*/*',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error(`[OssService] URL download failed`, {
|
|
89
|
+
sourceUrl,
|
|
90
|
+
bucket,
|
|
91
|
+
key,
|
|
92
|
+
error: error instanceof Error ? {
|
|
93
|
+
message: error.message,
|
|
94
|
+
stack: error.stack,
|
|
95
|
+
name: error.name,
|
|
96
|
+
} : error,
|
|
97
|
+
});
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
console.error(`[OssService] URL download returned error`, {
|
|
102
|
+
sourceUrl,
|
|
103
|
+
bucket,
|
|
104
|
+
key,
|
|
105
|
+
status: response.status,
|
|
106
|
+
statusText: response.statusText,
|
|
107
|
+
});
|
|
108
|
+
throw new Error(`Failed to download from URL: ${response.status} ${response.statusText}`);
|
|
109
|
+
}
|
|
110
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
111
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
112
|
+
// 获取内容类型
|
|
113
|
+
let contentType = options?.contentType;
|
|
114
|
+
if (!contentType) {
|
|
115
|
+
const headerContentType = response.headers.get('content-type');
|
|
116
|
+
if (headerContentType) {
|
|
117
|
+
// 移除 charset 等额外信息
|
|
118
|
+
if (headerContentType.includes(';')) {
|
|
119
|
+
const parts = headerContentType.split(';');
|
|
120
|
+
contentType = parts[0]?.trim() ?? headerContentType;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
contentType = headerContentType;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
contentType = contentType ?? this.guessContentTypeFromUrl(sourceUrl) ?? 'application/octet-stream';
|
|
128
|
+
const params = {
|
|
129
|
+
Bucket: bucket,
|
|
130
|
+
Key: key,
|
|
131
|
+
Body: buffer,
|
|
132
|
+
ContentType: contentType,
|
|
133
|
+
Metadata: options?.metadata,
|
|
134
|
+
};
|
|
135
|
+
try {
|
|
136
|
+
await this.client.send(new PutObjectCommand(params));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`[OssService] URL file upload to OSS failed`, {
|
|
140
|
+
sourceUrl,
|
|
141
|
+
bucket,
|
|
142
|
+
key,
|
|
143
|
+
contentType,
|
|
144
|
+
dataSize: buffer.length,
|
|
145
|
+
error: error instanceof Error ? {
|
|
146
|
+
message: error.message,
|
|
147
|
+
stack: error.stack,
|
|
148
|
+
name: error.name,
|
|
149
|
+
} : error,
|
|
150
|
+
});
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
url: this.buildObjectUrl(bucket, key),
|
|
156
|
+
key,
|
|
157
|
+
bucket,
|
|
158
|
+
bytesUploaded: buffer.length,
|
|
159
|
+
contentType,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 从 Buffer 上传
|
|
164
|
+
* @param bucket bucket 名称
|
|
165
|
+
* @param key 对象 key(路径)
|
|
166
|
+
* @param buffer 数据 buffer
|
|
167
|
+
* @param options 上传选项
|
|
168
|
+
*/
|
|
169
|
+
async uploadFromBuffer(bucket, key, buffer, options) {
|
|
170
|
+
const contentType = options?.contentType ?? 'application/octet-stream';
|
|
171
|
+
const params = {
|
|
172
|
+
Bucket: bucket,
|
|
173
|
+
Key: key,
|
|
174
|
+
Body: buffer,
|
|
175
|
+
ContentType: contentType,
|
|
176
|
+
Metadata: options?.metadata,
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
await this.client.send(new PutObjectCommand(params));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error(`[OssService] Buffer upload failed`, {
|
|
183
|
+
bucket,
|
|
184
|
+
key,
|
|
185
|
+
contentType,
|
|
186
|
+
dataSize: buffer.length,
|
|
187
|
+
error: error instanceof Error ? {
|
|
188
|
+
message: error.message,
|
|
189
|
+
stack: error.stack,
|
|
190
|
+
name: error.name,
|
|
191
|
+
} : error,
|
|
192
|
+
});
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
success: true,
|
|
197
|
+
url: this.buildObjectUrl(bucket, key),
|
|
198
|
+
key,
|
|
199
|
+
bucket,
|
|
200
|
+
bytesUploaded: buffer.length,
|
|
201
|
+
contentType,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 根据 SaveToOssConfig 上传数据
|
|
206
|
+
* 统一的上传入口,自动检测数据类型
|
|
207
|
+
*
|
|
208
|
+
* @param data 要上传的数据(base64、URL 或 Buffer)
|
|
209
|
+
* @param config SaveToOss 配置
|
|
210
|
+
* @param inputs 输入字段,用于获取 ossKey
|
|
211
|
+
*/
|
|
212
|
+
async uploadWithConfig(data, config, inputs) {
|
|
213
|
+
// 获取 OSS key
|
|
214
|
+
const ossKey = inputs[config.keyField];
|
|
215
|
+
if (!ossKey) {
|
|
216
|
+
throw new Error(`saveToOss.keyField "${config.keyField}" not found in inputs`);
|
|
217
|
+
}
|
|
218
|
+
// 提取要保存的数据(如果配置了 dataPath)
|
|
219
|
+
let dataToSave = data;
|
|
220
|
+
if (config.dataPath) {
|
|
221
|
+
dataToSave = this.extractByPath(data, config.dataPath);
|
|
222
|
+
if (dataToSave === undefined) {
|
|
223
|
+
throw new Error(`Could not extract data from response using path: ${config.dataPath}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// 预处理:如果数据是对象且包含 url 字段,提取 url
|
|
227
|
+
if (typeof dataToSave === 'object' && dataToSave !== null &&
|
|
228
|
+
!ArrayBuffer.isView(dataToSave) && !(dataToSave instanceof ArrayBuffer) &&
|
|
229
|
+
'url' in dataToSave) {
|
|
230
|
+
dataToSave = dataToSave.url;
|
|
231
|
+
}
|
|
232
|
+
// 处理 ArrayBuffer/Buffer 类型(二进制响应)
|
|
233
|
+
if (dataToSave instanceof ArrayBuffer || ArrayBuffer.isView(dataToSave)) {
|
|
234
|
+
const buffer = dataToSave instanceof ArrayBuffer
|
|
235
|
+
? Buffer.from(dataToSave)
|
|
236
|
+
: Buffer.from(dataToSave.buffer, dataToSave.byteOffset, dataToSave.byteLength);
|
|
237
|
+
return this.uploadFromBuffer(config.bucket, ossKey, buffer, { contentType: config.contentType });
|
|
238
|
+
}
|
|
239
|
+
// 确定数据来源类型
|
|
240
|
+
const sourceType = config.sourceType ?? 'auto';
|
|
241
|
+
let detectedSourceType;
|
|
242
|
+
if (sourceType === 'auto') {
|
|
243
|
+
if (typeof dataToSave === 'string') {
|
|
244
|
+
if (dataToSave.startsWith('data:') || this.looksLikeBase64(dataToSave)) {
|
|
245
|
+
detectedSourceType = 'base64';
|
|
246
|
+
}
|
|
247
|
+
else if (dataToSave.startsWith('http://') || dataToSave.startsWith('https://')) {
|
|
248
|
+
detectedSourceType = 'url';
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
throw new Error('Cannot auto-detect source type. Data is not a valid base64 or URL.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
throw new Error('saveToOss requires string data (base64 or URL) or binary data (ArrayBuffer/Buffer)');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
detectedSourceType = sourceType;
|
|
260
|
+
}
|
|
261
|
+
if (typeof dataToSave !== 'string') {
|
|
262
|
+
throw new Error('saveToOss requires string data (base64 or URL) or binary data (ArrayBuffer/Buffer)');
|
|
263
|
+
}
|
|
264
|
+
// 根据来源类型上传
|
|
265
|
+
if (detectedSourceType === 'base64') {
|
|
266
|
+
return this.uploadFromBase64(config.bucket, ossKey, dataToSave, { contentType: config.contentType });
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return this.uploadFromUrl(config.bucket, ossKey, dataToSave, { contentType: config.contentType });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 检测字符串是否看起来像 base64
|
|
274
|
+
*/
|
|
275
|
+
looksLikeBase64(str) {
|
|
276
|
+
// 检查是否只包含 base64 字符
|
|
277
|
+
const base64Regex = /^[A-Za-z0-9+/]+=*$/;
|
|
278
|
+
// 至少 100 个字符且符合 base64 格式
|
|
279
|
+
return str.length >= 100 && base64Regex.test(str);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 通过路径从对象中提取值
|
|
283
|
+
* 支持 JSONPath 风格的表达式,如 "data.result" 或 "items[0].url"
|
|
284
|
+
*/
|
|
285
|
+
extractByPath(obj, path) {
|
|
286
|
+
const parts = path.match(/(\w+|\[\d+\])/g);
|
|
287
|
+
if (!parts)
|
|
288
|
+
return undefined;
|
|
289
|
+
let current = obj;
|
|
290
|
+
for (const part of parts) {
|
|
291
|
+
if (current === null || current === undefined)
|
|
292
|
+
return undefined;
|
|
293
|
+
if (part.startsWith('[') && part.endsWith(']')) {
|
|
294
|
+
// 数组索引
|
|
295
|
+
const index = parseInt(part.slice(1, -1), 10);
|
|
296
|
+
if (Array.isArray(current)) {
|
|
297
|
+
current = current[index];
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
// 对象属性
|
|
305
|
+
if (typeof current === 'object' && current !== null) {
|
|
306
|
+
current = current[part];
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return current;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 解析 base64 数据
|
|
317
|
+
* 支持 data URI 格式和纯 base64
|
|
318
|
+
*/
|
|
319
|
+
parseBase64Data(data) {
|
|
320
|
+
// 检查是否是 data URI 格式
|
|
321
|
+
if (data.startsWith('data:')) {
|
|
322
|
+
const match = data.match(/^data:([^;]+);base64,(.+)$/);
|
|
323
|
+
if (match && match[1] && match[2]) {
|
|
324
|
+
return {
|
|
325
|
+
buffer: Buffer.from(match[2], 'base64'),
|
|
326
|
+
mimeType: match[1],
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// 可能是 data:base64,xxx 格式
|
|
330
|
+
const simpleMatch = data.match(/^data:base64,(.+)$/);
|
|
331
|
+
if (simpleMatch && simpleMatch[1]) {
|
|
332
|
+
return {
|
|
333
|
+
buffer: Buffer.from(simpleMatch[1], 'base64'),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
throw new Error('Invalid data URI format');
|
|
337
|
+
}
|
|
338
|
+
// 纯 base64
|
|
339
|
+
return {
|
|
340
|
+
buffer: Buffer.from(data, 'base64'),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* 构建对象的 URL
|
|
345
|
+
*/
|
|
346
|
+
buildObjectUrl(bucket, key) {
|
|
347
|
+
// 使用路径样式 URL
|
|
348
|
+
const endpoint = this.config.endpoint.replace(/\/$/, '');
|
|
349
|
+
return `${endpoint}/${bucket}/${key}`;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* 根据 URL 猜测内容类型
|
|
353
|
+
*/
|
|
354
|
+
guessContentTypeFromUrl(url) {
|
|
355
|
+
try {
|
|
356
|
+
const pathname = new URL(url).pathname;
|
|
357
|
+
const ext = pathname.split('.').pop()?.toLowerCase();
|
|
358
|
+
const mimeTypes = {
|
|
359
|
+
'jpg': 'image/jpeg',
|
|
360
|
+
'jpeg': 'image/jpeg',
|
|
361
|
+
'png': 'image/png',
|
|
362
|
+
'gif': 'image/gif',
|
|
363
|
+
'webp': 'image/webp',
|
|
364
|
+
'svg': 'image/svg+xml',
|
|
365
|
+
'mp4': 'video/mp4',
|
|
366
|
+
'webm': 'video/webm',
|
|
367
|
+
'mp3': 'audio/mpeg',
|
|
368
|
+
'wav': 'audio/wav',
|
|
369
|
+
'pdf': 'application/pdf',
|
|
370
|
+
'json': 'application/json',
|
|
371
|
+
'txt': 'text/plain',
|
|
372
|
+
'html': 'text/html',
|
|
373
|
+
'css': 'text/css',
|
|
374
|
+
'js': 'application/javascript',
|
|
375
|
+
};
|
|
376
|
+
return ext ? mimeTypes[ext] : undefined;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* 从环境变量创建 OSS 服务
|
|
385
|
+
* 使用以下环境变量:
|
|
386
|
+
* - OSS_ENDPOINT
|
|
387
|
+
* - OSS_ACCESS_KEY_ID
|
|
388
|
+
* - OSS_SECRET_ACCESS_KEY
|
|
389
|
+
* - OSS_REGION (可选)
|
|
390
|
+
*/
|
|
391
|
+
export function createOssServiceFromEnv() {
|
|
392
|
+
const endpoint = process.env.OSS_ENDPOINT;
|
|
393
|
+
const accessKeyId = process.env.OSS_ACCESS_KEY_ID;
|
|
394
|
+
const secretAccessKey = process.env.OSS_SECRET_ACCESS_KEY;
|
|
395
|
+
const region = process.env.OSS_REGION;
|
|
396
|
+
if (!endpoint) {
|
|
397
|
+
throw new Error('OSS_ENDPOINT environment variable is required');
|
|
398
|
+
}
|
|
399
|
+
if (!accessKeyId) {
|
|
400
|
+
throw new Error('OSS_ACCESS_KEY_ID environment variable is required');
|
|
401
|
+
}
|
|
402
|
+
if (!secretAccessKey) {
|
|
403
|
+
throw new Error('OSS_SECRET_ACCESS_KEY environment variable is required');
|
|
404
|
+
}
|
|
405
|
+
return new OssService({
|
|
406
|
+
endpoint,
|
|
407
|
+
accessKeyId,
|
|
408
|
+
secretAccessKey,
|
|
409
|
+
region,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=ossService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ossService.js","sourceRoot":"","sources":["../../src/services/ossService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EACR,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AA+C5B;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAW;IACjB,MAAM,CAAY;IAE1B,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;YACpC,WAAW,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC;YACD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,EAAE,WAAW;SAC3D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAAc,EACd,GAAW,EACX,UAAkB,EAClB,OAAuB;QAEvB,wBAAwB;QACxB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,QAAQ,IAAI,0BAA0B,CAAC;QAEnF,MAAM,MAAM,GAA0B;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBACjD,MAAM;gBACN,GAAG;gBACH,WAAW;gBACX,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC,CAAC,KAAK;aACV,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC;YACrC,GAAG;YACH,MAAM;YACN,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,MAAc,EACd,GAAW,EACX,SAAiB,EACjB,OAAuB;QAEvB,OAAO;QACP,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;gBAChC,OAAO,EAAE;oBACP,YAAY,EAAE,oEAAoE;oBAClF,QAAQ,EAAE,KAAK;iBAChB;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE;gBAChD,SAAS;gBACT,MAAM;gBACN,GAAG;gBACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC,CAAC,KAAK;aACV,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBACxD,SAAS;gBACT,MAAM;gBACN,GAAG;gBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;aAChC,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExC,SAAS;QACT,IAAI,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC/D,IAAI,iBAAiB,EAAE,CAAC;gBACtB,mBAAmB;gBACnB,IAAI,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC3C,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,iBAAiB,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,WAAW,GAAG,WAAW,IAAI,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAC;QAEnG,MAAM,MAAM,GAA0B;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE;gBAC1D,SAAS;gBACT,MAAM;gBACN,GAAG;gBACH,WAAW;gBACX,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC,CAAC,KAAK;aACV,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC;YACrC,GAAG;YACH,MAAM;YACN,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAAc,EACd,GAAW,EACX,MAAc,EACd,OAAuB;QAEvB,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,0BAA0B,CAAC;QAEvE,MAAM,MAAM,GAA0B;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBACjD,MAAM;gBACN,GAAG;gBACH,WAAW;gBACX,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC,CAAC,KAAK;aACV,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC;YACrC,GAAG;YACH,MAAM;YACN,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB,CACpB,IAAa,EACb,MAAuB,EACvB,MAA+B;QAE/B,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAuB,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,QAAQ,uBAAuB,CAAC,CAAC;QACjF,CAAC;QAED,2BAA2B;QAC3B,IAAI,UAAU,GAAY,IAAI,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,oDAAoD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI;YACrD,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,YAAY,WAAW,CAAC;YACvE,KAAK,IAAI,UAAU,EAAE,CAAC;YACxB,UAAU,GAAI,UAA+B,CAAC,GAAG,CAAC;QACpD,CAAC;QAED,kCAAkC;QAClC,IAAI,UAAU,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACxE,MAAM,MAAM,GAAG,UAAU,YAAY,WAAW;gBAC9C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;YAEjF,OAAO,IAAI,CAAC,gBAAgB,CAC1B,MAAM,CAAC,MAAM,EACb,MAAM,EACN,MAAM,EACN,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CACpC,CAAC;QACJ,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;QAC/C,IAAI,kBAAoC,CAAC;QAEzC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;oBACvE,kBAAkB,GAAG,QAAQ,CAAC;gBAChC,CAAC;qBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACjF,kBAAkB,GAAG,KAAK,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kBAAkB,GAAG,UAAU,CAAC;QAClC,CAAC;QAED,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACxG,CAAC;QAED,WAAW;QACX,IAAI,kBAAkB,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,gBAAgB,CAC1B,MAAM,CAAC,MAAM,EACb,MAAM,EACN,UAAU,EACV,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CACpC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,aAAa,CACvB,MAAM,CAAC,MAAM,EACb,MAAM,EACN,UAAU,EACV,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,GAAW;QACjC,oBAAoB;QACpB,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACzC,0BAA0B;QAC1B,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,GAAY,EAAE,IAAY;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,OAAO,GAAY,GAAG,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAEhE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO;gBACP,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO;gBACP,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACpD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,IAAY;QAClC,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACvD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;oBACvC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;iBACnB,CAAC;YACJ,CAAC;YACD,yBAAyB;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACrD,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;iBAC9C,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,WAAW;QACX,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAAc,EAAE,GAAW;QAChD,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzD,OAAO,GAAG,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,GAAW;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;YAErD,MAAM,SAAS,GAA2B;gBACxC,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,eAAe;gBACtB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,iBAAiB;gBACxB,MAAM,EAAE,kBAAkB;gBAC1B,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,wBAAwB;aAC/B,CAAC;YAEF,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,IAAI,UAAU,CAAC;QACpB,QAAQ;QACR,WAAW;QACX,eAAe;QACf,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "persona-core-opencode",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "PersonaCore implementation using opencode as the execution engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"release:major": "release-it major --ci"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
+
"@aws-sdk/client-s3": "^3.975.0",
|
|
32
33
|
"dotenv": "^16.4.7",
|
|
33
34
|
"expr-eval": "^2.0.2",
|
|
34
35
|
"nunjucks": "^3.2.4",
|