@actalk/inkos-core 0.3.1 → 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.
Files changed (106) hide show
  1. package/dist/__tests__/ai-tells.test.d.ts +2 -0
  2. package/dist/__tests__/ai-tells.test.d.ts.map +1 -0
  3. package/dist/__tests__/ai-tells.test.js +78 -0
  4. package/dist/__tests__/ai-tells.test.js.map +1 -0
  5. package/dist/__tests__/detection-insights.test.d.ts +2 -0
  6. package/dist/__tests__/detection-insights.test.d.ts.map +1 -0
  7. package/dist/__tests__/detection-insights.test.js +50 -0
  8. package/dist/__tests__/detection-insights.test.js.map +1 -0
  9. package/dist/__tests__/detector.test.d.ts +2 -0
  10. package/dist/__tests__/detector.test.d.ts.map +1 -0
  11. package/dist/__tests__/detector.test.js +71 -0
  12. package/dist/__tests__/detector.test.js.map +1 -0
  13. package/dist/__tests__/models.test.js +4 -4
  14. package/dist/__tests__/models.test.js.map +1 -1
  15. package/dist/__tests__/style-analyzer.test.d.ts +2 -0
  16. package/dist/__tests__/style-analyzer.test.d.ts.map +1 -0
  17. package/dist/__tests__/style-analyzer.test.js +53 -0
  18. package/dist/__tests__/style-analyzer.test.js.map +1 -0
  19. package/dist/__tests__/webhook.test.d.ts +2 -0
  20. package/dist/__tests__/webhook.test.d.ts.map +1 -0
  21. package/dist/__tests__/webhook.test.js +62 -0
  22. package/dist/__tests__/webhook.test.js.map +1 -0
  23. package/dist/__tests__/writer-parser.test.js +14 -2
  24. package/dist/__tests__/writer-parser.test.js.map +1 -1
  25. package/dist/agents/ai-tells.d.ts +24 -0
  26. package/dist/agents/ai-tells.d.ts.map +1 -0
  27. package/dist/agents/ai-tells.js +114 -0
  28. package/dist/agents/ai-tells.js.map +1 -0
  29. package/dist/agents/architect.d.ts.map +1 -1
  30. package/dist/agents/architect.js +2 -0
  31. package/dist/agents/architect.js.map +1 -1
  32. package/dist/agents/continuity.d.ts.map +1 -1
  33. package/dist/agents/continuity.js +34 -2
  34. package/dist/agents/continuity.js.map +1 -1
  35. package/dist/agents/detection-insights.d.ts +9 -0
  36. package/dist/agents/detection-insights.d.ts.map +1 -0
  37. package/dist/agents/detection-insights.js +54 -0
  38. package/dist/agents/detection-insights.js.map +1 -0
  39. package/dist/agents/detector.d.ts +17 -0
  40. package/dist/agents/detector.d.ts.map +1 -0
  41. package/dist/agents/detector.js +77 -0
  42. package/dist/agents/detector.js.map +1 -0
  43. package/dist/agents/reviser.d.ts +1 -1
  44. package/dist/agents/reviser.d.ts.map +1 -1
  45. package/dist/agents/reviser.js +1 -0
  46. package/dist/agents/reviser.js.map +1 -1
  47. package/dist/agents/style-analyzer.d.ts +11 -0
  48. package/dist/agents/style-analyzer.d.ts.map +1 -0
  49. package/dist/agents/style-analyzer.js +81 -0
  50. package/dist/agents/style-analyzer.js.map +1 -0
  51. package/dist/agents/writer-prompts.d.ts +1 -1
  52. package/dist/agents/writer-prompts.d.ts.map +1 -1
  53. package/dist/agents/writer-prompts.js +42 -2
  54. package/dist/agents/writer-prompts.js.map +1 -1
  55. package/dist/agents/writer.d.ts +8 -0
  56. package/dist/agents/writer.d.ts.map +1 -1
  57. package/dist/agents/writer.js +97 -4
  58. package/dist/agents/writer.js.map +1 -1
  59. package/dist/index.d.ts +10 -2
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +8 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/llm/provider.d.ts +6 -0
  64. package/dist/llm/provider.d.ts.map +1 -1
  65. package/dist/llm/provider.js +242 -55
  66. package/dist/llm/provider.js.map +1 -1
  67. package/dist/models/chapter.d.ts +9 -0
  68. package/dist/models/chapter.d.ts.map +1 -1
  69. package/dist/models/chapter.js +3 -0
  70. package/dist/models/chapter.js.map +1 -1
  71. package/dist/models/detection.d.ts +25 -0
  72. package/dist/models/detection.d.ts.map +1 -0
  73. package/dist/models/detection.js +2 -0
  74. package/dist/models/detection.js.map +1 -0
  75. package/dist/models/project.d.ts +193 -5
  76. package/dist/models/project.d.ts.map +1 -1
  77. package/dist/models/project.js +36 -1
  78. package/dist/models/project.js.map +1 -1
  79. package/dist/models/style-profile.d.ts +16 -0
  80. package/dist/models/style-profile.d.ts.map +1 -0
  81. package/dist/models/style-profile.js +2 -0
  82. package/dist/models/style-profile.js.map +1 -0
  83. package/dist/notify/dispatcher.d.ts +3 -0
  84. package/dist/notify/dispatcher.d.ts.map +1 -1
  85. package/dist/notify/dispatcher.js +28 -0
  86. package/dist/notify/dispatcher.js.map +1 -1
  87. package/dist/notify/webhook.d.ts +15 -0
  88. package/dist/notify/webhook.d.ts.map +1 -0
  89. package/dist/notify/webhook.js +28 -0
  90. package/dist/notify/webhook.js.map +1 -0
  91. package/dist/pipeline/detection-runner.d.ts +31 -0
  92. package/dist/pipeline/detection-runner.d.ts.map +1 -0
  93. package/dist/pipeline/detection-runner.js +109 -0
  94. package/dist/pipeline/detection-runner.js.map +1 -0
  95. package/dist/pipeline/runner.d.ts +1 -0
  96. package/dist/pipeline/runner.d.ts.map +1 -1
  97. package/dist/pipeline/runner.js +57 -4
  98. package/dist/pipeline/runner.js.map +1 -1
  99. package/dist/pipeline/scheduler.d.ts +11 -0
  100. package/dist/pipeline/scheduler.d.ts.map +1 -1
  101. package/dist/pipeline/scheduler.js +60 -0
  102. package/dist/pipeline/scheduler.js.map +1 -1
  103. package/dist/state/manager.d.ts.map +1 -1
  104. package/dist/state/manager.js +21 -3
  105. package/dist/state/manager.js.map +1 -1
  106. package/package.json +1 -1
