@prysm-ai/utils 0.1.0 → 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.
- package/CHANGELOG.md +35 -0
- package/{async.d.ts → dist/async.d.ts} +1 -0
- package/dist/async.d.ts.map +1 -0
- package/{async.js → dist/async.js} +1 -0
- package/dist/async.js.map +1 -0
- package/{index.d.ts → dist/index.d.ts} +1 -0
- package/dist/index.d.ts.map +1 -0
- package/{index.js → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/{time.d.ts → dist/time.d.ts} +1 -0
- package/dist/time.d.ts.map +1 -0
- package/{time.js → dist/time.js} +1 -0
- package/dist/time.js.map +1 -0
- package/{validation.d.ts → dist/validation.d.ts} +1 -0
- package/dist/validation.d.ts.map +1 -0
- package/{validation.js → dist/validation.js} +1 -0
- package/dist/validation.js.map +1 -0
- package/package.json +8 -7
- package/src/async.ts +133 -0
- package/src/index.ts +3 -0
- package/src/time.ts +106 -0
- package/src/validation.ts +79 -0
- package/tsconfig.json +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @prysm-ai/utils
|
|
2
|
+
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 发布 0.2.0 版本
|
|
8
|
+
|
|
9
|
+
核心变更:
|
|
10
|
+
- 重构 @prysm-ai/core 为统一入口包,导出所有子包
|
|
11
|
+
- @prysm-ai/agent 新增 types.ts 定义核心类型
|
|
12
|
+
- 删除 core 包自有类型定义,改为纯 re-export
|
|
13
|
+
- 新增 createModel 工厂函数
|
|
14
|
+
- 支持流式输出 chatStream
|
|
15
|
+
|
|
16
|
+
## 0.2.0
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- 发布第一个版本,包含核心功能:
|
|
21
|
+
- core: 核心抽象类(Agent、Context、Storage 等)
|
|
22
|
+
- llm: LLM 抽象层,支持 OpenAI/Anthropic 提供商,新增 createModel 工厂函数
|
|
23
|
+
- agent: Agent 框架核心实现
|
|
24
|
+
- tools: 工具系统
|
|
25
|
+
- memory: 记忆系统
|
|
26
|
+
- prompts: 提示词模板管理
|
|
27
|
+
- logger: 日志系统
|
|
28
|
+
- metrics: 指标系统
|
|
29
|
+
- tracing: 链路追踪
|
|
30
|
+
- enterprise: 企业级功能
|
|
31
|
+
- mcp: Model Context Protocol
|
|
32
|
+
- skills: 技能系统
|
|
33
|
+
- multiagent: 多 Agent 协作
|
|
34
|
+
- rag: 检索增强生成
|
|
35
|
+
- utils: 工具函数库
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,KAAK,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9C,GACL,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,CAAC,EAAE,CAAC,CAuBd;AAED,qBAAa,UAAU,CAAC,CAAC;IAIX,OAAO,CAAC,WAAW;IAH/B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAK;gBAEA,WAAW,SAAI;IAE7B,GAAG,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAgB/B,OAAO;IAerB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAoBpF;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,GAAE,kBAAuB,GAC/B,kBAAkB,EAAE,CAiCtB"}
|
package/{time.js → dist/time.js}
RENAMED
package/dist/time.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAOA,MAAM,oBAAoB,GAAG,wEAAwE,CAAC;AAEtG,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE,QAAgB;IAChE,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,OAAO,qBAAqB,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,UAA8B,EAAE;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEvD,IAAI,gBAAgB,GAAG,oBAAoB;SACxC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,gBAAgB,IAAI,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACvD,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;QACT,QAAQ;QACR,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,iBAAiB,CAC/B,QAA8B,EAC9B,UAA8B,EAAE;IAEhC,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEjE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACrE,MAAM,oBAAoB,GAAG;YAC3B,GAAG,iBAAiB;YACpB,OAAO,EAAE,iBAAiB,CAAC,OAAO,GAAG,MAAM,GAAG,gBAAgB;SAC/D,CAAC;QAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvC,IAAI,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC5B,OAAO,oBAAoB,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,gBAAgB;SAC1B,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -12,3 +12,4 @@ export declare function safeValidate<T>(schema: ZodType<T>, data: unknown): {
|
|
|
12
12
|
export declare function requireFields(obj: Record<string, unknown>, fields: string[]): string[];
|
|
13
13
|
export declare function isValidUUID(str: string): boolean;
|
|
14
14
|
export declare function isValidEmail(email: string): boolean;
|
|
15
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAG7C,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CA0BnG;AAGD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAY3E;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAEhE;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAMnI;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKtF;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGhD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prysm-ai/utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Shared utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,16 +11,17 @@
|
|
|
11
11
|
"default": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
16
|
-
"build:watch": "tsc --watch",
|
|
17
|
-
"typecheck": "tsc --noEmit",
|
|
18
|
-
"clean": "rm -rf dist"
|
|
19
|
-
},
|
|
20
14
|
"dependencies": {
|
|
21
15
|
"zod": "^3.23.0"
|
|
22
16
|
},
|
|
23
17
|
"devDependencies": {
|
|
24
18
|
"typescript": "^5.4.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"build:prod": "tsc --project tsconfig.build.json",
|
|
23
|
+
"build:watch": "tsc --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rm -rf dist"
|
|
25
26
|
}
|
|
26
27
|
}
|
package/src/async.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Async utilities
|
|
2
|
+
|
|
3
|
+
export async function withTimeout<T>(
|
|
4
|
+
promise: Promise<T>,
|
|
5
|
+
timeoutMs: number,
|
|
6
|
+
timeoutError?: Error
|
|
7
|
+
): Promise<T> {
|
|
8
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
9
|
+
|
|
10
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
11
|
+
timeoutId = setTimeout(() => {
|
|
12
|
+
reject(timeoutError ?? new Error(`Operation timed out after ${timeoutMs}ms`));
|
|
13
|
+
}, timeoutMs);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
18
|
+
} finally {
|
|
19
|
+
clearTimeout(timeoutId!);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function retry<T>(
|
|
24
|
+
fn: () => Promise<T>,
|
|
25
|
+
options: {
|
|
26
|
+
maxAttempts?: number;
|
|
27
|
+
delayMs?: number;
|
|
28
|
+
backoff?: 'linear' | 'exponential';
|
|
29
|
+
onRetry?: (attempt: number, error: Error) => void;
|
|
30
|
+
} = {}
|
|
31
|
+
): Promise<T> {
|
|
32
|
+
const {
|
|
33
|
+
maxAttempts = 3,
|
|
34
|
+
delayMs = 1000,
|
|
35
|
+
backoff = 'linear',
|
|
36
|
+
onRetry
|
|
37
|
+
} = options;
|
|
38
|
+
|
|
39
|
+
let lastError: Error;
|
|
40
|
+
|
|
41
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
42
|
+
try {
|
|
43
|
+
return await fn();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
lastError = error as Error;
|
|
46
|
+
|
|
47
|
+
if (attempt < maxAttempts) {
|
|
48
|
+
const delay = backoff === 'exponential'
|
|
49
|
+
? delayMs * Math.pow(2, attempt - 1)
|
|
50
|
+
: delayMs * attempt;
|
|
51
|
+
|
|
52
|
+
onRetry?.(attempt, lastError);
|
|
53
|
+
await sleep(delay);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
throw lastError!;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function sleep(ms: number): Promise<void> {
|
|
62
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function parallel<T>(
|
|
66
|
+
tasks: (() => Promise<T>)[],
|
|
67
|
+
maxConcurrency?: number
|
|
68
|
+
): Promise<T[]> {
|
|
69
|
+
if (!maxConcurrency) {
|
|
70
|
+
return Promise.all(tasks.map(fn => fn()));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const results: T[] = [];
|
|
74
|
+
const executing: Promise<void>[] = [];
|
|
75
|
+
|
|
76
|
+
for (const task of tasks) {
|
|
77
|
+
const p = task().then(result => {
|
|
78
|
+
results.push(result);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
executing.push(p);
|
|
82
|
+
|
|
83
|
+
if (executing.length >= maxConcurrency) {
|
|
84
|
+
await Promise.race(executing);
|
|
85
|
+
executing.splice(executing.findIndex(e => e === p), 1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await Promise.all(executing);
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export class AsyncQueue<T> {
|
|
94
|
+
private queue: Array<() => Promise<T>> = [];
|
|
95
|
+
private running = 0;
|
|
96
|
+
|
|
97
|
+
constructor(private concurrency = 1) {}
|
|
98
|
+
|
|
99
|
+
async add(task: () => Promise<T>): Promise<T> {
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
this.queue.push(async () => {
|
|
102
|
+
try {
|
|
103
|
+
const result = await task();
|
|
104
|
+
resolve(result);
|
|
105
|
+
return result;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
reject(error);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
this.process();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private async process(): Promise<void> {
|
|
116
|
+
if (this.running >= this.concurrency) return;
|
|
117
|
+
if (this.queue.length === 0) return;
|
|
118
|
+
|
|
119
|
+
this.running++;
|
|
120
|
+
const task = this.queue.shift()!;
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
await task();
|
|
124
|
+
} finally {
|
|
125
|
+
this.running--;
|
|
126
|
+
this.process();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
get size(): number {
|
|
131
|
+
return this.queue.length;
|
|
132
|
+
}
|
|
133
|
+
}
|
package/src/index.ts
ADDED
package/src/time.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export interface TimeContextOptions {
|
|
2
|
+
/** Timezone for display (e.g., 'UTC', 'America/New_York', 'Asia/Shanghai') */
|
|
3
|
+
timezone?: string;
|
|
4
|
+
/** Additional context to inject */
|
|
5
|
+
additionalContext?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const DEFAULT_TIME_CONTEXT = `Current UTC time: {{utcTime}}. For other timezones, use the time tool.`;
|
|
9
|
+
|
|
10
|
+
export function formatTimeForTimezone(date: Date, timezone: string): string {
|
|
11
|
+
try {
|
|
12
|
+
return new Intl.DateTimeFormat('en-US', {
|
|
13
|
+
timeZone: timezone,
|
|
14
|
+
year: 'numeric',
|
|
15
|
+
month: '2-digit',
|
|
16
|
+
day: '2-digit',
|
|
17
|
+
hour: '2-digit',
|
|
18
|
+
minute: '2-digit',
|
|
19
|
+
second: '2-digit',
|
|
20
|
+
hour12: false,
|
|
21
|
+
timeZoneName: 'short',
|
|
22
|
+
}).format(date);
|
|
23
|
+
} catch {
|
|
24
|
+
return date.toISOString();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function getCurrentTimeISO(): string {
|
|
29
|
+
return new Date().toISOString();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getCurrentTimeForTimezone(timezone: string): string {
|
|
33
|
+
return formatTimeForTimezone(new Date(), timezone);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface TimeContextResult {
|
|
37
|
+
utcTime: string;
|
|
38
|
+
localTime: string;
|
|
39
|
+
timezone: string;
|
|
40
|
+
formattedContext: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function buildTimeContext(options: TimeContextOptions = {}): TimeContextResult {
|
|
44
|
+
const timezone = options.timezone ?? 'UTC';
|
|
45
|
+
const now = new Date();
|
|
46
|
+
|
|
47
|
+
const utcTime = now.toISOString();
|
|
48
|
+
const localTime = formatTimeForTimezone(now, timezone);
|
|
49
|
+
|
|
50
|
+
let formattedContext = DEFAULT_TIME_CONTEXT
|
|
51
|
+
.replace('{{utcTime}}', utcTime);
|
|
52
|
+
|
|
53
|
+
if (options.additionalContext) {
|
|
54
|
+
formattedContext += '\n' + options.additionalContext;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
utcTime,
|
|
59
|
+
localTime,
|
|
60
|
+
timezone,
|
|
61
|
+
formattedContext,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface TimeContextMessage {
|
|
66
|
+
role: string;
|
|
67
|
+
content: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function injectTimeContext(
|
|
71
|
+
messages: TimeContextMessage[],
|
|
72
|
+
options: TimeContextOptions = {}
|
|
73
|
+
): TimeContextMessage[] {
|
|
74
|
+
const { formattedContext } = buildTimeContext(options);
|
|
75
|
+
|
|
76
|
+
if (messages.length === 0) {
|
|
77
|
+
return [{
|
|
78
|
+
role: 'system',
|
|
79
|
+
content: formattedContext,
|
|
80
|
+
}];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
84
|
+
|
|
85
|
+
if (systemMessages.length > 0) {
|
|
86
|
+
const lastSystemMessage = systemMessages[systemMessages.length - 1]!;
|
|
87
|
+
const updatedSystemMessage = {
|
|
88
|
+
...lastSystemMessage,
|
|
89
|
+
content: lastSystemMessage.content + '\n\n' + formattedContext,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const updatedMessages = messages.map(m => {
|
|
93
|
+
if (m === lastSystemMessage) {
|
|
94
|
+
return updatedSystemMessage;
|
|
95
|
+
}
|
|
96
|
+
return m;
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return updatedMessages;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return [{
|
|
103
|
+
role: 'system',
|
|
104
|
+
content: formattedContext,
|
|
105
|
+
}, ...messages];
|
|
106
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ZodError, ZodType } from 'zod';
|
|
2
|
+
|
|
3
|
+
// Deep merge utility
|
|
4
|
+
export function deepMerge<T extends Record<string, unknown>>(target: T, ...sources: Partial<T>[]): T {
|
|
5
|
+
const result = { ...target };
|
|
6
|
+
|
|
7
|
+
for (const source of sources) {
|
|
8
|
+
for (const key of Object.keys(source) as (keyof T)[]) {
|
|
9
|
+
const sourceValue = source[key];
|
|
10
|
+
const targetValue = result[key];
|
|
11
|
+
|
|
12
|
+
if (
|
|
13
|
+
sourceValue !== null &&
|
|
14
|
+
typeof sourceValue === 'object' &&
|
|
15
|
+
!Array.isArray(sourceValue) &&
|
|
16
|
+
targetValue !== null &&
|
|
17
|
+
typeof targetValue === 'object' &&
|
|
18
|
+
!Array.isArray(targetValue) &&
|
|
19
|
+
!(sourceValue instanceof Date) &&
|
|
20
|
+
!(targetValue instanceof Date)
|
|
21
|
+
) {
|
|
22
|
+
result[key] = deepMerge(targetValue as Record<string, unknown>, sourceValue as Record<string, unknown>) as T[ keyof T];
|
|
23
|
+
} else {
|
|
24
|
+
result[key] = sourceValue as T[keyof T];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Object sort for cache key generation
|
|
33
|
+
export function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T {
|
|
34
|
+
return Object.keys(obj)
|
|
35
|
+
.sort()
|
|
36
|
+
.reduce((acc, key) => {
|
|
37
|
+
const value = obj[key];
|
|
38
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
39
|
+
(acc as Record<string, unknown>)[key] = sortObjectKeys(value as Record<string, unknown>);
|
|
40
|
+
} else {
|
|
41
|
+
(acc as Record<string, unknown>)[key] = value;
|
|
42
|
+
}
|
|
43
|
+
return acc;
|
|
44
|
+
}, {} as T);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Validate with Zod schema
|
|
48
|
+
export function validate<T>(schema: ZodType<T>, data: unknown): T {
|
|
49
|
+
return schema.parse(data);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Safe validate (returns result instead of throwing)
|
|
53
|
+
export function safeValidate<T>(schema: ZodType<T>, data: unknown): { success: true; data: T } | { success: false; error: ZodError } {
|
|
54
|
+
const result = schema.safeParse(data);
|
|
55
|
+
if (result.success) {
|
|
56
|
+
return { success: true, data: result.data };
|
|
57
|
+
}
|
|
58
|
+
return { success: false, error: result.error };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Required fields check
|
|
62
|
+
export function requireFields(obj: Record<string, unknown>, fields: string[]): string[] {
|
|
63
|
+
return fields.filter(field => {
|
|
64
|
+
const value = obj[field];
|
|
65
|
+
return value === undefined || value === null;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// isValidUUID
|
|
70
|
+
export function isValidUUID(str: string): boolean {
|
|
71
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
72
|
+
return uuidRegex.test(str);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// isValidEmail
|
|
76
|
+
export function isValidEmail(email: string): boolean {
|
|
77
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
78
|
+
return emailRegex.test(email);
|
|
79
|
+
}
|