@sofagent/rules 1.3.7 → 1.3.9
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/dist/approval-mode.js +1 -1
- package/dist/ast/engine.d.ts +52 -0
- package/dist/ast/engine.js +291 -0
- package/dist/ast/fixtures/vuln-db.json +25 -0
- package/dist/ast/index.d.ts +10 -0
- package/dist/ast/index.js +32 -0
- package/dist/ast/plugin-adapter.d.ts +35 -0
- package/dist/ast/plugin-adapter.js +71 -0
- package/dist/ast/rules/asi01-prompt-injection.d.ts +3 -0
- package/dist/ast/rules/asi01-prompt-injection.js +65 -0
- package/dist/ast/rules/asi04-sbom.d.ts +30 -0
- package/dist/ast/rules/asi04-sbom.js +158 -0
- package/dist/ast/rules/index.d.ts +6 -0
- package/dist/ast/rules/index.js +34 -0
- package/dist/ast/rules/no-child-process-shell.d.ts +3 -0
- package/dist/ast/rules/no-child-process-shell.js +57 -0
- package/dist/ast/rules/no-debugger.d.ts +3 -0
- package/dist/ast/rules/no-debugger.js +22 -0
- package/dist/ast/rules/no-dynamic-require.d.ts +3 -0
- package/dist/ast/rules/no-dynamic-require.js +34 -0
- package/dist/ast/rules/no-empty-catch.d.ts +3 -0
- package/dist/ast/rules/no-empty-catch.js +29 -0
- package/dist/ast/rules/no-eval.d.ts +3 -0
- package/dist/ast/rules/no-eval.js +33 -0
- package/dist/ast/rules/no-hardcoded-secret.d.ts +3 -0
- package/dist/ast/rules/no-hardcoded-secret.js +59 -0
- package/dist/ast/rules/no-insecure-url.d.ts +3 -0
- package/dist/ast/rules/no-insecure-url.js +32 -0
- package/dist/ast/rules/no-sql-string-concat.d.ts +3 -0
- package/dist/ast/rules/no-sql-string-concat.js +52 -0
- package/dist/ast/rules/semver.d.ts +11 -0
- package/dist/ast/rules/semver.js +58 -0
- package/dist/ast/types.d.ts +81 -0
- package/dist/ast/types.js +12 -0
- package/dist/ast/walk.d.ts +14 -0
- package/dist/ast/walk.js +69 -0
- package/dist/engine.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +20 -6
- package/dist/rules/index.js +1 -1
- package/dist/rules/tool-injection.js +1 -1
- package/dist/rules/tool-secret-leak.js +2 -2
- package/dist/rules/tool-sensitive-file.js +1 -1
- package/dist/types.js +1 -1
- package/package.json +24 -5
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** 规则严重级别(与审计规则集对齐) */
|
|
2
|
+
export type AstSeverity = 'FAIL' | 'WARN';
|
|
3
|
+
/** 扫描输入——单个待检文件 */
|
|
4
|
+
export interface AstScanInput {
|
|
5
|
+
/** 原始文件路径(用于报告定位) */
|
|
6
|
+
path: string;
|
|
7
|
+
/** 文件内容(完整内容或 diff 重建内容) */
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
/** 扫描产出——单条规则命中 */
|
|
11
|
+
export interface AstFinding {
|
|
12
|
+
/** 命中的规则 ID */
|
|
13
|
+
ruleId: string;
|
|
14
|
+
/** 文件路径 */
|
|
15
|
+
file: string;
|
|
16
|
+
/** 行号(1-based) */
|
|
17
|
+
line: number;
|
|
18
|
+
/** 违规描述 */
|
|
19
|
+
message: string;
|
|
20
|
+
/** 严重级别 */
|
|
21
|
+
severity: AstSeverity;
|
|
22
|
+
}
|
|
23
|
+
/** AST 规则的检查上下文——引擎对每个文件调用一次 */
|
|
24
|
+
export interface AstRuleContext {
|
|
25
|
+
/** 文件原始路径 */
|
|
26
|
+
path: string;
|
|
27
|
+
/** 临时文件里的语法树根节点(duck-typed TS RemoteSourceFile) */
|
|
28
|
+
sourceFile: AstNodeHost;
|
|
29
|
+
/** 文件全文 */
|
|
30
|
+
text: string;
|
|
31
|
+
/** SyntaxKind 名字→数字(如 kind('CallExpression');未加载 TS 时返回 -1 恒不匹配) */
|
|
32
|
+
kind(name: string): number;
|
|
33
|
+
/** 上报一条命中(node 提供 位置信息) */
|
|
34
|
+
report(node: AstNodeHost, message: string): void;
|
|
35
|
+
/** 上报一条命中(无节点,直接给行号) */
|
|
36
|
+
reportLine(line: number, message: string): void;
|
|
37
|
+
}
|
|
38
|
+
/** 文本规则的检查上下文——引擎对每个文件调用一次 */
|
|
39
|
+
export interface AstTextRuleContext {
|
|
40
|
+
/** 文件原始路径 */
|
|
41
|
+
path: string;
|
|
42
|
+
/** 文件全文 */
|
|
43
|
+
text: string;
|
|
44
|
+
/** 上报一条命中 */
|
|
45
|
+
report(line: number, message: string): void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* TS 语法树节点(duck-typing 最小面)。
|
|
49
|
+
* TypeScript 7 原生端 RemoteNode 的结构:kind 为数字,
|
|
50
|
+
* 子属性(expression/arguments 等)按需惰性解码。
|
|
51
|
+
*/
|
|
52
|
+
export interface AstNodeHost {
|
|
53
|
+
/** 节点种类(数字,经 SyntaxKind 映射取名) */
|
|
54
|
+
readonly kind: number;
|
|
55
|
+
/** 标识符/字面量文本(Token 类节点有) */
|
|
56
|
+
readonly text?: string;
|
|
57
|
+
/** 语句列表(SourceFile 有) */
|
|
58
|
+
readonly statements?: readonly AstNodeHost[];
|
|
59
|
+
/** 遍历直接子节点 */
|
|
60
|
+
forEachChild(cb: (child: AstNodeHost) => void): void;
|
|
61
|
+
/** 节点起始位置(不含前导 trivia) */
|
|
62
|
+
getStart(): number;
|
|
63
|
+
}
|
|
64
|
+
/** 一条 AST 规则的声明 */
|
|
65
|
+
export interface AstRule {
|
|
66
|
+
/** 规则唯一 ID */
|
|
67
|
+
id: string;
|
|
68
|
+
/** 规则显示名 */
|
|
69
|
+
name: string;
|
|
70
|
+
/** 严重级别 */
|
|
71
|
+
severity: AstSeverity;
|
|
72
|
+
/** 规则说明(写进规则集 JSON) */
|
|
73
|
+
description: string;
|
|
74
|
+
/** 适用文件 glob(简化后缀匹配,如 .ts/.js/.md) */
|
|
75
|
+
filePattern?: RegExp;
|
|
76
|
+
/** AST 检查钩子(TS/JS 文件) */
|
|
77
|
+
checkCode?(ctx: AstRuleContext): void;
|
|
78
|
+
/** 文本检查钩子(markdown/清单文件) */
|
|
79
|
+
checkText?(ctx: AstTextRuleContext): void;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// types.ts · AST 规则引擎类型定义
|
|
4
|
+
// v1.3.9(一):官方 AST 规则引擎参考实现(sofagent-ruleset-ast)
|
|
5
|
+
//
|
|
6
|
+
// 设计原则:
|
|
7
|
+
// - 规则与引擎解耦——规则只声明 check 钩子,遍历由引擎统一驱动
|
|
8
|
+
// - 两种规则形态:AST 规则(解析 TS/JS 语法树)+ 文本规则(markdown/清单类文件)
|
|
9
|
+
// - 与 v1.2.9 插件接口同构——plugin-adapter 把 PluginContext 转成本包的扫描入参
|
|
10
|
+
// ============================================================
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AstNodeHost, AstRuleContext } from './types';
|
|
2
|
+
/** 深度优先遍历(先序):visit 返回 false 时剪枝不再下钻 */
|
|
3
|
+
export declare function walk(node: AstNodeHost, visit: (n: AstNodeHost) => boolean | void): void;
|
|
4
|
+
/** 判节点类型:ctx.kind(name) === node.kind */
|
|
5
|
+
export declare function is(ctx: AstRuleContext, node: AstNodeHost | undefined | null, kindName: string): boolean;
|
|
6
|
+
/** 取标识符/字面量文本(Token 节点的 .text 属性) */
|
|
7
|
+
export declare function nodeText(node: AstNodeHost | undefined | null): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* 收集本文件 import 绑定:{ 导入名: 来源模块 }。
|
|
10
|
+
* 供规则做「符号来自哪个模块」的语法级判断(不需要 checker 语义层)。
|
|
11
|
+
* 支持:import { x } from 'm' / import * as x from 'm' / import x from 'm'
|
|
12
|
+
*/
|
|
13
|
+
export declare function collectImports(ctx: AstRuleContext): Map<string, string>;
|
|
14
|
+
//# sourceMappingURL=walk.d.ts.map
|
package/dist/ast/walk.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// walk.ts · 语法树遍历工具
|
|
4
|
+
// v1.3.9(一):深度优先遍历 + 判型/取文本工具——规则层共用
|
|
5
|
+
// ============================================================
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.walk = walk;
|
|
8
|
+
exports.is = is;
|
|
9
|
+
exports.nodeText = nodeText;
|
|
10
|
+
exports.collectImports = collectImports;
|
|
11
|
+
/** 深度优先遍历(先序):visit 返回 false 时剪枝不再下钻 */
|
|
12
|
+
function walk(node, visit) {
|
|
13
|
+
const keepGoing = visit(node);
|
|
14
|
+
if (keepGoing === false)
|
|
15
|
+
return;
|
|
16
|
+
node.forEachChild((child) => walk(child, visit));
|
|
17
|
+
}
|
|
18
|
+
/** 判节点类型:ctx.kind(name) === node.kind */
|
|
19
|
+
function is(ctx, node, kindName) {
|
|
20
|
+
return !!node && node.kind === ctx.kind(kindName);
|
|
21
|
+
}
|
|
22
|
+
/** 取标识符/字面量文本(Token 节点的 .text 属性) */
|
|
23
|
+
function nodeText(node) {
|
|
24
|
+
return node?.text;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 收集本文件 import 绑定:{ 导入名: 来源模块 }。
|
|
28
|
+
* 供规则做「符号来自哪个模块」的语法级判断(不需要 checker 语义层)。
|
|
29
|
+
* 支持:import { x } from 'm' / import * as x from 'm' / import x from 'm'
|
|
30
|
+
*/
|
|
31
|
+
function collectImports(ctx) {
|
|
32
|
+
const bindings = new Map();
|
|
33
|
+
const stmts = ctx.sourceFile.statements ?? [];
|
|
34
|
+
for (const stmt of stmts) {
|
|
35
|
+
if (!is(ctx, stmt, 'ImportDeclaration'))
|
|
36
|
+
continue;
|
|
37
|
+
const moduleSpecifier = nodeText(stmt.moduleSpecifier);
|
|
38
|
+
if (!moduleSpecifier)
|
|
39
|
+
continue;
|
|
40
|
+
const clause = stmt.importClause;
|
|
41
|
+
if (!clause)
|
|
42
|
+
continue;
|
|
43
|
+
// namedBindings:NamedImports { x } / NamespaceImport * as x
|
|
44
|
+
const named = clause.namedBindings;
|
|
45
|
+
if (named) {
|
|
46
|
+
if (is(ctx, named, 'NamespaceImport')) {
|
|
47
|
+
const name = nodeText(named.name);
|
|
48
|
+
if (name)
|
|
49
|
+
bindings.set(name, moduleSpecifier);
|
|
50
|
+
}
|
|
51
|
+
else if (is(ctx, named, 'NamedImports')) {
|
|
52
|
+
const elements = named.elements ?? [];
|
|
53
|
+
for (const el of elements) {
|
|
54
|
+
// ImportSpecifier:name 是导入名,propertyName 是本地别名(反向)
|
|
55
|
+
const imported = nodeText(el.propertyName)
|
|
56
|
+
?? nodeText(el.name);
|
|
57
|
+
if (imported)
|
|
58
|
+
bindings.set(imported, moduleSpecifier);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// default import
|
|
63
|
+
const def = nodeText(clause.name);
|
|
64
|
+
if (def)
|
|
65
|
+
bindings.set(def, moduleSpecifier);
|
|
66
|
+
}
|
|
67
|
+
return bindings;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=walk.js.map
|
package/dist/engine.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// engine.ts · RulesEngine 纯函数入口
|
|
4
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:P3 编排引擎内嵌——规则引擎核心
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.RulesEngine = void 0;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,4 +5,10 @@ export { shouldAllow } from './should-allow';
|
|
|
5
5
|
export type { ShouldAllowResult } from './should-allow';
|
|
6
6
|
export { shouldApprove } from './approval-mode';
|
|
7
7
|
export type { ApprovalMode, ApprovalResult } from './approval-mode';
|
|
8
|
+
export { AstRuleEngine } from './ast/engine';
|
|
9
|
+
export type { AstEngineOptions } from './ast/engine';
|
|
10
|
+
export { builtinAstRules, astRuleById } from './ast/rules';
|
|
11
|
+
export { buildSbom } from './ast/rules/asi04-sbom';
|
|
12
|
+
export type { SbomEntry } from './ast/rules/asi04-sbom';
|
|
13
|
+
export type { AstRule, AstFinding, AstScanInput } from './ast/types';
|
|
8
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// ── API 分级契约(v1.3.9 四)────────────────────────────
|
|
3
|
+
// `/* @public */`:公开 API——semver 锁定,变更必须 bump 版本 + CHANGELOG 记录
|
|
4
|
+
// (外部依赖方与跨平台适配器只许 import 这一层)
|
|
5
|
+
// `/* @internal */`:内部 API——不承诺稳定性,破坏性变更无需 bump
|
|
6
|
+
// 未标记的导出视为 @public(保守默认:宁可多承诺不可漏承诺)
|
|
7
|
+
// ────────────────────────────────────────────────────────
|
|
2
8
|
// ============================================================
|
|
3
9
|
// index.ts · @sofagent/rules barrel export
|
|
4
|
-
// v1.3.
|
|
10
|
+
// v1.3.9:只导出 5 个公开符号,内部实现不外露
|
|
5
11
|
// ============================================================
|
|
6
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.shouldApprove = exports.shouldAllow = exports.defaultToolRules = exports.RulesEngine = void 0;
|
|
8
|
-
var engine_1 = require("./engine");
|
|
13
|
+
exports.buildSbom = exports.astRuleById = exports.builtinAstRules = exports.AstRuleEngine = exports.shouldApprove = exports.shouldAllow = exports.defaultToolRules = exports.RulesEngine = void 0;
|
|
14
|
+
/* @public */ var engine_1 = require("./engine");
|
|
9
15
|
Object.defineProperty(exports, "RulesEngine", { enumerable: true, get: function () { return engine_1.RulesEngine; } });
|
|
10
|
-
var rules_1 = require("./rules");
|
|
16
|
+
/* @public */ var rules_1 = require("./rules");
|
|
11
17
|
Object.defineProperty(exports, "defaultToolRules", { enumerable: true, get: function () { return rules_1.defaultToolRules; } });
|
|
12
18
|
// v1.3.7 (交付 2):tool-gate 便捷判定 API
|
|
13
|
-
var should_allow_1 = require("./should-allow");
|
|
19
|
+
/* @public */ var should_allow_1 = require("./should-allow");
|
|
14
20
|
Object.defineProperty(exports, "shouldAllow", { enumerable: true, get: function () { return should_allow_1.shouldAllow; } });
|
|
15
21
|
// v1.3.2 (交付 10):工具审批四模式
|
|
16
|
-
var approval_mode_1 = require("./approval-mode");
|
|
22
|
+
/* @public */ var approval_mode_1 = require("./approval-mode");
|
|
17
23
|
Object.defineProperty(exports, "shouldApprove", { enumerable: true, get: function () { return approval_mode_1.shouldApprove; } });
|
|
24
|
+
// v1.3.9(一):官方 AST 规则引擎(sofagent-ruleset-ast)——@public 公开面
|
|
25
|
+
/* @public */ var engine_2 = require("./ast/engine");
|
|
26
|
+
Object.defineProperty(exports, "AstRuleEngine", { enumerable: true, get: function () { return engine_2.AstRuleEngine; } });
|
|
27
|
+
/* @public */ var rules_2 = require("./ast/rules");
|
|
28
|
+
Object.defineProperty(exports, "builtinAstRules", { enumerable: true, get: function () { return rules_2.builtinAstRules; } });
|
|
29
|
+
Object.defineProperty(exports, "astRuleById", { enumerable: true, get: function () { return rules_2.astRuleById; } });
|
|
30
|
+
/* @public */ var asi04_sbom_1 = require("./ast/rules/asi04-sbom");
|
|
31
|
+
Object.defineProperty(exports, "buildSbom", { enumerable: true, get: function () { return asi04_sbom_1.buildSbom; } });
|
|
18
32
|
//# sourceMappingURL=index.js.map
|
package/dist/rules/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// rules/index.ts · 默认规则注册表
|
|
4
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:P3 编排引擎内嵌——默认 tool 规则集合
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.defaultToolRules = void 0;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// tool-injection.ts · 移植 audit rule-a9(prompt injection 检测)
|
|
4
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:tool 视角——扫 args 里的 prompt injection 模式
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.toolInjection = void 0;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// tool-secret-leak.ts · 移植 audit rule-a2(密钥泄漏检测)
|
|
4
|
-
// v1.3.
|
|
5
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:tool 视角——扫 args 字面量里的密钥模式
|
|
5
|
+
// v1.3.9 SECRET_PATTERNS 抽到 @sofagent/core 共享——此前本文件用严格
|
|
6
6
|
// 48 位 sk- 模式导致 32-47 位密钥被 ToolGate 放行(与 A2 漂移互补成洞)。
|
|
7
7
|
// ============================================================
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// tool-sensitive-file.ts · 移植 audit rule-a1(敏感文件保护)
|
|
4
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:tool 视角——校验 args 里的文件路径
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.toolSensitiveFile = void 0;
|
package/dist/types.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================
|
|
3
3
|
// types.ts · P3 编排引擎内嵌——tool call 拦截器类型定义
|
|
4
|
-
// v1.3.
|
|
4
|
+
// v1.3.9:从 audit 规则抽出为纯函数,零 fs/git 依赖
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
//# sourceMappingURL=types.js.map
|
package/package.json
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sofagent/rules",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "sofagent
|
|
3
|
+
"version": "1.3.9",
|
|
4
|
+
"description": "sofagent 规则引擎包——从 audit 抽出,零 git 依赖,供编排引擎 tool call 事前拦截;v1.3.9 起含官方 AST 规则引擎(sofagent-ruleset-ast,经临时文件驱动 TS 编译器,无仓库 fs 依赖)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./ast": {
|
|
13
|
+
"types": "./dist/ast/plugin-adapter.d.ts",
|
|
14
|
+
"default": "./dist/ast/plugin-adapter.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
7
17
|
"scripts": {
|
|
8
18
|
"build": "npm run clean && tsc",
|
|
9
19
|
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
@@ -12,12 +22,13 @@
|
|
|
12
22
|
"keywords": [
|
|
13
23
|
"rules-engine",
|
|
14
24
|
"agent-safety",
|
|
15
|
-
"tool-interceptor"
|
|
25
|
+
"tool-interceptor",
|
|
26
|
+
"ast"
|
|
16
27
|
],
|
|
17
28
|
"author": "孔放勋",
|
|
18
29
|
"license": "MIT",
|
|
19
30
|
"devDependencies": {
|
|
20
|
-
"typescript": "
|
|
31
|
+
"typescript": "7.0.2",
|
|
21
32
|
"vitest": "^4.1.10"
|
|
22
33
|
},
|
|
23
34
|
"files": [
|
|
@@ -28,6 +39,14 @@
|
|
|
28
39
|
"README.md"
|
|
29
40
|
],
|
|
30
41
|
"dependencies": {
|
|
31
|
-
"@sofagent/core": "1.3.
|
|
42
|
+
"@sofagent/core": "1.3.9"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"typescript": ">=5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"typescript": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
32
51
|
}
|
|
33
52
|
}
|