@@ -2,18 +2,30 @@ import { z } from "zod";
2
2
  export declare const LLMConfigSchema: z.ZodObject<{
3
3
  provider: z.ZodEnum<["anthropic", "openai", "custom"]>;
4
4
  baseUrl: z.ZodString;
5
- apiKey: z.ZodString;
5
+ apiKey: z.ZodDefault<z.ZodString>;
6
6
  model: z.ZodString;
7
+ temperature: z.ZodDefault<z.ZodNumber>;
8
+ maxTokens: z.ZodDefault<z.ZodNumber>;
9
+ thinkingBudget: z.ZodDefault<z.ZodNumber>;
10
+ apiFormat: z.ZodDefault<z.ZodEnum<["chat", "responses"]>>;
7
11
  }, "strip", z.ZodTypeAny, {
8
12
  provider: "custom" | "anthropic" | "openai";
9
13
  baseUrl: string;
10
14
  apiKey: string;
11
15
  model: string;
16
+ temperature: number;
17
+ maxTokens: number;
18
+ thinkingBudget: number;
19
+ apiFormat: "chat" | "responses";
12
20
  }, {
13
21
  provider: "custom" | "anthropic" | "openai";
14
22
  baseUrl: string;
15
- apiKey: string;
16
23
  model: string;
24
+ apiKey?: string | undefined;
25
+ temperature?: number | undefined;
26
+ maxTokens?: number | undefined;
27
+ thinkingBudget?: number | undefined;
28
+ apiFormat?: "chat" | "responses" | undefined;
17
29
  }>;
18
30
  export type LLMConfig = z.infer<typeof LLMConfigSchema>;
19
31
  export declare const NotifyChannelSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
