@actalk/inkos-core 0.1.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.
Files changed (89) hide show
  1. package/dist/__tests__/models.test.d.ts +2 -0
  2. package/dist/__tests__/models.test.d.ts.map +1 -0
  3. package/dist/__tests__/models.test.js +328 -0
  4. package/dist/__tests__/models.test.js.map +1 -0
  5. package/dist/__tests__/state-manager.test.d.ts +2 -0
  6. package/dist/__tests__/state-manager.test.d.ts.map +1 -0
  7. package/dist/__tests__/state-manager.test.js +264 -0
  8. package/dist/__tests__/state-manager.test.js.map +1 -0
  9. package/dist/__tests__/writer-parser.test.d.ts +2 -0
  10. package/dist/__tests__/writer-parser.test.d.ts.map +1 -0
  11. package/dist/__tests__/writer-parser.test.js +183 -0
  12. package/dist/__tests__/writer-parser.test.js.map +1 -0
  13. package/dist/agents/architect.d.ts +16 -0
  14. package/dist/agents/architect.d.ts.map +1 -0
  15. package/dist/agents/architect.js +85 -0
  16. package/dist/agents/architect.js.map +1 -0
  17. package/dist/agents/base.d.ts +18 -0
  18. package/dist/agents/base.d.ts.map +1 -0
  19. package/dist/agents/base.js +11 -0
  20. package/dist/agents/base.js.map +1 -0
  21. package/dist/agents/continuity.d.ts +19 -0
  22. package/dist/agents/continuity.d.ts.map +1 -0
  23. package/dist/agents/continuity.js +114 -0
  24. package/dist/agents/continuity.js.map +1 -0
  25. package/dist/agents/radar.d.ts +21 -0
  26. package/dist/agents/radar.d.ts.map +1 -0
  27. package/dist/agents/radar.js +60 -0
  28. package/dist/agents/radar.js.map +1 -0
  29. package/dist/agents/reviser.d.ts +17 -0
  30. package/dist/agents/reviser.d.ts.map +1 -0
  31. package/dist/agents/reviser.js +99 -0
  32. package/dist/agents/reviser.js.map +1 -0
  33. package/dist/agents/writer.d.ts +30 -0
  34. package/dist/agents/writer.d.ts.map +1 -0
  35. package/dist/agents/writer.js +284 -0
  36. package/dist/agents/writer.js.map +1 -0
  37. package/dist/index.d.ts +19 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +24 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/llm/provider.d.ts +20 -0
  42. package/dist/llm/provider.d.ts.map +1 -0
  43. package/dist/llm/provider.js +41 -0
  44. package/dist/llm/provider.js.map +1 -0
  45. package/dist/models/book.d.ts +40 -0
  46. package/dist/models/book.d.ts.map +1 -0
  47. package/dist/models/book.js +32 -0
  48. package/dist/models/book.js.map +1 -0
  49. package/dist/models/chapter.d.ts +33 -0
  50. package/dist/models/chapter.d.ts.map +1 -0
  51. package/dist/models/chapter.js +25 -0
  52. package/dist/models/chapter.js.map +1 -0
  53. package/dist/models/project.d.ts +189 -0
  54. package/dist/models/project.d.ts.map +1 -0
  55. package/dist/models/project.js +44 -0
  56. package/dist/models/project.js.map +1 -0
  57. package/dist/models/state.d.ts +48 -0
  58. package/dist/models/state.d.ts.map +1 -0
  59. package/dist/models/state.js +6 -0
  60. package/dist/models/state.js.map +1 -0
  61. package/dist/notify/dispatcher.d.ts +7 -0
  62. package/dist/notify/dispatcher.d.ts.map +1 -0
  63. package/dist/notify/dispatcher.js +27 -0
  64. package/dist/notify/dispatcher.js.map +1 -0
  65. package/dist/notify/feishu.d.ts +5 -0
  66. package/dist/notify/feishu.d.ts.map +1 -0
  67. package/dist/notify/feishu.js +26 -0
  68. package/dist/notify/feishu.js.map +1 -0
  69. package/dist/notify/telegram.d.ts +6 -0
  70. package/dist/notify/telegram.d.ts.map +1 -0
  71. package/dist/notify/telegram.js +17 -0
  72. package/dist/notify/telegram.js.map +1 -0
  73. package/dist/notify/wechat-work.d.ts +5 -0
  74. package/dist/notify/wechat-work.d.ts.map +1 -0
  75. package/dist/notify/wechat-work.js +15 -0
  76. package/dist/notify/wechat-work.js.map +1 -0
  77. package/dist/pipeline/runner.d.ts +30 -0
  78. package/dist/pipeline/runner.d.ts.map +1 -0
  79. package/dist/pipeline/runner.js +141 -0
  80. package/dist/pipeline/runner.js.map +1 -0
  81. package/dist/pipeline/scheduler.d.ts +24 -0
  82. package/dist/pipeline/scheduler.d.ts.map +1 -0
  83. package/dist/pipeline/scheduler.js +102 -0
  84. package/dist/pipeline/scheduler.js.map +1 -0
  85. package/dist/state/manager.d.ts +20 -0
  86. package/dist/state/manager.d.ts.map +1 -0
  87. package/dist/state/manager.js +128 -0
  88. package/dist/state/manager.js.map +1 -0
  89. package/package.json +35 -0
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ export declare const ChapterStatusSchema: z.ZodEnum<["card-generated", "drafting", "drafted", "auditing", "audit-passed", "audit-failed", "revising", "ready-for-review", "approved", "rejected", "published"]>;
3
+ export type ChapterStatus = z.infer<typeof ChapterStatusSchema>;
4
+ export declare const ChapterMetaSchema: z.ZodObject<{
5
+ number: z.ZodNumber;
6
+ title: z.ZodString;
7
+ status: z.ZodEnum<["card-generated", "drafting", "drafted", "auditing", "audit-passed", "audit-failed", "revising", "ready-for-review", "approved", "rejected", "published"]>;
8
+ wordCount: z.ZodDefault<z.ZodNumber>;
9
+ createdAt: z.ZodString;
10
+ updatedAt: z.ZodString;
11
+ auditIssues: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
12
+ reviewNote: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ number: number;
15
+ status: "card-generated" | "drafting" | "drafted" | "auditing" | "audit-passed" | "audit-failed" | "revising" | "ready-for-review" | "approved" | "rejected" | "published";
16
+ title: string;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ wordCount: number;
20
+ auditIssues: string[];
21
+ reviewNote?: string | undefined;
22
+ }, {
23
+ number: number;
24
+ status: "card-generated" | "drafting" | "drafted" | "auditing" | "audit-passed" | "audit-failed" | "revising" | "ready-for-review" | "approved" | "rejected" | "published";
25
+ title: string;
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ wordCount?: number | undefined;
29
+ auditIssues?: string[] | undefined;
30
+ reviewNote?: string | undefined;
31
+ }>;
32
+ export type ChapterMeta = z.infer<typeof ChapterMetaSchema>;
33
+ //# sourceMappingURL=chapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chapter.d.ts","sourceRoot":"","sources":["../../src/models/chapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,uKAY9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export const ChapterStatusSchema = z.enum([
3
+ "card-generated",
4
+ "drafting",
5
+ "drafted",
6
+ "auditing",
7
+ "audit-passed",
8
+ "audit-failed",
9
+ "revising",
10
+ "ready-for-review",
11
+ "approved",
12
+ "rejected",
13
+ "published",
14
+ ]);
15
+ export const ChapterMetaSchema = z.object({
16
+ number: z.number().int().min(1),
17
+ title: z.string(),
18
+ status: ChapterStatusSchema,
19
+ wordCount: z.number().int().default(0),
20
+ createdAt: z.string().datetime(),
21
+ updatedAt: z.string().datetime(),
22
+ auditIssues: z.array(z.string()).default([]),
23
+ reviewNote: z.string().optional(),
24
+ });
25
+ //# sourceMappingURL=chapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chapter.js","sourceRoot":"","sources":["../../src/models/chapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,gBAAgB;IAChB,UAAU;IACV,SAAS;IACT,UAAU;IACV,cAAc;IACd,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,UAAU;IACV,UAAU;IACV,WAAW;CACZ,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,mBAAmB;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC"}
@@ -0,0 +1,189 @@
1
+ import { z } from "zod";
2
+ export declare const LLMConfigSchema: z.ZodObject<{
3
+ provider: z.ZodEnum<["anthropic", "openai", "custom"]>;
4
+ baseUrl: z.ZodString;
5
+ apiKey: z.ZodString;
6
+ model: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ provider: "custom" | "anthropic" | "openai";
9
+ baseUrl: string;
10
+ apiKey: string;
11
+ model: string;
12
+ }, {
13
+ provider: "custom" | "anthropic" | "openai";
14
+ baseUrl: string;
15
+ apiKey: string;
16
+ model: string;
17
+ }>;
18
+ export type LLMConfig = z.infer<typeof LLMConfigSchema>;
19
+ export declare const NotifyChannelSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
20
+ type: z.ZodLiteral<"telegram">;
21
+ botToken: z.ZodString;
22
+ chatId: z.ZodString;
23
+ }, "strip", z.ZodTypeAny, {
24
+ type: "telegram";
25
+ botToken: string;
26
+ chatId: string;
27
+ }, {
28
+ type: "telegram";
29
+ botToken: string;
30
+ chatId: string;
31
+ }>, z.ZodObject<{
32
+ type: z.ZodLiteral<"wechat-work">;
33
+ webhookUrl: z.ZodString;
34
+ }, "strip", z.ZodTypeAny, {
35
+ type: "wechat-work";
36
+ webhookUrl: string;
37
+ }, {
38
+ type: "wechat-work";
39
+ webhookUrl: string;
40
+ }>, z.ZodObject<{
41
+ type: z.ZodLiteral<"feishu">;
42
+ webhookUrl: z.ZodString;
43
+ }, "strip", z.ZodTypeAny, {
44
+ type: "feishu";
45
+ webhookUrl: string;
46
+ }, {
47
+ type: "feishu";
48
+ webhookUrl: string;
49
+ }>]>;
50
+ export type NotifyChannel = z.infer<typeof NotifyChannelSchema>;
51
+ export declare const ProjectConfigSchema: z.ZodObject<{
52
+ name: z.ZodString;
53
+ version: z.ZodLiteral<"0.1.0">;
54
+ llm: z.ZodObject<{
55
+ provider: z.ZodEnum<["anthropic", "openai", "custom"]>;
56
+ baseUrl: z.ZodString;
57
+ apiKey: z.ZodString;
58
+ model: z.ZodString;
59
+ }, "strip", z.ZodTypeAny, {
60
+ provider: "custom" | "anthropic" | "openai";
61
+ baseUrl: string;
62
+ apiKey: string;
63
+ model: string;
64
+ }, {
65
+ provider: "custom" | "anthropic" | "openai";
66
+ baseUrl: string;
67
+ apiKey: string;
68
+ model: string;
69
+ }>;
70
+ notify: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
71
+ type: z.ZodLiteral<"telegram">;
72
+ botToken: z.ZodString;
73
+ chatId: z.ZodString;
74
+ }, "strip", z.ZodTypeAny, {
75
+ type: "telegram";
76
+ botToken: string;
77
+ chatId: string;
78
+ }, {
79
+ type: "telegram";
80
+ botToken: string;
81
+ chatId: string;
82
+ }>, z.ZodObject<{
83
+ type: z.ZodLiteral<"wechat-work">;
84
+ webhookUrl: z.ZodString;
85
+ }, "strip", z.ZodTypeAny, {
86
+ type: "wechat-work";
87
+ webhookUrl: string;
88
+ }, {
89
+ type: "wechat-work";
90
+ webhookUrl: string;
91
+ }>, z.ZodObject<{
92
+ type: z.ZodLiteral<"feishu">;
93
+ webhookUrl: z.ZodString;
94
+ }, "strip", z.ZodTypeAny, {
95
+ type: "feishu";
96
+ webhookUrl: string;
97
+ }, {
98
+ type: "feishu";
99
+ webhookUrl: string;
100
+ }>]>, "many">>;
101
+ daemon: z.ZodDefault<z.ZodObject<{
102
+ schedule: z.ZodObject<{
103
+ radarCron: z.ZodDefault<z.ZodString>;
104
+ writeCron: z.ZodDefault<z.ZodString>;
105
+ auditCron: z.ZodDefault<z.ZodString>;
106
+ }, "strip", z.ZodTypeAny, {
107
+ radarCron: string;
108
+ writeCron: string;
109
+ auditCron: string;
110
+ }, {
111
+ radarCron?: string | undefined;
112
+ writeCron?: string | undefined;
113
+ auditCron?: string | undefined;
114
+ }>;
115
+ maxConcurrentBooks: z.ZodDefault<z.ZodNumber>;
116
+ }, "strip", z.ZodTypeAny, {
117
+ schedule: {
118
+ radarCron: string;
119
+ writeCron: string;
120
+ auditCron: string;
121
+ };
122
+ maxConcurrentBooks: number;
123
+ }, {
124
+ schedule: {
125
+ radarCron?: string | undefined;
126
+ writeCron?: string | undefined;
127
+ auditCron?: string | undefined;
128
+ };
129
+ maxConcurrentBooks?: number | undefined;
130
+ }>>;
131
+ }, "strip", z.ZodTypeAny, {
132
+ name: string;
133
+ version: "0.1.0";
134
+ llm: {
135
+ provider: "custom" | "anthropic" | "openai";
136
+ baseUrl: string;
137
+ apiKey: string;
138
+ model: string;
139
+ };
140
+ notify: ({
141
+ type: "telegram";
142
+ botToken: string;
143
+ chatId: string;
144
+ } | {
145
+ type: "wechat-work";
146
+ webhookUrl: string;
147
+ } | {
148
+ type: "feishu";
149
+ webhookUrl: string;
150
+ })[];
151
+ daemon: {
152
+ schedule: {
153
+ radarCron: string;
154
+ writeCron: string;
155
+ auditCron: string;
156
+ };
157
+ maxConcurrentBooks: number;
158
+ };
159
+ }, {
160
+ name: string;
161
+ version: "0.1.0";
162
+ llm: {
163
+ provider: "custom" | "anthropic" | "openai";
164
+ baseUrl: string;
165
+ apiKey: string;
166
+ model: string;
167
+ };
168
+ notify?: ({
169
+ type: "telegram";
170
+ botToken: string;
171
+ chatId: string;
172
+ } | {
173
+ type: "wechat-work";
174
+ webhookUrl: string;
175
+ } | {
176
+ type: "feishu";
177
+ webhookUrl: string;
178
+ })[] | undefined;
179
+ daemon?: {
180
+ schedule: {
181
+ radarCron?: string | undefined;
182
+ writeCron?: string | undefined;
183
+ auditCron?: string | undefined;
184
+ };
185
+ maxConcurrentBooks?: number | undefined;
186
+ } | undefined;
187
+ }>;
188
+ export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
189
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ export const LLMConfigSchema = z.object({
3
+ provider: z.enum(["anthropic", "openai", "custom"]),
4
+ baseUrl: z.string().url(),
5
+ apiKey: z.string().min(1),
6
+ model: z.string().min(1),
7
+ });
8
+ export const NotifyChannelSchema = z.discriminatedUnion("type", [
9
+ z.object({
10
+ type: z.literal("telegram"),
11
+ botToken: z.string().min(1),
12
+ chatId: z.string().min(1),
13
+ }),
14
+ z.object({
15
+ type: z.literal("wechat-work"),
16
+ webhookUrl: z.string().url(),
17
+ }),
18
+ z.object({
19
+ type: z.literal("feishu"),
20
+ webhookUrl: z.string().url(),
21
+ }),
22
+ ]);
23
+ export const ProjectConfigSchema = z.object({
24
+ name: z.string().min(1),
25
+ version: z.literal("0.1.0"),
26
+ llm: LLMConfigSchema,
27
+ notify: z.array(NotifyChannelSchema).default([]),
28
+ daemon: z.object({
29
+ schedule: z.object({
30
+ radarCron: z.string().default("0 9 * * *"),
31
+ writeCron: z.string().default("0 14 * * *"),
32
+ auditCron: z.string().default("0 17 * * *"),
33
+ }),
34
+ maxConcurrentBooks: z.number().int().min(1).default(3),
35
+ }).default({
36
+ schedule: {
37
+ radarCron: "0 9 * * *",
38
+ writeCron: "0 14 * * *",
39
+ auditCron: "0 17 * * *",
40
+ },
41
+ maxConcurrentBooks: 3,
42
+ }),
43
+ });
44
+ //# sourceMappingURL=project.js.map
@@ -0,0 +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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Canonical state files — the three sources of truth per book.
3
+ * These are persisted as markdown files but parsed/validated here.
4
+ */
5
+ export interface CurrentState {
6
+ readonly chapter: number;
7
+ readonly location: string;
8
+ readonly protagonist: {
9
+ readonly status: string;
10
+ readonly currentGoal: string;
11
+ readonly constraints: string;
12
+ };
13
+ readonly enemies: ReadonlyArray<{
14
+ readonly name: string;
15
+ readonly relationship: string;
16
+ readonly threat: string;
17
+ }>;
18
+ readonly knownTruths: ReadonlyArray<string>;
19
+ readonly currentConflict: string;
20
+ readonly anchor: string;
21
+ }
22
+ export interface LedgerEntry {
23
+ readonly chapter: number;
24
+ readonly openingValue: number;
25
+ readonly source: string;
26
+ readonly resourceCompleteness: string;
27
+ readonly delta: number;
28
+ readonly closingValue: number;
29
+ readonly basis: string;
30
+ }
31
+ export interface ParticleLedger {
32
+ readonly hardCap: number;
33
+ readonly currentTotal: number;
34
+ readonly entries: ReadonlyArray<LedgerEntry>;
35
+ }
36
+ export interface PendingHook {
37
+ readonly id: string;
38
+ readonly originChapter: number;
39
+ readonly type: string;
40
+ readonly status: "open" | "progressing" | "resolved";
41
+ readonly lastProgress: string;
42
+ readonly expectedResolution: string;
43
+ readonly note: string;
44
+ }
45
+ export interface PendingHooks {
46
+ readonly hooks: ReadonlyArray<PendingHook>;
47
+ }
48
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/models/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC5C"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Canonical state files — the three sources of truth per book.
3
+ * These are persisted as markdown files but parsed/validated here.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/models/state.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,7 @@
1
+ import type { NotifyChannel } from "../models/project.js";
2
+ export interface NotifyMessage {
3
+ readonly title: string;
4
+ readonly body: string;
5
+ }
6
+ export declare function dispatchNotification(channels: ReadonlyArray<NotifyChannel>, message: NotifyMessage): Promise<void>;
7
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,27 @@
1
+ import { sendTelegram } from "./telegram.js";
2
+ import { sendFeishu } from "./feishu.js";
3
+ import { sendWechatWork } from "./wechat-work.js";
4
+ export async function dispatchNotification(channels, message) {
5
+ const fullText = `**${message.title}**\n\n${message.body}`;
6
+ const tasks = channels.map(async (channel) => {
7
+ try {
8
+ switch (channel.type) {
9
+ case "telegram":
10
+ await sendTelegram({ botToken: channel.botToken, chatId: channel.chatId }, fullText);
11
+ break;
12
+ case "feishu":
13
+ await sendFeishu({ webhookUrl: channel.webhookUrl }, message.title, message.body);
14
+ break;
15
+ case "wechat-work":
16
+ await sendWechatWork({ webhookUrl: channel.webhookUrl }, fullText);
17
+ break;
18
+ }
19
+ }
20
+ catch (e) {
21
+ // Log but don't throw — notification failure shouldn't block pipeline
22
+ process.stderr.write(`[notify] ${channel.type} failed: ${e}\n`);
23
+ }
24
+ });
25
+ await Promise.all(tasks);
26
+ }
27
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ export interface FeishuConfig {
2
+ readonly webhookUrl: string;
3
+ }
4
+ export declare function sendFeishu(config: FeishuConfig, title: string, content: string): Promise<void>;
5
+ //# sourceMappingURL=feishu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu.d.ts","sourceRoot":"","sources":["../../src/notify/feishu.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,26 @@
1
+ export async function sendFeishu(config, title, content) {
2
+ const response = await fetch(config.webhookUrl, {
3
+ method: "POST",
4
+ headers: { "Content-Type": "application/json" },
5
+ body: JSON.stringify({
6
+ msg_type: "interactive",
7
+ card: {
8
+ header: {
9
+ title: { tag: "plain_text", content: title },
10
+ template: "blue",
11
+ },
12
+ elements: [
13
+ {
14
+ tag: "markdown",
15
+ content,
16
+ },
17
+ ],
18
+ },
19
+ }),
20
+ });
21
+ if (!response.ok) {
22
+ const body = await response.text();
23
+ throw new Error(`Feishu send failed: ${response.status} ${body}`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=feishu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/notify/feishu.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAoB,EACpB,KAAa,EACb,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC5C,QAAQ,EAAE,MAAM;iBACjB;gBACD,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,UAAU;wBACf,OAAO;qBACR;iBACF;aACF;SACF,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface TelegramConfig {
2
+ readonly botToken: string;
3
+ readonly chatId: string;
4
+ }
5
+ export declare function sendTelegram(config: TelegramConfig, message: string): Promise<void>;
6
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/notify/telegram.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,17 @@
1
+ export async function sendTelegram(config, message) {
2
+ const url = `https://api.telegram.org/bot${config.botToken}/sendMessage`;
3
+ const response = await fetch(url, {
4
+ method: "POST",
5
+ headers: { "Content-Type": "application/json" },
6
+ body: JSON.stringify({
7
+ chat_id: config.chatId,
8
+ text: message,
9
+ parse_mode: "Markdown",
10
+ }),
11
+ });
12
+ if (!response.ok) {
13
+ const body = await response.text();
14
+ throw new Error(`Telegram send failed: ${response.status} ${body}`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/notify/telegram.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAsB,EACtB,OAAe;IAEf,MAAM,GAAG,GAAG,+BAA+B,MAAM,CAAC,QAAQ,cAAc,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,UAAU;SACvB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface WechatWorkConfig {
2
+ readonly webhookUrl: string;
3
+ }
4
+ export declare function sendWechatWork(config: WechatWorkConfig, content: string): Promise<void>;
5
+ //# sourceMappingURL=wechat-work.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat-work.d.ts","sourceRoot":"","sources":["../../src/notify/wechat-work.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,15 @@
1
+ export async function sendWechatWork(config, content) {
2
+ const response = await fetch(config.webhookUrl, {
3
+ method: "POST",
4
+ headers: { "Content-Type": "application/json" },
5
+ body: JSON.stringify({
6
+ msgtype: "markdown",
7
+ markdown: { content },
8
+ }),
9
+ });
10
+ if (!response.ok) {
11
+ const body = await response.text();
12
+ throw new Error(`WeCom send failed: ${response.status} ${body}`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=wechat-work.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat-work.js","sourceRoot":"","sources":["../../src/notify/wechat-work.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAwB,EACxB,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,EAAE,OAAO,EAAE;SACtB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type OpenAI from "openai";
2
+ import type { BookConfig } from "../models/book.js";
3
+ import type { NotifyChannel } from "../models/project.js";
4
+ import type { AuditResult } from "../agents/continuity.js";
5
+ import type { RadarResult } from "../agents/radar.js";
6
+ export interface PipelineConfig {
7
+ readonly client: OpenAI;
8
+ readonly model: string;
9
+ readonly projectRoot: string;
10
+ readonly notifyChannels?: ReadonlyArray<NotifyChannel>;
11
+ }
12
+ export interface ChapterPipelineResult {
13
+ readonly chapterNumber: number;
14
+ readonly title: string;
15
+ readonly wordCount: number;
16
+ readonly auditResult: AuditResult;
17
+ readonly revised: boolean;
18
+ readonly status: "approved" | "needs-review";
19
+ }
20
+ export declare class PipelineRunner {
21
+ private readonly state;
22
+ private readonly config;
23
+ constructor(config: PipelineConfig);
24
+ private agentCtx;
25
+ runRadar(): Promise<RadarResult>;
26
+ initBook(book: BookConfig): Promise<void>;
27
+ writeNextChapter(bookId: string): Promise<ChapterPipelineResult>;
28
+ private _writeNextChapterLocked;
29
+ }
30
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAAC;CAC9C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,cAAc;IAKlC,OAAO,CAAC,QAAQ;IASV,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAKhC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;YASxD,uBAAuB;CAiItC"}