@actalk/inkos-core 0.3.4 → 0.3.5
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/LICENSE +21 -0
- package/dist/__tests__/ai-tells.test.d.ts +2 -0
- package/dist/__tests__/ai-tells.test.d.ts.map +1 -0
- package/dist/__tests__/ai-tells.test.js +78 -0
- package/dist/__tests__/ai-tells.test.js.map +1 -0
- package/dist/__tests__/detection-insights.test.d.ts +2 -0
- package/dist/__tests__/detection-insights.test.d.ts.map +1 -0
- package/dist/__tests__/detection-insights.test.js +50 -0
- package/dist/__tests__/detection-insights.test.js.map +1 -0
- package/dist/__tests__/detector.test.d.ts +2 -0
- package/dist/__tests__/detector.test.d.ts.map +1 -0
- package/dist/__tests__/detector.test.js +71 -0
- package/dist/__tests__/detector.test.js.map +1 -0
- package/dist/__tests__/style-analyzer.test.d.ts +2 -0
- package/dist/__tests__/style-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/style-analyzer.test.js +53 -0
- package/dist/__tests__/style-analyzer.test.js.map +1 -0
- package/dist/__tests__/webhook.test.d.ts +2 -0
- package/dist/__tests__/webhook.test.d.ts.map +1 -0
- package/dist/__tests__/webhook.test.js +62 -0
- package/dist/__tests__/webhook.test.js.map +1 -0
- package/dist/agents/ai-tells.d.ts +24 -0
- package/dist/agents/ai-tells.d.ts.map +1 -0
- package/dist/agents/ai-tells.js +114 -0
- package/dist/agents/ai-tells.js.map +1 -0
- package/dist/agents/architect.d.ts.map +1 -1
- package/dist/agents/architect.js +2 -0
- package/dist/agents/architect.js.map +1 -1
- package/dist/agents/continuity.d.ts.map +1 -1
- package/dist/agents/continuity.js +34 -2
- package/dist/agents/continuity.js.map +1 -1
- package/dist/agents/detection-insights.d.ts +9 -0
- package/dist/agents/detection-insights.d.ts.map +1 -0
- package/dist/agents/detection-insights.js +54 -0
- package/dist/agents/detection-insights.js.map +1 -0
- package/dist/agents/detector.d.ts +17 -0
- package/dist/agents/detector.d.ts.map +1 -0
- package/dist/agents/detector.js +77 -0
- package/dist/agents/detector.js.map +1 -0
- package/dist/agents/reviser.d.ts +1 -1
- package/dist/agents/reviser.d.ts.map +1 -1
- package/dist/agents/reviser.js +1 -0
- package/dist/agents/reviser.js.map +1 -1
- package/dist/agents/style-analyzer.d.ts +11 -0
- package/dist/agents/style-analyzer.d.ts.map +1 -0
- package/dist/agents/style-analyzer.js +81 -0
- package/dist/agents/style-analyzer.js.map +1 -0
- package/dist/agents/writer-prompts.d.ts +1 -1
- package/dist/agents/writer-prompts.d.ts.map +1 -1
- package/dist/agents/writer-prompts.js +42 -2
- package/dist/agents/writer-prompts.js.map +1 -1
- package/dist/agents/writer.d.ts +8 -0
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +97 -4
- package/dist/agents/writer.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/models/chapter.d.ts +9 -0
- package/dist/models/chapter.d.ts.map +1 -1
- package/dist/models/chapter.js +3 -0
- package/dist/models/chapter.js.map +1 -1
- package/dist/models/detection.d.ts +25 -0
- package/dist/models/detection.d.ts.map +1 -0
- package/dist/models/detection.js +2 -0
- package/dist/models/detection.js.map +1 -0
- package/dist/models/project.d.ts +156 -0
- package/dist/models/project.d.ts.map +1 -1
- package/dist/models/project.js +31 -0
- package/dist/models/project.js.map +1 -1
- package/dist/models/style-profile.d.ts +16 -0
- package/dist/models/style-profile.d.ts.map +1 -0
- package/dist/models/style-profile.js +2 -0
- package/dist/models/style-profile.js.map +1 -0
- package/dist/notify/dispatcher.d.ts +3 -0
- package/dist/notify/dispatcher.d.ts.map +1 -1
- package/dist/notify/dispatcher.js +28 -0
- package/dist/notify/dispatcher.js.map +1 -1
- package/dist/notify/webhook.d.ts +15 -0
- package/dist/notify/webhook.d.ts.map +1 -0
- package/dist/notify/webhook.js +28 -0
- package/dist/notify/webhook.js.map +1 -0
- package/dist/pipeline/detection-runner.d.ts +31 -0
- package/dist/pipeline/detection-runner.d.ts.map +1 -0
- package/dist/pipeline/detection-runner.js +109 -0
- package/dist/pipeline/detection-runner.js.map +1 -0
- package/dist/pipeline/runner.d.ts +1 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +57 -4
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/scheduler.d.ts +11 -0
- package/dist/pipeline/scheduler.d.ts.map +1 -1
- package/dist/pipeline/scheduler.js +60 -0
- package/dist/pipeline/scheduler.js.map +1 -1
- package/dist/state/manager.d.ts.map +1 -1
- package/dist/state/manager.js +21 -3
- package/dist/state/manager.js.map +1 -1
- package/package.json +8 -8
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 InkOS Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tells.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ai-tells.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { analyzeAITells } from "../agents/ai-tells.js";
|
|
3
|
+
describe("analyzeAITells", () => {
|
|
4
|
+
it("returns no issues for varied paragraph lengths", () => {
|
|
5
|
+
const content = [
|
|
6
|
+
"短段。",
|
|
7
|
+
"",
|
|
8
|
+
"这是一个中等长度的段落,包含一些描述性的内容,让这个段落稍微长一些。",
|
|
9
|
+
"",
|
|
10
|
+
"很长的段落。这个段落包含了大量的内容,描述了各种各样的场景和人物。角色们在这里进行了激烈的讨论,关于未来的计划和当前的困境。他们需要找到一种方式来解决眼前的问题。",
|
|
11
|
+
].join("\n");
|
|
12
|
+
const result = analyzeAITells(content);
|
|
13
|
+
const paraIssues = result.issues.filter((i) => i.category === "段落等长");
|
|
14
|
+
expect(paraIssues).toHaveLength(0);
|
|
15
|
+
});
|
|
16
|
+
it("detects uniform paragraph lengths (dim 20)", () => {
|
|
17
|
+
// Generate paragraphs of nearly identical length
|
|
18
|
+
const para = "这是一个测试段落的内容,长度大约相同。";
|
|
19
|
+
const content = [para, "", para, "", para, "", para].join("\n");
|
|
20
|
+
const result = analyzeAITells(content);
|
|
21
|
+
const paraIssues = result.issues.filter((i) => i.category === "段落等长");
|
|
22
|
+
expect(paraIssues.length).toBeGreaterThan(0);
|
|
23
|
+
expect(paraIssues[0].severity).toBe("warning");
|
|
24
|
+
});
|
|
25
|
+
it("detects high hedge word density (dim 21)", () => {
|
|
26
|
+
const content = [
|
|
27
|
+
"他似乎觉得这件事可能不太对劲。",
|
|
28
|
+
"",
|
|
29
|
+
"或许他应该大概去看看。似乎有什么东西在那里。",
|
|
30
|
+
"",
|
|
31
|
+
"可能是一种错觉,大概只是风声。某种程度上他也不太确定。",
|
|
32
|
+
].join("\n");
|
|
33
|
+
const result = analyzeAITells(content);
|
|
34
|
+
const hedgeIssues = result.issues.filter((i) => i.category === "套话密度");
|
|
35
|
+
expect(hedgeIssues.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
it("detects formulaic transition repetition (dim 22)", () => {
|
|
38
|
+
const content = [
|
|
39
|
+
"第一段内容。然而事情并不简单。",
|
|
40
|
+
"",
|
|
41
|
+
"第二段内容。然而他没有放弃。",
|
|
42
|
+
"",
|
|
43
|
+
"第三段内容。然而命运弄人。",
|
|
44
|
+
].join("\n");
|
|
45
|
+
const result = analyzeAITells(content);
|
|
46
|
+
const transIssues = result.issues.filter((i) => i.category === "公式化转折");
|
|
47
|
+
expect(transIssues.length).toBeGreaterThan(0);
|
|
48
|
+
expect(transIssues[0].description).toContain("然而");
|
|
49
|
+
});
|
|
50
|
+
it("detects list-like sentence structure (dim 23)", () => {
|
|
51
|
+
const content = [
|
|
52
|
+
"他看着远方的山峰。他看着脚下的深渊。他看着身旁的同伴。他看着手中的剑。",
|
|
53
|
+
].join("\n");
|
|
54
|
+
const result = analyzeAITells(content);
|
|
55
|
+
const listIssues = result.issues.filter((i) => i.category === "列表式结构");
|
|
56
|
+
expect(listIssues.length).toBeGreaterThan(0);
|
|
57
|
+
expect(listIssues[0].severity).toBe("info");
|
|
58
|
+
});
|
|
59
|
+
it("returns no issues for content with fewer than 3 paragraphs", () => {
|
|
60
|
+
const content = "只有一段话。";
|
|
61
|
+
const result = analyzeAITells(content);
|
|
62
|
+
expect(result.issues).toHaveLength(0);
|
|
63
|
+
});
|
|
64
|
+
it("returns no issues for clean varied text", () => {
|
|
65
|
+
const content = [
|
|
66
|
+
"陈风一脚踩碎了脚下的石板。碎石飞溅,打在旁边的墙壁上发出清脆的声响。",
|
|
67
|
+
"",
|
|
68
|
+
"短暂的沉默。空气中弥漫着灰尘的味道,呛得他咳嗽了两声。远处传来脚步声。",
|
|
69
|
+
"",
|
|
70
|
+
"\"谁?\"他低喝一声,手已经按上了腰间的刀柄。指尖触到冰凉的金属,心跳稍微稳了一些。黑暗中,一双眼睛正盯着他。那目光冰冷得像冬夜的寒风,带着审视和一丝不易察觉的警惕。",
|
|
71
|
+
].join("\n");
|
|
72
|
+
const result = analyzeAITells(content);
|
|
73
|
+
// Should have no or few issues for natural-looking text
|
|
74
|
+
const warningIssues = result.issues.filter((i) => i.severity === "warning");
|
|
75
|
+
expect(warningIssues).toHaveLength(0);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=ai-tells.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tells.test.js","sourceRoot":"","sources":["../../src/__tests__/ai-tells.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection-insights.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/detection-insights.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { analyzeDetectionInsights } from "../agents/detection-insights.js";
|
|
3
|
+
describe("analyzeDetectionInsights", () => {
|
|
4
|
+
it("returns zeros for empty history", () => {
|
|
5
|
+
const stats = analyzeDetectionInsights([]);
|
|
6
|
+
expect(stats.totalDetections).toBe(0);
|
|
7
|
+
expect(stats.totalRewrites).toBe(0);
|
|
8
|
+
expect(stats.avgOriginalScore).toBe(0);
|
|
9
|
+
expect(stats.chapterBreakdown).toHaveLength(0);
|
|
10
|
+
});
|
|
11
|
+
it("correctly counts detections and rewrites", () => {
|
|
12
|
+
const history = [
|
|
13
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:00:00Z", provider: "custom", score: 0.8, action: "detect", attempt: 0 },
|
|
14
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:01:00Z", provider: "custom", score: 0.6, action: "rewrite", attempt: 1 },
|
|
15
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:02:00Z", provider: "custom", score: 0.4, action: "rewrite", attempt: 2 },
|
|
16
|
+
{ chapterNumber: 2, timestamp: "2026-01-02T00:00:00Z", provider: "custom", score: 0.3, action: "detect", attempt: 0 },
|
|
17
|
+
];
|
|
18
|
+
const stats = analyzeDetectionInsights(history);
|
|
19
|
+
expect(stats.totalDetections).toBe(2);
|
|
20
|
+
expect(stats.totalRewrites).toBe(2);
|
|
21
|
+
});
|
|
22
|
+
it("calculates per-chapter breakdown", () => {
|
|
23
|
+
const history = [
|
|
24
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:00:00Z", provider: "custom", score: 0.9, action: "detect", attempt: 0 },
|
|
25
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:01:00Z", provider: "custom", score: 0.5, action: "rewrite", attempt: 1 },
|
|
26
|
+
{ chapterNumber: 2, timestamp: "2026-01-02T00:00:00Z", provider: "custom", score: 0.3, action: "detect", attempt: 0 },
|
|
27
|
+
];
|
|
28
|
+
const stats = analyzeDetectionInsights(history);
|
|
29
|
+
expect(stats.chapterBreakdown).toHaveLength(2);
|
|
30
|
+
const ch1 = stats.chapterBreakdown.find((c) => c.chapterNumber === 1);
|
|
31
|
+
expect(ch1?.originalScore).toBe(0.9);
|
|
32
|
+
expect(ch1?.finalScore).toBe(0.5);
|
|
33
|
+
expect(ch1?.rewriteAttempts).toBe(1);
|
|
34
|
+
const ch2 = stats.chapterBreakdown.find((c) => c.chapterNumber === 2);
|
|
35
|
+
expect(ch2?.originalScore).toBe(0.3);
|
|
36
|
+
expect(ch2?.finalScore).toBe(0.3);
|
|
37
|
+
expect(ch2?.rewriteAttempts).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
it("calculates score reduction average", () => {
|
|
40
|
+
const history = [
|
|
41
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:00:00Z", provider: "custom", score: 0.8, action: "detect", attempt: 0 },
|
|
42
|
+
{ chapterNumber: 1, timestamp: "2026-01-01T00:01:00Z", provider: "custom", score: 0.4, action: "rewrite", attempt: 1 },
|
|
43
|
+
];
|
|
44
|
+
const stats = analyzeDetectionInsights(history);
|
|
45
|
+
expect(stats.avgOriginalScore).toBe(0.8);
|
|
46
|
+
expect(stats.avgFinalScore).toBe(0.4);
|
|
47
|
+
expect(stats.avgScoreReduction).toBe(0.4);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=detection-insights.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection-insights.test.js","sourceRoot":"","sources":["../../src/__tests__/detection-insights.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { detectAIContent } from "../agents/detector.js";
|
|
3
|
+
const mockFetch = vi.fn();
|
|
4
|
+
vi.stubGlobal("fetch", mockFetch);
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
mockFetch.mockReset();
|
|
7
|
+
vi.stubEnv("TEST_API_KEY", "test-key-123");
|
|
8
|
+
});
|
|
9
|
+
const baseConfig = {
|
|
10
|
+
provider: "custom",
|
|
11
|
+
apiUrl: "https://api.detect.test/v1/detect",
|
|
12
|
+
apiKeyEnv: "TEST_API_KEY",
|
|
13
|
+
threshold: 0.5,
|
|
14
|
+
enabled: true,
|
|
15
|
+
autoRewrite: false,
|
|
16
|
+
maxRetries: 3,
|
|
17
|
+
};
|
|
18
|
+
describe("detectAIContent", () => {
|
|
19
|
+
it("throws when API key env is not set", async () => {
|
|
20
|
+
vi.stubEnv("MISSING_KEY", "");
|
|
21
|
+
delete process.env.MISSING_KEY;
|
|
22
|
+
const config = { ...baseConfig, apiKeyEnv: "MISSING_KEY" };
|
|
23
|
+
await expect(detectAIContent(config, "test")).rejects.toThrow("Detection API key not found");
|
|
24
|
+
});
|
|
25
|
+
it("calls custom API with correct headers and body", async () => {
|
|
26
|
+
mockFetch.mockResolvedValueOnce({
|
|
27
|
+
ok: true,
|
|
28
|
+
json: async () => ({ score: 0.75 }),
|
|
29
|
+
});
|
|
30
|
+
const result = await detectAIContent(baseConfig, "test content");
|
|
31
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
32
|
+
const [url, opts] = mockFetch.mock.calls[0];
|
|
33
|
+
expect(url).toBe("https://api.detect.test/v1/detect");
|
|
34
|
+
expect(opts.headers.Authorization).toBe("Bearer test-key-123");
|
|
35
|
+
expect(result.score).toBe(0.75);
|
|
36
|
+
expect(result.provider).toBe("custom");
|
|
37
|
+
});
|
|
38
|
+
it("handles GPTZero provider format", async () => {
|
|
39
|
+
mockFetch.mockResolvedValueOnce({
|
|
40
|
+
ok: true,
|
|
41
|
+
json: async () => ({
|
|
42
|
+
documents: [{ completely_generated_prob: 0.92 }],
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
const gptzeroConfig = { ...baseConfig, provider: "gptzero" };
|
|
46
|
+
const result = await detectAIContent(gptzeroConfig, "test content");
|
|
47
|
+
expect(result.score).toBe(0.92);
|
|
48
|
+
expect(result.provider).toBe("gptzero");
|
|
49
|
+
});
|
|
50
|
+
it("handles Originality provider format", async () => {
|
|
51
|
+
mockFetch.mockResolvedValueOnce({
|
|
52
|
+
ok: true,
|
|
53
|
+
json: async () => ({
|
|
54
|
+
score: { ai: 0.3, original: 0.7 },
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
const origConfig = { ...baseConfig, provider: "originality" };
|
|
58
|
+
const result = await detectAIContent(origConfig, "test content");
|
|
59
|
+
expect(result.score).toBe(0.3);
|
|
60
|
+
expect(result.provider).toBe("originality");
|
|
61
|
+
});
|
|
62
|
+
it("throws on non-ok response", async () => {
|
|
63
|
+
mockFetch.mockResolvedValueOnce({
|
|
64
|
+
ok: false,
|
|
65
|
+
status: 429,
|
|
66
|
+
text: async () => "Rate limited",
|
|
67
|
+
});
|
|
68
|
+
await expect(detectAIContent(baseConfig, "test")).rejects.toThrow("Detection API failed: 429");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=detector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.test.js","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/style-analyzer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { analyzeStyle } from "../agents/style-analyzer.js";
|
|
3
|
+
describe("analyzeStyle", () => {
|
|
4
|
+
const sampleText = [
|
|
5
|
+
"陈风一脚踩碎了脚下的石板。碎石飞溅,打在旁边的墙壁上发出清脆的声响。他低头看了一眼,嘴角微微上扬。",
|
|
6
|
+
"",
|
|
7
|
+
"\"谁?\"他低喝一声,手已经按上了腰间的刀柄。指尖触到冰凉的金属,心跳稍微稳了一些。",
|
|
8
|
+
"",
|
|
9
|
+
"黑暗中,一双眼睛正盯着他。那目光冰冷得像冬夜的寒风,带着审视和一丝不易察觉的警惕。来者不善。但陈风并不怕。他经历过比这更恶劣的处境。比这更危险的对手。他攥紧了刀柄,朝着那双眼睛走了过去。脚步声在空旷的巷子里回荡。",
|
|
10
|
+
].join("\n");
|
|
11
|
+
it("calculates sentence length statistics", () => {
|
|
12
|
+
const profile = analyzeStyle(sampleText);
|
|
13
|
+
expect(profile.avgSentenceLength).toBeGreaterThan(0);
|
|
14
|
+
expect(profile.sentenceLengthStdDev).toBeGreaterThan(0);
|
|
15
|
+
});
|
|
16
|
+
it("calculates paragraph length statistics", () => {
|
|
17
|
+
const profile = analyzeStyle(sampleText);
|
|
18
|
+
expect(profile.avgParagraphLength).toBeGreaterThan(0);
|
|
19
|
+
expect(profile.paragraphLengthRange.min).toBeGreaterThan(0);
|
|
20
|
+
expect(profile.paragraphLengthRange.max).toBeGreaterThanOrEqual(profile.paragraphLengthRange.min);
|
|
21
|
+
});
|
|
22
|
+
it("calculates vocabulary diversity", () => {
|
|
23
|
+
const profile = analyzeStyle(sampleText);
|
|
24
|
+
expect(profile.vocabularyDiversity).toBeGreaterThan(0);
|
|
25
|
+
expect(profile.vocabularyDiversity).toBeLessThanOrEqual(1);
|
|
26
|
+
});
|
|
27
|
+
it("includes source name when provided", () => {
|
|
28
|
+
const profile = analyzeStyle(sampleText, "测试来源");
|
|
29
|
+
expect(profile.sourceName).toBe("测试来源");
|
|
30
|
+
});
|
|
31
|
+
it("includes analyzed timestamp", () => {
|
|
32
|
+
const profile = analyzeStyle(sampleText);
|
|
33
|
+
expect(profile.analyzedAt).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
it("handles empty text", () => {
|
|
36
|
+
const profile = analyzeStyle("");
|
|
37
|
+
expect(profile.avgSentenceLength).toBe(0);
|
|
38
|
+
expect(profile.avgParagraphLength).toBe(0);
|
|
39
|
+
expect(profile.vocabularyDiversity).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
it("detects top patterns from repeated sentence openings", () => {
|
|
42
|
+
const repetitiveText = [
|
|
43
|
+
"他看着远方。他看着山峰。他看着大海。他看着天空。",
|
|
44
|
+
"",
|
|
45
|
+
"风在吹。雨在下。",
|
|
46
|
+
].join("\n");
|
|
47
|
+
const profile = analyzeStyle(repetitiveText);
|
|
48
|
+
// "他看" should be detected as a top pattern
|
|
49
|
+
const hasHeKan = profile.topPatterns.some((p) => p.includes("他看"));
|
|
50
|
+
expect(hasHeKan).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=style-analyzer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-analyzer.test.js","sourceRoot":"","sources":["../../src/__tests__/style-analyzer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { sendWebhook } from "../notify/webhook.js";
|
|
3
|
+
import { createHmac } from "node:crypto";
|
|
4
|
+
const mockFetch = vi.fn();
|
|
5
|
+
vi.stubGlobal("fetch", mockFetch);
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
mockFetch.mockReset();
|
|
8
|
+
});
|
|
9
|
+
const basePayload = {
|
|
10
|
+
event: "chapter-complete",
|
|
11
|
+
bookId: "test-book",
|
|
12
|
+
chapterNumber: 5,
|
|
13
|
+
timestamp: "2026-03-14T00:00:00.000Z",
|
|
14
|
+
data: { title: "测试章节", wordCount: 3000 },
|
|
15
|
+
};
|
|
16
|
+
describe("sendWebhook", () => {
|
|
17
|
+
it("sends POST request with JSON payload", async () => {
|
|
18
|
+
mockFetch.mockResolvedValueOnce({ ok: true });
|
|
19
|
+
await sendWebhook({ url: "https://example.com/hook" }, basePayload);
|
|
20
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
21
|
+
const [url, opts] = mockFetch.mock.calls[0];
|
|
22
|
+
expect(url).toBe("https://example.com/hook");
|
|
23
|
+
expect(opts.method).toBe("POST");
|
|
24
|
+
expect(opts.headers["Content-Type"]).toBe("application/json");
|
|
25
|
+
const body = JSON.parse(opts.body);
|
|
26
|
+
expect(body.event).toBe("chapter-complete");
|
|
27
|
+
expect(body.bookId).toBe("test-book");
|
|
28
|
+
});
|
|
29
|
+
it("includes HMAC signature when secret is configured", async () => {
|
|
30
|
+
mockFetch.mockResolvedValueOnce({ ok: true });
|
|
31
|
+
const secret = "my-secret-key";
|
|
32
|
+
await sendWebhook({ url: "https://example.com/hook", secret }, basePayload);
|
|
33
|
+
const [, opts] = mockFetch.mock.calls[0];
|
|
34
|
+
const expectedSig = createHmac("sha256", secret)
|
|
35
|
+
.update(opts.body)
|
|
36
|
+
.digest("hex");
|
|
37
|
+
expect(opts.headers["X-InkOS-Signature"]).toBe(`sha256=${expectedSig}`);
|
|
38
|
+
});
|
|
39
|
+
it("skips event when not in subscribed events list", async () => {
|
|
40
|
+
await sendWebhook({ url: "https://example.com/hook", events: ["audit-passed"] }, basePayload);
|
|
41
|
+
expect(mockFetch).not.toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
it("sends event when it matches subscribed events list", async () => {
|
|
44
|
+
mockFetch.mockResolvedValueOnce({ ok: true });
|
|
45
|
+
await sendWebhook({ url: "https://example.com/hook", events: ["chapter-complete"] }, basePayload);
|
|
46
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
47
|
+
});
|
|
48
|
+
it("sends all events when events list is empty", async () => {
|
|
49
|
+
mockFetch.mockResolvedValueOnce({ ok: true });
|
|
50
|
+
await sendWebhook({ url: "https://example.com/hook", events: [] }, basePayload);
|
|
51
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
52
|
+
});
|
|
53
|
+
it("throws on non-ok response", async () => {
|
|
54
|
+
mockFetch.mockResolvedValueOnce({
|
|
55
|
+
ok: false,
|
|
56
|
+
status: 500,
|
|
57
|
+
text: async () => "Internal Server Error",
|
|
58
|
+
});
|
|
59
|
+
await expect(sendWebhook({ url: "https://example.com/hook" }, basePayload)).rejects.toThrow("Webhook POST to https://example.com/hook failed: 500");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=webhook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.test.js","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural AI-tell detection — pure rule-based analysis (no LLM).
|
|
3
|
+
*
|
|
4
|
+
* Detects patterns common in AI-generated Chinese text:
|
|
5
|
+
* - dim 20: Paragraph length uniformity (low variance)
|
|
6
|
+
* - dim 21: Filler/hedge word density
|
|
7
|
+
* - dim 22: Formulaic transition patterns
|
|
8
|
+
* - dim 23: List-like structure (consecutive same-prefix sentences)
|
|
9
|
+
*/
|
|
10
|
+
export interface AITellIssue {
|
|
11
|
+
readonly severity: "warning" | "info";
|
|
12
|
+
readonly category: string;
|
|
13
|
+
readonly description: string;
|
|
14
|
+
readonly suggestion: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AITellResult {
|
|
17
|
+
readonly issues: ReadonlyArray<AITellIssue>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Analyze text content for structural AI-tell patterns.
|
|
21
|
+
* Returns issues that can be merged into audit results.
|
|
22
|
+
*/
|
|
23
|
+
export declare function analyzeAITells(content: string): AITellResult;
|
|
24
|
+
//# sourceMappingURL=ai-tells.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tells.d.ts","sourceRoot":"","sources":["../../src/agents/ai-tells.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC7C;AAQD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAqG5D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural AI-tell detection — pure rule-based analysis (no LLM).
|
|
3
|
+
*
|
|
4
|
+
* Detects patterns common in AI-generated Chinese text:
|
|
5
|
+
* - dim 20: Paragraph length uniformity (low variance)
|
|
6
|
+
* - dim 21: Filler/hedge word density
|
|
7
|
+
* - dim 22: Formulaic transition patterns
|
|
8
|
+
* - dim 23: List-like structure (consecutive same-prefix sentences)
|
|
9
|
+
*/
|
|
10
|
+
// Hedge/filler words common in AI Chinese text
|
|
11
|
+
const HEDGE_WORDS = ["似乎", "可能", "或许", "大概", "某种程度上", "一定程度上", "在某种意义上"];
|
|
12
|
+
// Formulaic transition words
|
|
13
|
+
const TRANSITION_WORDS = ["然而", "不过", "与此同时", "另一方面", "尽管如此", "话虽如此", "但值得注意的是"];
|
|
14
|
+
/**
|
|
15
|
+
* Analyze text content for structural AI-tell patterns.
|
|
16
|
+
* Returns issues that can be merged into audit results.
|
|
17
|
+
*/
|
|
18
|
+
export function analyzeAITells(content) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
const paragraphs = content
|
|
21
|
+
.split(/\n\s*\n/)
|
|
22
|
+
.map((p) => p.trim())
|
|
23
|
+
.filter((p) => p.length > 0);
|
|
24
|
+
// dim 20: Paragraph length uniformity (needs ≥3 paragraphs)
|
|
25
|
+
if (paragraphs.length >= 3) {
|
|
26
|
+
const paragraphLengths = paragraphs.map((p) => p.length);
|
|
27
|
+
const mean = paragraphLengths.reduce((a, b) => a + b, 0) / paragraphLengths.length;
|
|
28
|
+
if (mean > 0) {
|
|
29
|
+
const variance = paragraphLengths.reduce((sum, l) => sum + (l - mean) ** 2, 0) / paragraphLengths.length;
|
|
30
|
+
const stdDev = Math.sqrt(variance);
|
|
31
|
+
const cv = stdDev / mean;
|
|
32
|
+
if (cv < 0.15) {
|
|
33
|
+
issues.push({
|
|
34
|
+
severity: "warning",
|
|
35
|
+
category: "段落等长",
|
|
36
|
+
description: `段落长度变异系数仅${cv.toFixed(3)}(阈值<0.15),段落长度过于均匀,呈现AI生成特征`,
|
|
37
|
+
suggestion: "增加段落长度差异:短段落用于节奏加速或冲击,长段落用于沉浸描写",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// dim 21: Hedge word density
|
|
43
|
+
const totalChars = content.length;
|
|
44
|
+
if (totalChars > 0) {
|
|
45
|
+
let hedgeCount = 0;
|
|
46
|
+
for (const word of HEDGE_WORDS) {
|
|
47
|
+
const regex = new RegExp(word, "g");
|
|
48
|
+
const matches = content.match(regex);
|
|
49
|
+
hedgeCount += matches?.length ?? 0;
|
|
50
|
+
}
|
|
51
|
+
const hedgeDensity = hedgeCount / (totalChars / 1000);
|
|
52
|
+
if (hedgeDensity > 3) {
|
|
53
|
+
issues.push({
|
|
54
|
+
severity: "warning",
|
|
55
|
+
category: "套话密度",
|
|
56
|
+
description: `套话词(似乎/可能/或许等)密度为${hedgeDensity.toFixed(1)}次/千字(阈值>3),语气过于模糊犹豫`,
|
|
57
|
+
suggestion: "用确定性叙述替代模糊表达:去掉「似乎」直接描述状态,用具体细节替代「可能」",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// dim 22: Formulaic transition repetition
|
|
62
|
+
const transitionCounts = {};
|
|
63
|
+
for (const word of TRANSITION_WORDS) {
|
|
64
|
+
const regex = new RegExp(word, "g");
|
|
65
|
+
const matches = content.match(regex);
|
|
66
|
+
const count = matches?.length ?? 0;
|
|
67
|
+
if (count > 0) {
|
|
68
|
+
transitionCounts[word] = count;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const repeatedTransitions = Object.entries(transitionCounts)
|
|
72
|
+
.filter(([, count]) => count >= 3);
|
|
73
|
+
if (repeatedTransitions.length > 0) {
|
|
74
|
+
const detail = repeatedTransitions
|
|
75
|
+
.map(([word, count]) => `"${word}"×${count}`)
|
|
76
|
+
.join("、");
|
|
77
|
+
issues.push({
|
|
78
|
+
severity: "warning",
|
|
79
|
+
category: "公式化转折",
|
|
80
|
+
description: `转折词重复使用:${detail}。同一转折模式≥3次暴露AI生成痕迹`,
|
|
81
|
+
suggestion: "用情节自然转折替代转折词,或换用不同的过渡手法(动作切入、时间跳跃、视角切换)",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// dim 23: List-like structure (consecutive sentences with same prefix pattern)
|
|
85
|
+
const sentences = content
|
|
86
|
+
.split(/[。!?\n]/)
|
|
87
|
+
.map((s) => s.trim())
|
|
88
|
+
.filter((s) => s.length > 2);
|
|
89
|
+
if (sentences.length >= 3) {
|
|
90
|
+
let consecutiveSamePrefix = 1;
|
|
91
|
+
let maxConsecutive = 1;
|
|
92
|
+
for (let i = 1; i < sentences.length; i++) {
|
|
93
|
+
const prevPrefix = sentences[i - 1].slice(0, 2);
|
|
94
|
+
const currPrefix = sentences[i].slice(0, 2);
|
|
95
|
+
if (prevPrefix === currPrefix) {
|
|
96
|
+
consecutiveSamePrefix++;
|
|
97
|
+
maxConsecutive = Math.max(maxConsecutive, consecutiveSamePrefix);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
consecutiveSamePrefix = 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (maxConsecutive >= 3) {
|
|
104
|
+
issues.push({
|
|
105
|
+
severity: "info",
|
|
106
|
+
category: "列表式结构",
|
|
107
|
+
description: `检测到${maxConsecutive}句连续以相同开头的句子,呈现列表式AI生成结构`,
|
|
108
|
+
suggestion: "变换句式开头:用不同主语、时间词、动作词开头,打破列表感",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { issues };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=ai-tells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tells.js","sourceRoot":"","sources":["../../src/agents/ai-tells.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architect.d.ts","sourceRoot":"","sources":["../../src/agents/architect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,cAAe,SAAQ,SAAS;IAC3C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkIxF,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"architect.d.ts","sourceRoot":"","sources":["../../src/agents/architect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,cAAe,SAAQ,SAAS;IAC3C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkIxF,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,IAAI,CAAC;IA4ChB,OAAO,CAAC,aAAa;CAiBtB"}
|
package/dist/agents/architect.js
CHANGED
|
@@ -140,6 +140,8 @@ ${eraBlock}
|
|
|
140
140
|
if (numericalSystem) {
|
|
141
141
|
writes.push(writeFile(join(storyDir, "particle_ledger.md"), "# 资源账本\n\n| 章节 | 期初值 | 来源 | 完整度 | 增量 | 期末值 | 依据 |\n|------|--------|------|--------|------|--------|------|\n| 0 | 0 | 初始化 | - | 0 | 0 | 开书初始 |\n", "utf-8"));
|
|
142
142
|
}
|
|
143
|
+
// Initialize new truth files
|
|
144
|
+
writes.push(writeFile(join(storyDir, "subplot_board.md"), "# 支线进度板\n\n| 支线ID | 支线名 | 相关角色 | 起始章 | 最近活跃章 | 状态 | 进度概述 |\n|--------|--------|----------|--------|------------|------|----------|\n", "utf-8"), writeFile(join(storyDir, "emotional_arcs.md"), "# 情感弧线\n\n| 角色 | 章节 | 情绪状态 | 触发事件 | 强度(1-10) | 弧线方向 |\n|------|------|----------|----------|------------|----------|\n", "utf-8"), writeFile(join(storyDir, "character_matrix.md"), "# 角色交互矩阵\n\n### 相遇记录\n| 角色A | 角色B | 首次相遇章 | 最近交互章 | 关系性质 | 关系变化 |\n|-------|-------|------------|------------|----------|----------|\n\n### 信息边界\n| 角色 | 已知信息 | 未知信息 | 信息来源章 |\n|------|----------|----------|------------|\n", "utf-8"));
|
|
143
145
|
await Promise.all(writes);
|
|
144
146
|
}
|
|
145
147
|
parseSections(content) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architect.js","sourceRoot":"","sources":["../../src/agents/architect.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"architect.js","sourceRoot":"","sources":["../../src/agents/architect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuity.d.ts","sourceRoot":"","sources":["../../src/agents/continuity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"continuity.d.ts","sourceRoot":"","sources":["../../src/agents/continuity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA0FD,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAgGvB,OAAO,CAAC,gBAAgB;YAwCV,YAAY;CAO3B"}
|