@@ -46,26 +58,93 @@ export declare const NotifyChannelSchema: z.ZodDiscriminatedUnion<"type", [z.Zod
46
58
  }, {
47
59
  type: "feishu";
48
60
  webhookUrl: string;
61
+ }>, z.ZodObject<{
62
+ type: z.ZodLiteral<"webhook">;
63
+ url: z.ZodString;
64
+ secret: z.ZodOptional<z.ZodString>;
65
+ events: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
66
+ }, "strip", z.ZodTypeAny, {
67
+ type: "webhook";
68
+ url: string;
69
+ events: string[];
70
+ secret?: string | undefined;
71
+ }, {
72
+ type: "webhook";
73
+ url: string;
74
+ secret?: string | undefined;
75
+ events?: string[] | undefined;
49
76
  }>]>;
50
77
  export type NotifyChannel = z.infer<typeof NotifyChannelSchema>;
78
+ export declare const DetectionConfigSchema: z.ZodObject<{
79
+ provider: z.ZodDefault<z.ZodEnum<["gptzero", "originality", "custom"]>>;
80
+ apiUrl: z.ZodString;
81
+ apiKeyEnv: z.ZodString;
82
+ threshold: z.ZodDefault<z.ZodNumber>;
83
+ enabled: z.ZodDefault<z.ZodBoolean>;
84
+ autoRewrite: z.ZodDefault<z.ZodBoolean>;
85
+ maxRetries: z.ZodDefault<z.ZodNumber>;
86
+ }, "strip", z.ZodTypeAny, {
87
+ provider: "custom" | "gptzero" | "originality";
88
+ apiUrl: string;
89
+ apiKeyEnv: string;
90
+ threshold: number;
91
+ enabled: boolean;
92
+ autoRewrite: boolean;
93
+ maxRetries: number;
94
+ }, {
95
+ apiUrl: string;
96
+ apiKeyEnv: string;
97
+ provider?: "custom" | "gptzero" | "originality" | undefined;
98
+ threshold?: number | undefined;
99
+ enabled?: boolean | undefined;
100
+ autoRewrite?: boolean | undefined;
101
+ maxRetries?: number | undefined;
102
+ }>;
103
+ export type DetectionConfig = z.infer<typeof DetectionConfigSchema>;
104
+ export declare const QualityGatesSchema: z.ZodObject<{
105
+ maxAuditRetries: z.ZodDefault<z.ZodNumber>;
106
+ pauseAfterConsecutiveFailures: z.ZodDefault<z.ZodNumber>;
107
+ retryTemperatureStep: z.ZodDefault<z.ZodNumber>;
108
+ }, "strip", z.ZodTypeAny, {
109
+ maxAuditRetries: number;
110
+ pauseAfterConsecutiveFailures: number;
111
+ retryTemperatureStep: number;
112
+ }, {
113
+ maxAuditRetries?: number | undefined;
114
+ pauseAfterConsecutiveFailures?: number | undefined;
115
+ retryTemperatureStep?: number | undefined;
116
+ }>;
117
+ export type QualityGates = z.infer<typeof QualityGatesSchema>;
51
118
  export declare const ProjectConfigSchema: z.ZodObject<{
52
119
  name: z.ZodString;
53
120
  version: z.ZodLiteral<"0.1.0">;
54
121
  llm: z.ZodObject<{
55
122
  provider: z.ZodEnum<["anthropic", "openai", "custom"]>;
56
123
  baseUrl: z.ZodString;
57
- apiKey: z.ZodString;
124
+ apiKey: z.ZodDefault<z.ZodString>;
58
125
  model: z.ZodString;
126
+ temperature: z.ZodDefault<z.ZodNumber>;
127
+ maxTokens: z.ZodDefault<z.ZodNumber>;
128
+ thinkingBudget: z.ZodDefault<z.ZodNumber>;
129
+ apiFormat: z.ZodDefault<z.ZodEnum<["chat", "responses"]>>;
59
130
  }, "strip", z.ZodTypeAny, {
60
131
  provider: "custom" | "anthropic" | "openai";
61
132
  baseUrl: string;
62
133
  apiKey: string;
63
134
  model: string;
135
+ temperature: number;
136
+ maxTokens: number;
137
+ thinkingBudget: number;
138
+ apiFormat: "chat" | "responses";
64
139
  }, {
65
140
  provider: "custom" | "anthropic" | "openai";
66
141
  baseUrl: string;
67
- apiKey: string;
68
142
  model: string;
143
+ apiKey?: string | undefined;
144
+ temperature?: number | undefined;
145
+ maxTokens?: number | undefined;
146
+ thinkingBudget?: number | undefined;
147
+ apiFormat?: "chat" | "responses" | undefined;
69
148
  }>;
70
149
  notify: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
71
150
  type: z.ZodLiteral<"telegram">;
@@ -97,7 +176,47 @@ export declare const ProjectConfigSchema: z.ZodObject<{
97
176
  }, {
98
177
  type: "feishu";
99
178
  webhookUrl: string;
179
+ }>, z.ZodObject<{
180
+ type: z.ZodLiteral<"webhook">;
181
+ url: z.ZodString;
182
+ secret: z.ZodOptional<z.ZodString>;
183
+ events: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
184
+ }, "strip", z.ZodTypeAny, {
185
+ type: "webhook";
186
+ url: string;
187
+ events: string[];
188
+ secret?: string | undefined;
189
+ }, {
190
+ type: "webhook";
191
+ url: string;
192
+ secret?: string | undefined;
193
+ events?: string[] | undefined;
100
194
  }>]>, "many">>;
195
+ detection: z.ZodOptional<z.ZodObject<{
196
+ provider: z.ZodDefault<z.ZodEnum<["gptzero", "originality", "custom"]>>;
197
+ apiUrl: z.ZodString;
198
+ apiKeyEnv: z.ZodString;
199
+ threshold: z.ZodDefault<z.ZodNumber>;
200
+ enabled: z.ZodDefault<z.ZodBoolean>;
201
+ autoRewrite: z.ZodDefault<z.ZodBoolean>;
202
+ maxRetries: z.ZodDefault<z.ZodNumber>;
203
+ }, "strip", z.ZodTypeAny, {
204
+ provider: "custom" | "gptzero" | "originality";
205
+ apiUrl: string;
206
+ apiKeyEnv: string;
207
+ threshold: number;
208
+ enabled: boolean;
209
+ autoRewrite: boolean;
210
+ maxRetries: number;
211
+ }, {
212
+ apiUrl: string;
213
+ apiKeyEnv: string;
214
+ provider?: "custom" | "gptzero" | "originality" | undefined;
215
+ threshold?: number | undefined;
216
+ enabled?: boolean | undefined;
217
+ autoRewrite?: boolean | undefined;
218
+ maxRetries?: number | undefined;
219
+ }>>;
101
220
  daemon: z.ZodDefault<z.ZodObject<{
102
221
  schedule: z.ZodObject<{
103
222
  radarCron: z.ZodDefault<z.ZodString>;
@@ -113,6 +232,19 @@ export declare const ProjectConfigSchema: z.ZodObject<{
113
232
  auditCron?: string | undefined;
114
233
  }>;
115
234
  maxConcurrentBooks: z.ZodDefault<z.ZodNumber>;
235
+ qualityGates: z.ZodDefault<z.ZodObject<{
236
+ maxAuditRetries: z.ZodDefault<z.ZodNumber>;
237
+ pauseAfterConsecutiveFailures: z.ZodDefault<z.ZodNumber>;
238
+ retryTemperatureStep: z.ZodDefault<z.ZodNumber>;
239
+ }, "strip", z.ZodTypeAny, {
240
+ maxAuditRetries: number;
241
+ pauseAfterConsecutiveFailures: number;
242
+ retryTemperatureStep: number;
243
+ }, {
244
+ maxAuditRetries?: number | undefined;
245
+ pauseAfterConsecutiveFailures?: number | undefined;
246
+ retryTemperatureStep?: number | undefined;
247
+ }>>;
116
248
  }, "strip", z.ZodTypeAny, {
117
249
  schedule: {
118
250
  radarCron: string;
@@ -120,6 +252,11 @@ export declare const ProjectConfigSchema: z.ZodObject<{
120
252
  auditCron: string;
121
253
  };
122
254
  maxConcurrentBooks: number;
255
+ qualityGates: {
256
+ maxAuditRetries: number;
257
+ pauseAfterConsecutiveFailures: number;
258
+ retryTemperatureStep: number;
259
+ };
123
260
  }, {
124
261
  schedule: {
125
262
  radarCron?: string | undefined;
@@ -127,6 +264,11 @@ export declare const ProjectConfigSchema: z.ZodObject<{
127
264
  auditCron?: string | undefined;
128
265
  };
129
266
  maxConcurrentBooks?: number | undefined;
267
+ qualityGates?: {
268
+ maxAuditRetries?: number | undefined;
269
+ pauseAfterConsecutiveFailures?: number | undefined;
270
+ retryTemperatureStep?: number | undefined;
271
+ } | undefined;
130
272
  }>>;
131
273
  }, "strip", z.ZodTypeAny, {
132
274
  name: string;
@@ -136,6 +278,10 @@ export declare const ProjectConfigSchema: z.ZodObject<{
136
278
  baseUrl: string;
137
279
  apiKey: string;
138
280
  model: string;
281
+ temperature: number;
282
+ maxTokens: number;
283
+ thinkingBudget: number;
284
+ apiFormat: "chat" | "responses";
139
285
  };
140
286
  notify: ({
141
287
  type: "telegram";
@@ -147,6 +293,11 @@ export declare const ProjectConfigSchema: z.ZodObject<{
147
293
  } | {
148
294
  type: "feishu";
149
295
  webhookUrl: string;
296
+ } | {
297
+ type: "webhook";
298
+ url: string;
299
+ events: string[];
300
+ secret?: string | undefined;
150
301
  })[];
151
302
  daemon: {
152
303
  schedule: {
@@ -155,15 +306,33 @@ export declare const ProjectConfigSchema: z.ZodObject<{
155
306
  auditCron: string;
156
307
  };
157
308
  maxConcurrentBooks: number;
309
+ qualityGates: {
310
+ maxAuditRetries: number;
311
+ pauseAfterConsecutiveFailures: number;
312
+ retryTemperatureStep: number;
313
+ };
158
314
  };
315
+ detection?: {
316
+ provider: "custom" | "gptzero" | "originality";
317
+ apiUrl: string;
318
+ apiKeyEnv: string;
319
+ threshold: number;
320
+ enabled: boolean;
321
+ autoRewrite: boolean;
322
+ maxRetries: number;
323
+ } | undefined;
159
324
  }, {
160
325
  name: string;
161
326
  version: "0.1.0";
162
327
  llm: {
163
328
  provider: "custom" | "anthropic" | "openai";
164
329
  baseUrl: string;
165
- apiKey: string;
166
330
  model: string;
331
+ apiKey?: string | undefined;
332
+ temperature?: number | undefined;
333
+ maxTokens?: number | undefined;
334
+ thinkingBudget?: number | undefined;
335
+ apiFormat?: "chat" | "responses" | undefined;
167
336
  };
168
337
  notify?: ({
169
338
  type: "telegram";
@@ -175,7 +344,21 @@ export declare const ProjectConfigSchema: z.ZodObject<{
175
344
  } | {
176
345
  type: "feishu";
177
346
  webhookUrl: string;
347
+ } | {
348
+ type: "webhook";
349
+ url: string;
350
+ secret?: string | undefined;
351
+ events?: string[] | undefined;
178
352
  })[] | undefined;
353
+ detection?: {
354
+ apiUrl: string;
355
+ apiKeyEnv: string;
356
+ provider?: "custom" | "gptzero" | "originality" | undefined;
357
+ threshold?: number | undefined;
358
+ enabled?: boolean | undefined;
359
+ autoRewrite?: boolean | undefined;
360
+ maxRetries?: number | undefined;
361
+ } | undefined;
179
362
  daemon?: {
180
363
  schedule: {
181
364
  radarCron?: string | undefined;
@@ -183,6 +366,11 @@ export declare const ProjectConfigSchema: z.ZodObject<{
183
366
  auditCron?: string | undefined;
184
367
  };
185
368
  maxConcurrentBooks?: number | undefined;
369
+ qualityGates?: {
370
+ maxAuditRetries?: number | undefined;
371
+ pauseAfterConsecutiveFailures?: number | undefined;
372
+ retryTemperatureStep?: number | undefined;
373
+ } | undefined;
186
374
  } | undefined;
187
375
  }>;
188
376
  export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAc9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -2,8 +2,12 @@ import { z } from "zod";
2
2
  export const LLMConfigSchema = z.object({
3
3
  provider: z.enum(["anthropic", "openai", "custom"]),
4
4
  baseUrl: z.string().url(),
5
- apiKey: z.string().min(1),
5
+ apiKey: z.string().default(""),
6
6
  model: z.string().min(1),
7
+ temperature: z.number().min(0).max(2).default(0.7),
8
+ maxTokens: z.number().int().min(1).default(8192),
9
+ thinkingBudget: z.number().int().min(0).default(0),
10
+ apiFormat: z.enum(["chat", "responses"]).default("chat"),
7
11
  });
8
12
  export const NotifyChannelSchema = z.discriminatedUnion("type", [
9
13
  z.object({
@@ -19,12 +23,33 @@ export const NotifyChannelSchema = z.discriminatedUnion("type", [
19
23
  type: z.literal("feishu"),
20
24
  webhookUrl: z.string().url(),
21
25
  }),
26
+ z.object({
27
+ type: z.literal("webhook"),
28
+ url: z.string().url(),
29
+ secret: z.string().optional(),
30
+ events: z.array(z.string()).default([]),
31
+ }),
22
32
  ]);
33
+ export const DetectionConfigSchema = z.object({
34
+ provider: z.enum(["gptzero", "originality", "custom"]).default("custom"),
35
+ apiUrl: z.string().url(),
36
+ apiKeyEnv: z.string().min(1),
37
+ threshold: z.number().min(0).max(1).default(0.5),
38
+ enabled: z.boolean().default(false),
39
+ autoRewrite: z.boolean().default(false),
40
+ maxRetries: z.number().int().min(1).max(10).default(3),
41
+ });
42
+ export const QualityGatesSchema = z.object({
43
+ maxAuditRetries: z.number().int().min(0).max(10).default(2),
44
+ pauseAfterConsecutiveFailures: z.number().int().min(1).default(3),
45
+ retryTemperatureStep: z.number().min(0).max(0.5).default(0.1),
46
+ });
23
47
  export const ProjectConfigSchema = z.object({
24
48
  name: z.string().min(1),
25
49
  version: z.literal("0.1.0"),
26
50
  llm: LLMConfigSchema,
27
51
  notify: z.array(NotifyChannelSchema).default([]),
52
+ detection: DetectionConfigSchema.optional(),
28
53
  daemon: z.object({
29
54
  schedule: z.object({
30
55
  radarCron: z.string().default("0 9 * * *"),
@@ -32,6 +57,11 @@ export const ProjectConfigSchema = z.object({
32
57
  auditCron: z.string().default("0 17 * * *"),
33
58
  }),
34
59
  maxConcurrentBooks: z.number().int().min(1).default(3),
60
+ qualityGates: QualityGatesSchema.default({
61
+ maxAuditRetries: 2,
62
+ pauseAfterConsecutiveFailures: 3,
63
+ retryTemperatureStep: 0.1,
64
+ }),
35
65
  }).default({
36
66
  schedule: {
37
67
  radarCron: "0 9 * * *",
@@ -39,6 +69,11 @@ export const ProjectConfigSchema = z.object({
39
69
  auditCron: "0 17 * * *",
40
70
  },
41
71
  maxConcurrentBooks: 3,
72
+ qualityGates: {
73
+ maxAuditRetries: 2,
74
+ pauseAfterConsecutiveFailures: 3,
75
+ retryTemperatureStep: 0.1,
76
+ },
42
77
  }),
43
78
  });
44
79
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACzB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC9D,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC1B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAC7B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAC7B,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3B,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;SAC5C,CAAC;QACF,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;KACvD,CAAC,CAAC,OAAO,CAAC;QACT,QAAQ,EAAE;YACR,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,YAAY;SACxB;QACD,kBAAkB,EAAE,CAAC;KACtB,CAAC;CACH,CAAC,CAAC"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACzD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC9D,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC1B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAC7B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;KAC7B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACxC,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACxE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACvD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,6BAA6B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;CAC9D,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3B,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;SAC5C,CAAC;QACF,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC;YACvC,eAAe,EAAE,CAAC;YAClB,6BAA6B,EAAE,CAAC;YAChC,oBAAoB,EAAE,GAAG;SAC1B,CAAC;KACH,CAAC,CAAC,OAAO,CAAC;QACT,QAAQ,EAAE;YACR,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,YAAY;SACxB;QACD,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE;YACZ,eAAe,EAAE,CAAC;YAClB,6BAA6B,EAAE,CAAC;YAChC,oBAAoB,EAAE,GAAG;SAC1B;KACF,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** Style fingerprint profile extracted from reference text. */
2
+ export interface StyleProfile {
3
+ readonly avgSentenceLength: number;
4
+ readonly sentenceLengthStdDev: number;
5
+ readonly avgParagraphLength: number;
6
+ readonly paragraphLengthRange: {
7
+ readonly min: number;
8
+ readonly max: number;
9
+ };
10
+ readonly vocabularyDiversity: number;
11
+ readonly topPatterns: ReadonlyArray<string>;
12
+ readonly rhetoricalFeatures: ReadonlyArray<string>;
13
+ readonly sourceName?: string;
14
+ readonly analyzedAt?: string;
15
+ }
16
+ //# sourceMappingURL=style-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-profile.d.ts","sourceRoot":"","sources":["../../src/models/style-profile.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE;QAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=style-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-profile.js","sourceRoot":"","sources":["../../src/models/style-profile.ts"],"names":[],"mappings":""}
@@ -1,7 +1,10 @@
1
1
  import type { NotifyChannel } from "../models/project.js";
2
+ import { type WebhookPayload } from "./webhook.js";
2
3
  export interface NotifyMessage {
3
4
  readonly title: string;
4
5
  readonly body: string;
5
6
  }
6
7
  export declare function dispatchNotification(channels: ReadonlyArray<NotifyChannel>, message: NotifyMessage): Promise<void>;
8
+ /** Dispatch a structured webhook event to all webhook channels. */
9
+ export declare function dispatchWebhookEvent(channels: ReadonlyArray<NotifyChannel>, payload: WebhookPayload): Promise<void>;
7
10
  //# sourceMappingURL=dispatcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/notify/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EACtC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/notify/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EACtC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAgDf;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,EACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -1,6 +1,7 @@
1
1
  import { sendTelegram } from "./telegram.js";
2
2
  import { sendFeishu } from "./feishu.js";
3
3
  import { sendWechatWork } from "./wechat-work.js";
4
+ import { sendWebhook } from "./webhook.js";
4
5
  export async function dispatchNotification(channels, message) {
5
6
  const fullText = `**${message.title}**\n\n${message.body}`;
6
7
  const tasks = channels.map(async (channel) => {
@@ -15,6 +16,16 @@ export async function dispatchNotification(channels, message) {
15
16
  case "wechat-work":
16
17
  await sendWechatWork({ webhookUrl: channel.webhookUrl }, fullText);
17
18
  break;
19
+ case "webhook":
20
+ // Webhook channels are handled by dispatchWebhookEvent for structured events.
21
+ // For generic text notifications, send as a pipeline-complete event.
22
+ await sendWebhook({ url: channel.url, secret: channel.secret, events: channel.events }, {
23
+ event: "pipeline-complete",
24
+ bookId: "",
25
+ timestamp: new Date().toISOString(),
26
+ data: { title: message.title, body: message.body },
27
+ });
28
+ break;
18
29
  }
19
30
  }
20
31
  catch (e) {
@@ -24,4 +35,21 @@ export async function dispatchNotification(channels, message) {
24
35
  });
25
36
  await Promise.all(tasks);
26
37
  }
38
+ /** Dispatch a structured webhook event to all webhook channels. */
39
+ export async function dispatchWebhookEvent(channels, payload) {
40
+ const webhookChannels = channels.filter((ch) => ch.type === "webhook");
41
+ if (webhookChannels.length === 0)
42
+ return;
43
+ const tasks = webhookChannels.map(async (channel) => {
44
+ if (channel.type !== "webhook")
45
+ return;
46
+ try {
47
+ await sendWebhook({ url: channel.url, secret: channel.secret, events: channel.events }, payload);
48
+ }
49
+ catch (e) {
50
+ process.stderr.write(`[webhook] ${channel.url} failed: ${e}\n`);
51
+ }
52
+ });
53
+ await Promise.all(tasks);
54
+ }
27
55
  //# sourceMappingURL=dispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/notify/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAsC,EACtC,OAAsB;IAEtB,MAAM,QAAQ,GAAG,KAAK,OAAO,CAAC,KAAK,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC;IAE3D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,UAAU;oBACb,MAAM,YAAY,CAChB,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EACtD,QAAQ,CACT,CAAC;oBACF,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,UAAU,CACd,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAClC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,IAAI,CACb,CAAC;oBACF,MAAM;gBACR,KAAK,aAAa;oBAChB,MAAM,cAAc,CAClB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAClC,QAAQ,CACT,CAAC;oBACF,MAAM;YACV,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,sEAAsE;YACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAC1C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/notify/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface WebhookConfig {
2
+ readonly url: string;
3
+ readonly secret?: string;
4
+ readonly events?: ReadonlyArray<string>;
5
+ }
6
+ export type WebhookEvent = "chapter-complete" | "audit-passed" | "audit-failed" | "revision-complete" | "pipeline-complete" | "pipeline-error";
7
+ export interface WebhookPayload {
8
+ readonly event: WebhookEvent;
9
+ readonly bookId: string;
10
+ readonly chapterNumber?: number;
11
+ readonly timestamp: string;
12
+ readonly data?: Record<string, unknown>;
13
+ }
14
+ export declare function sendWebhook(config: WebhookConfig, payload: WebhookPayload): Promise<void>;
15
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/notify/webhook.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,28 @@
1
+ import { createHmac } from "node:crypto";
2
+ export async function sendWebhook(config, payload) {
3
+ // Filter by subscribed events
4
+ if (config.events && config.events.length > 0 && !config.events.includes(payload.event)) {
5
+ return;
6
+ }
7
+ const body = JSON.stringify(payload);
8
+ const headers = {
9
+ "Content-Type": "application/json",
10
+ };
11
+ // HMAC-SHA256 signature if secret is configured
12
+ if (config.secret) {
13
+ const signature = createHmac("sha256", config.secret)
14
+ .update(body)
15
+ .digest("hex");
16
+ headers["X-InkOS-Signature"] = `sha256=${signature}`;
17
+ }
18
+ const response = await fetch(config.url, {
19
+ method: "POST",
20
+ headers,
21
+ body,
22
+ });
23
+ if (!response.ok) {
24
+ const responseBody = await response.text();
25
+ throw new Error(`Webhook POST to ${config.url} failed: ${response.status} ${responseBody}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/notify/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwBzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAqB,EACrB,OAAuB;IAEvB,8BAA8B;IAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,gDAAgD;IAChD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aAClD,MAAM,CAAC,IAAI,CAAC;aACZ,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,mBAAmB,CAAC,GAAG,UAAU,SAAS,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,GAAG,YAAY,QAAQ,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Detection pipeline runner — handles detection, auto-rewrite loop, and history tracking.
3
+ * Extracted from runner.ts to keep runner under 800 lines.
4
+ */
5
+ import type { DetectionConfig } from "../models/project.js";
6
+ import type { DetectionHistoryEntry } from "../models/detection.js";
7
+ import type { AgentContext } from "../agents/base.js";
8
+ import { type DetectionResult } from "../agents/detector.js";
9
+ export interface DetectChapterResult {
10
+ readonly chapterNumber: number;
11
+ readonly detection: DetectionResult;
12
+ readonly passed: boolean;
13
+ }
14
+ export interface DetectAndRewriteResult {
15
+ readonly chapterNumber: number;
16
+ readonly originalScore: number;
17
+ readonly finalScore: number;
18
+ readonly attempts: number;
19
+ readonly passed: boolean;
20
+ readonly finalContent: string;
21
+ }
22
+ /** Run detection on a single chapter's content. */
23
+ export declare function detectChapter(config: DetectionConfig, content: string, chapterNumber: number): Promise<DetectChapterResult>;
24
+ /**
25
+ * Detect-and-rewrite loop: detect → revise in anti-detect mode → re-detect,
26
+ * until score passes threshold or max retries reached.
27
+ */
28
+ export declare function detectAndRewrite(config: DetectionConfig, ctx: AgentContext, bookDir: string, content: string, chapterNumber: number, genre?: string): Promise<DetectAndRewriteResult>;
29
+ /** Load detection history from disk. */
30
+ export declare function loadDetectionHistory(bookDir: string): Promise<ReadonlyArray<DetectionHistoryEntry>>;
31
+ //# sourceMappingURL=detection-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection-runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/detection-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,mDAAmD;AACnD,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAO9B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC,CA2EjC;AAuBD,wCAAwC;AACxC,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAQ/C"}