@whispering233/ai-editor-db 0.0.53 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/009_decompose.d.ts.map +1 -1
- package/dist/migrations/009_decompose.js +4 -5
- package/dist/migrations/009_decompose.js.map +1 -1
- package/dist/migrations/010_decompose_concurrency.d.ts +4 -0
- package/dist/migrations/010_decompose_concurrency.d.ts.map +1 -0
- package/dist/migrations/010_decompose_concurrency.js +31 -0
- package/dist/migrations/010_decompose_concurrency.js.map +1 -0
- package/dist/migrations/011_drop_decompose.d.ts +4 -0
- package/dist/migrations/011_drop_decompose.d.ts.map +1 -0
- package/dist/migrations/011_drop_decompose.js +24 -0
- package/dist/migrations/011_drop_decompose.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +11 -3
- package/dist/migrations/index.js.map +1 -1
- package/dist/schema.d.ts +5 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +5 -1
- package/dist/schema.js.map +1 -1
- package/dist/tables.d.ts +1 -356
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +2 -59
- package/dist/tables.js.map +1 -1
- package/package.json +2 -2
- package/dist/queries/decompose.d.ts +0 -144
- package/dist/queries/decompose.d.ts.map +0 -1
- package/dist/queries/decompose.js +0 -310
- package/dist/queries/decompose.js.map +0 -1
package/dist/tables.d.ts
CHANGED
|
@@ -677,364 +677,9 @@ export declare const documentRecords: import("drizzle-orm/sqlite-core").SQLiteTa
|
|
|
677
677
|
};
|
|
678
678
|
dialect: "sqlite";
|
|
679
679
|
}>;
|
|
680
|
-
/**
|
|
681
|
-
* decompose_jobs:拆解小说 job(导入式批量管线,设计见 docs/design/60-decompose.md)。
|
|
682
|
-
* 一项目一 job(业务层保证,不设唯一约束):状态机 pending → running → (paused | done | failed),
|
|
683
|
-
* 范围与组批口径是 S1 的快照(续拆/重跑按同一口径重算批次);无 deleted_at——撤销 = 删书或恢复备份。
|
|
684
|
-
*/
|
|
685
|
-
export declare const decomposeJobs: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
686
|
-
name: "decompose_jobs";
|
|
687
|
-
schema: undefined;
|
|
688
|
-
columns: {
|
|
689
|
-
id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
690
|
-
name: "id";
|
|
691
|
-
tableName: "decompose_jobs";
|
|
692
|
-
dataType: "string";
|
|
693
|
-
columnType: "SQLiteText";
|
|
694
|
-
data: string;
|
|
695
|
-
driverParam: string;
|
|
696
|
-
notNull: true;
|
|
697
|
-
hasDefault: false;
|
|
698
|
-
isPrimaryKey: true;
|
|
699
|
-
isAutoincrement: false;
|
|
700
|
-
hasRuntimeDefault: false;
|
|
701
|
-
enumValues: [string, ...string[]];
|
|
702
|
-
baseColumn: never;
|
|
703
|
-
identity: undefined;
|
|
704
|
-
generated: undefined;
|
|
705
|
-
}, {}, {
|
|
706
|
-
length: number | undefined;
|
|
707
|
-
}>;
|
|
708
|
-
status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
709
|
-
name: "status";
|
|
710
|
-
tableName: "decompose_jobs";
|
|
711
|
-
dataType: "string";
|
|
712
|
-
columnType: "SQLiteText";
|
|
713
|
-
data: string;
|
|
714
|
-
driverParam: string;
|
|
715
|
-
notNull: true;
|
|
716
|
-
hasDefault: false;
|
|
717
|
-
isPrimaryKey: false;
|
|
718
|
-
isAutoincrement: false;
|
|
719
|
-
hasRuntimeDefault: false;
|
|
720
|
-
enumValues: [string, ...string[]];
|
|
721
|
-
baseColumn: never;
|
|
722
|
-
identity: undefined;
|
|
723
|
-
generated: undefined;
|
|
724
|
-
}, {}, {
|
|
725
|
-
length: number | undefined;
|
|
726
|
-
}>;
|
|
727
|
-
scope_start: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
728
|
-
name: "scope_start";
|
|
729
|
-
tableName: "decompose_jobs";
|
|
730
|
-
dataType: "number";
|
|
731
|
-
columnType: "SQLiteInteger";
|
|
732
|
-
data: number;
|
|
733
|
-
driverParam: number;
|
|
734
|
-
notNull: true;
|
|
735
|
-
hasDefault: false;
|
|
736
|
-
isPrimaryKey: false;
|
|
737
|
-
isAutoincrement: false;
|
|
738
|
-
hasRuntimeDefault: false;
|
|
739
|
-
enumValues: undefined;
|
|
740
|
-
baseColumn: never;
|
|
741
|
-
identity: undefined;
|
|
742
|
-
generated: undefined;
|
|
743
|
-
}, {}, {}>;
|
|
744
|
-
scope_end: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
745
|
-
name: "scope_end";
|
|
746
|
-
tableName: "decompose_jobs";
|
|
747
|
-
dataType: "number";
|
|
748
|
-
columnType: "SQLiteInteger";
|
|
749
|
-
data: number;
|
|
750
|
-
driverParam: number;
|
|
751
|
-
notNull: true;
|
|
752
|
-
hasDefault: false;
|
|
753
|
-
isPrimaryKey: false;
|
|
754
|
-
isAutoincrement: false;
|
|
755
|
-
hasRuntimeDefault: false;
|
|
756
|
-
enumValues: undefined;
|
|
757
|
-
baseColumn: never;
|
|
758
|
-
identity: undefined;
|
|
759
|
-
generated: undefined;
|
|
760
|
-
}, {}, {}>;
|
|
761
|
-
batch_target_chars: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
762
|
-
name: "batch_target_chars";
|
|
763
|
-
tableName: "decompose_jobs";
|
|
764
|
-
dataType: "number";
|
|
765
|
-
columnType: "SQLiteInteger";
|
|
766
|
-
data: number;
|
|
767
|
-
driverParam: number;
|
|
768
|
-
notNull: true;
|
|
769
|
-
hasDefault: false;
|
|
770
|
-
isPrimaryKey: false;
|
|
771
|
-
isAutoincrement: false;
|
|
772
|
-
hasRuntimeDefault: false;
|
|
773
|
-
enumValues: undefined;
|
|
774
|
-
baseColumn: never;
|
|
775
|
-
identity: undefined;
|
|
776
|
-
generated: undefined;
|
|
777
|
-
}, {}, {}>;
|
|
778
|
-
model: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
779
|
-
name: "model";
|
|
780
|
-
tableName: "decompose_jobs";
|
|
781
|
-
dataType: "string";
|
|
782
|
-
columnType: "SQLiteText";
|
|
783
|
-
data: string;
|
|
784
|
-
driverParam: string;
|
|
785
|
-
notNull: false;
|
|
786
|
-
hasDefault: false;
|
|
787
|
-
isPrimaryKey: false;
|
|
788
|
-
isAutoincrement: false;
|
|
789
|
-
hasRuntimeDefault: false;
|
|
790
|
-
enumValues: [string, ...string[]];
|
|
791
|
-
baseColumn: never;
|
|
792
|
-
identity: undefined;
|
|
793
|
-
generated: undefined;
|
|
794
|
-
}, {}, {
|
|
795
|
-
length: number | undefined;
|
|
796
|
-
}>;
|
|
797
|
-
merge_written: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
798
|
-
name: "merge_written";
|
|
799
|
-
tableName: "decompose_jobs";
|
|
800
|
-
dataType: "string";
|
|
801
|
-
columnType: "SQLiteText";
|
|
802
|
-
data: string;
|
|
803
|
-
driverParam: string;
|
|
804
|
-
notNull: false;
|
|
805
|
-
hasDefault: false;
|
|
806
|
-
isPrimaryKey: false;
|
|
807
|
-
isAutoincrement: false;
|
|
808
|
-
hasRuntimeDefault: false;
|
|
809
|
-
enumValues: [string, ...string[]];
|
|
810
|
-
baseColumn: never;
|
|
811
|
-
identity: undefined;
|
|
812
|
-
generated: undefined;
|
|
813
|
-
}, {}, {
|
|
814
|
-
length: number | undefined;
|
|
815
|
-
}>;
|
|
816
|
-
error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
817
|
-
name: "error";
|
|
818
|
-
tableName: "decompose_jobs";
|
|
819
|
-
dataType: "string";
|
|
820
|
-
columnType: "SQLiteText";
|
|
821
|
-
data: string;
|
|
822
|
-
driverParam: string;
|
|
823
|
-
notNull: false;
|
|
824
|
-
hasDefault: false;
|
|
825
|
-
isPrimaryKey: false;
|
|
826
|
-
isAutoincrement: false;
|
|
827
|
-
hasRuntimeDefault: false;
|
|
828
|
-
enumValues: [string, ...string[]];
|
|
829
|
-
baseColumn: never;
|
|
830
|
-
identity: undefined;
|
|
831
|
-
generated: undefined;
|
|
832
|
-
}, {}, {
|
|
833
|
-
length: number | undefined;
|
|
834
|
-
}>;
|
|
835
|
-
created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
836
|
-
name: "created_at";
|
|
837
|
-
tableName: "decompose_jobs";
|
|
838
|
-
dataType: "string";
|
|
839
|
-
columnType: "SQLiteText";
|
|
840
|
-
data: string;
|
|
841
|
-
driverParam: string;
|
|
842
|
-
notNull: true;
|
|
843
|
-
hasDefault: false;
|
|
844
|
-
isPrimaryKey: false;
|
|
845
|
-
isAutoincrement: false;
|
|
846
|
-
hasRuntimeDefault: false;
|
|
847
|
-
enumValues: [string, ...string[]];
|
|
848
|
-
baseColumn: never;
|
|
849
|
-
identity: undefined;
|
|
850
|
-
generated: undefined;
|
|
851
|
-
}, {}, {
|
|
852
|
-
length: number | undefined;
|
|
853
|
-
}>;
|
|
854
|
-
updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
855
|
-
name: "updated_at";
|
|
856
|
-
tableName: "decompose_jobs";
|
|
857
|
-
dataType: "string";
|
|
858
|
-
columnType: "SQLiteText";
|
|
859
|
-
data: string;
|
|
860
|
-
driverParam: string;
|
|
861
|
-
notNull: true;
|
|
862
|
-
hasDefault: false;
|
|
863
|
-
isPrimaryKey: false;
|
|
864
|
-
isAutoincrement: false;
|
|
865
|
-
hasRuntimeDefault: false;
|
|
866
|
-
enumValues: [string, ...string[]];
|
|
867
|
-
baseColumn: never;
|
|
868
|
-
identity: undefined;
|
|
869
|
-
generated: undefined;
|
|
870
|
-
}, {}, {
|
|
871
|
-
length: number | undefined;
|
|
872
|
-
}>;
|
|
873
|
-
};
|
|
874
|
-
dialect: "sqlite";
|
|
875
|
-
}>;
|
|
876
|
-
/**
|
|
877
|
-
* decompose_batches:批规划与批结果暂存(S2 的中间产物,不是待确认草稿)。
|
|
878
|
-
* 批结果只落 `result`(业务数据由 S3 写);无外键——job 行删除时批行由 helper 连带删。
|
|
879
|
-
*/
|
|
880
|
-
export declare const decomposeBatches: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
881
|
-
name: "decompose_batches";
|
|
882
|
-
schema: undefined;
|
|
883
|
-
columns: {
|
|
884
|
-
job_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
885
|
-
name: "job_id";
|
|
886
|
-
tableName: "decompose_batches";
|
|
887
|
-
dataType: "string";
|
|
888
|
-
columnType: "SQLiteText";
|
|
889
|
-
data: string;
|
|
890
|
-
driverParam: string;
|
|
891
|
-
notNull: true;
|
|
892
|
-
hasDefault: false;
|
|
893
|
-
isPrimaryKey: false;
|
|
894
|
-
isAutoincrement: false;
|
|
895
|
-
hasRuntimeDefault: false;
|
|
896
|
-
enumValues: [string, ...string[]];
|
|
897
|
-
baseColumn: never;
|
|
898
|
-
identity: undefined;
|
|
899
|
-
generated: undefined;
|
|
900
|
-
}, {}, {
|
|
901
|
-
length: number | undefined;
|
|
902
|
-
}>;
|
|
903
|
-
seq: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
904
|
-
name: "seq";
|
|
905
|
-
tableName: "decompose_batches";
|
|
906
|
-
dataType: "number";
|
|
907
|
-
columnType: "SQLiteInteger";
|
|
908
|
-
data: number;
|
|
909
|
-
driverParam: number;
|
|
910
|
-
notNull: true;
|
|
911
|
-
hasDefault: false;
|
|
912
|
-
isPrimaryKey: false;
|
|
913
|
-
isAutoincrement: false;
|
|
914
|
-
hasRuntimeDefault: false;
|
|
915
|
-
enumValues: undefined;
|
|
916
|
-
baseColumn: never;
|
|
917
|
-
identity: undefined;
|
|
918
|
-
generated: undefined;
|
|
919
|
-
}, {}, {}>;
|
|
920
|
-
chapter_ids: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
921
|
-
name: "chapter_ids";
|
|
922
|
-
tableName: "decompose_batches";
|
|
923
|
-
dataType: "string";
|
|
924
|
-
columnType: "SQLiteText";
|
|
925
|
-
data: string;
|
|
926
|
-
driverParam: string;
|
|
927
|
-
notNull: true;
|
|
928
|
-
hasDefault: false;
|
|
929
|
-
isPrimaryKey: false;
|
|
930
|
-
isAutoincrement: false;
|
|
931
|
-
hasRuntimeDefault: false;
|
|
932
|
-
enumValues: [string, ...string[]];
|
|
933
|
-
baseColumn: never;
|
|
934
|
-
identity: undefined;
|
|
935
|
-
generated: undefined;
|
|
936
|
-
}, {}, {
|
|
937
|
-
length: number | undefined;
|
|
938
|
-
}>;
|
|
939
|
-
status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
940
|
-
name: "status";
|
|
941
|
-
tableName: "decompose_batches";
|
|
942
|
-
dataType: "string";
|
|
943
|
-
columnType: "SQLiteText";
|
|
944
|
-
data: string;
|
|
945
|
-
driverParam: string;
|
|
946
|
-
notNull: true;
|
|
947
|
-
hasDefault: false;
|
|
948
|
-
isPrimaryKey: false;
|
|
949
|
-
isAutoincrement: false;
|
|
950
|
-
hasRuntimeDefault: false;
|
|
951
|
-
enumValues: [string, ...string[]];
|
|
952
|
-
baseColumn: never;
|
|
953
|
-
identity: undefined;
|
|
954
|
-
generated: undefined;
|
|
955
|
-
}, {}, {
|
|
956
|
-
length: number | undefined;
|
|
957
|
-
}>;
|
|
958
|
-
result: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
959
|
-
name: "result";
|
|
960
|
-
tableName: "decompose_batches";
|
|
961
|
-
dataType: "string";
|
|
962
|
-
columnType: "SQLiteText";
|
|
963
|
-
data: string;
|
|
964
|
-
driverParam: string;
|
|
965
|
-
notNull: false;
|
|
966
|
-
hasDefault: false;
|
|
967
|
-
isPrimaryKey: false;
|
|
968
|
-
isAutoincrement: false;
|
|
969
|
-
hasRuntimeDefault: false;
|
|
970
|
-
enumValues: [string, ...string[]];
|
|
971
|
-
baseColumn: never;
|
|
972
|
-
identity: undefined;
|
|
973
|
-
generated: undefined;
|
|
974
|
-
}, {}, {
|
|
975
|
-
length: number | undefined;
|
|
976
|
-
}>;
|
|
977
|
-
attempts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
978
|
-
name: "attempts";
|
|
979
|
-
tableName: "decompose_batches";
|
|
980
|
-
dataType: "number";
|
|
981
|
-
columnType: "SQLiteInteger";
|
|
982
|
-
data: number;
|
|
983
|
-
driverParam: number;
|
|
984
|
-
notNull: true;
|
|
985
|
-
hasDefault: true;
|
|
986
|
-
isPrimaryKey: false;
|
|
987
|
-
isAutoincrement: false;
|
|
988
|
-
hasRuntimeDefault: false;
|
|
989
|
-
enumValues: undefined;
|
|
990
|
-
baseColumn: never;
|
|
991
|
-
identity: undefined;
|
|
992
|
-
generated: undefined;
|
|
993
|
-
}, {}, {}>;
|
|
994
|
-
error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
995
|
-
name: "error";
|
|
996
|
-
tableName: "decompose_batches";
|
|
997
|
-
dataType: "string";
|
|
998
|
-
columnType: "SQLiteText";
|
|
999
|
-
data: string;
|
|
1000
|
-
driverParam: string;
|
|
1001
|
-
notNull: false;
|
|
1002
|
-
hasDefault: false;
|
|
1003
|
-
isPrimaryKey: false;
|
|
1004
|
-
isAutoincrement: false;
|
|
1005
|
-
hasRuntimeDefault: false;
|
|
1006
|
-
enumValues: [string, ...string[]];
|
|
1007
|
-
baseColumn: never;
|
|
1008
|
-
identity: undefined;
|
|
1009
|
-
generated: undefined;
|
|
1010
|
-
}, {}, {
|
|
1011
|
-
length: number | undefined;
|
|
1012
|
-
}>;
|
|
1013
|
-
updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1014
|
-
name: "updated_at";
|
|
1015
|
-
tableName: "decompose_batches";
|
|
1016
|
-
dataType: "string";
|
|
1017
|
-
columnType: "SQLiteText";
|
|
1018
|
-
data: string;
|
|
1019
|
-
driverParam: string;
|
|
1020
|
-
notNull: true;
|
|
1021
|
-
hasDefault: false;
|
|
1022
|
-
isPrimaryKey: false;
|
|
1023
|
-
isAutoincrement: false;
|
|
1024
|
-
hasRuntimeDefault: false;
|
|
1025
|
-
enumValues: [string, ...string[]];
|
|
1026
|
-
baseColumn: never;
|
|
1027
|
-
identity: undefined;
|
|
1028
|
-
generated: undefined;
|
|
1029
|
-
}, {}, {
|
|
1030
|
-
length: number | undefined;
|
|
1031
|
-
}>;
|
|
1032
|
-
};
|
|
1033
|
-
dialect: "sqlite";
|
|
1034
|
-
}>;
|
|
1035
680
|
/**
|
|
1036
681
|
* 全部业务表 + 索引的建表 SQL(幂等:CREATE TABLE/INDEX IF NOT EXISTS)——建表执行的事实来源。
|
|
1037
682
|
* 与上方 sqliteTable 定义必须同步(schema.test.ts 对齐断言覆盖)。
|
|
1038
683
|
*/
|
|
1039
|
-
export declare const CREATE_TABLES_SQL = "\n-- entities\uFF1A\u5B9E\u4F53\u8868\uFF08\u4EBA\u7269/\u8BBE\u5B9A/\u5730\u70B9/\u4F0F\u7B14/\u65F6\u95F4\u8F74\u4E8B\u4EF6/\u65F6\u95F4\u6807\u7B7E\u70B9\uFF09\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK(type IN ('character', 'setting', 'location', 'hook', 'event', 'timepoint', 'reference')),\n name TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}', -- JSON: \u5404\u7C7B\u578B\u7684\u4E13\u5C5E\u5B57\u6BB5\n sort_order INTEGER, -- \u65F6\u95F4\u8F74\u7EBF\u6027\u5E8F\uFF08G2 \u4FEE\u8BA2\uFF09\uFF1Aevent \u4E0E timepoint \u5404\u7C7B\u578B\u5185\u7EBF\u6027\uFF08\u5404\u81EA 0..n-1\uFF09\uFF0C\u5176\u4F59\u7C7B\u578B\u6052\u4E3A NULL\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF09\n deleted_at TEXT -- \u8F6F\u5220\u6807\u8BB0\uFF0CNULL \u8868\u793A\u672A\u5220\u9664\uFF1B\u975E NULL \u65F6\u8BE5\u5B9E\u4F53\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u672C\u4F53\u4FDD\u7559\u53EF\u8FD8\u539F\n);\n\n-- relation_records\uFF1A\u901A\u7528\u5173\u7CFB\u8868\nCREATE TABLE IF NOT EXISTS relation_records (\n id TEXT PRIMARY KEY,\n source_type TEXT NOT NULL, -- \u7AEF\u70B9\u7C7B\u578B\uFF1A\u5B9E\u4F53 'character'|'setting'|'location'|'hook'|'event'\uFF0C\u5927\u7EB2\u8282\u70B9 'outline_node'\n source_id TEXT NOT NULL,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n relation_type TEXT NOT NULL,\n metadata TEXT, -- JSON \u6269\u5C55\u5143\u6570\u636E\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF1B\u8F6F\u5220/\u8FD8\u539F\u4EA6\u66F4\u65B0\uFF09\n deleted_at TEXT -- \u7EA7\u8054\u8F6F\u5220\u6807\u8BB0\uFF1A\u4EC5\u5B9E\u4F53/\u8282\u70B9\u7EA7\u8054\u5220\u9664\u65F6\u5199\u5165\uFF1B\n -- \u624B\u52A8\u5220\u9664\u5173\u7CFB = \u7269\u7406\u5220\uFF08\u4E0D\u7F6E deleted_at\uFF0C\u4E0D\u8FDB\u5165\u56DE\u6536\u7AD9\uFF09\n);\n\n-- \u7D22\u5F15\uFF08\u8865\uFF09\uFF1Ak \u8DF3\u904D\u5386\u4E0E\u9AD8\u9891\u5173\u7CFB\u67E5\u8BE2\uFF08\u90E8\u5206\u7D22\u5F15\uFF0C\u4EC5\u8986\u76D6\u672A\u8F6F\u5220\u884C\uFF09\nCREATE INDEX IF NOT EXISTS idx_relation_source ON relation_records(source_id) WHERE deleted_at IS NULL;\nCREATE INDEX IF NOT EXISTS idx_relation_target ON relation_records(target_id) WHERE deleted_at IS NULL;\nCREATE INDEX IF NOT EXISTS idx_relation_type ON relation_records(relation_type) WHERE deleted_at IS NULL;\n\n-- delta_records\uFF1A\u5C5E\u6027\u53D8\u66F4\u8868\nCREATE TABLE IF NOT EXISTS delta_records (\n id TEXT PRIMARY KEY,\n node_id TEXT NOT NULL, -- \u89E6\u53D1\u53D8\u66F4\u7684\u5927\u7EB2\u8282\u70B9\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n changes TEXT NOT NULL, -- JSON: [{field, op, from?, to?, value?}]\n description TEXT NOT NULL, -- \u4EBA\u7C7B\u53EF\u8BFB\u63CF\u8FF0\n \"order\" INTEGER NOT NULL DEFAULT 0, -- \u540C\u4E00\u8282\u70B9\u5185\u591A\u4E2A Delta \u7684\u6392\u5E8F\uFF08\u5168\u5C40\u5355\u8C03\u9012\u589E\uFF0C\u670D\u52A1\u7AEF\u751F\u6210\uFF09\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF09\n deleted_at TEXT -- \u7EA7\u8054\u8F6F\u5220\u6807\u8BB0\uFF1A\u4EC5\u5B9E\u4F53/\u8282\u70B9\u7EA7\u8054\u5220\u9664\u65F6\u5199\u5165\u3002\n -- \u53EF\u89C1\u6027\u8054\u52A8\u89E6\u53D1\u8282\u70B9\u4E0E\u76EE\u6807\u5B9E\u4F53\uFF1A\u4EFB\u4E00\u7AEF\u8F6F\u5220\u5373\u4E0D\u53EF\u89C1\n);\n\n-- document_records\uFF1A\u5757\u6587\u6863\u8868\uFF08\u7AE0\u6B63\u6587 / \u53C2\u8003\u8D44\u6599\u6B63\u6587\uFF0C2026-09\uFF09\nCREATE TABLE IF NOT EXISTS document_records (\n owner_kind TEXT NOT NULL, -- 'chapter' | 'reference'\uFF08\u679A\u4E3E\u503C\u5C11\u4E14\u7A33\u5B9A\uFF0C\u4E0D\u52A0 CHECK\uFF09\n owner_id TEXT NOT NULL, -- 'ch-*'\uFF08\u7AE0\u8282\u70B9 id\uFF09| 'ref-*'\uFF08\u53C2\u8003\u8D44\u6599\u5B9E\u4F53 id\uFF09\n content TEXT NOT NULL, -- \u5757\u6570\u7EC4 JSON \u5B57\u7B26\u4E32\uFF08\u771F\u76F8\uFF1B\u670D\u52A1\u7AEF\u8BFB\u8DEF\u5F84\u4E0D\u89E3\u6790\uFF09\n content_text TEXT NOT NULL, -- \u670D\u52A1\u7AEF\u6D3E\u751F\u7684\u8F7B\u91CF md \u6295\u5F71\uFF08AI \u8BFB\u53D6/\u5217\u8868\u6458\u8981/\u641C\u7D22/\u5B57\u6570\uFF09\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u7248\u672C\u6233\uFF1A\u591A\u6807\u7B7E\u9875\u9632\u8986\u76D6\uFF09\n PRIMARY KEY (owner_kind, owner_id) -- \u4E00 owner \u4E00\u884C\uFF08upsert \u8986\u76D6\uFF0C\u884C\u968F owner \u751F\u547D\u5468\u671F\uFF09\n);\n\n
|
|
684
|
+
export declare const CREATE_TABLES_SQL = "\n-- entities\uFF1A\u5B9E\u4F53\u8868\uFF08\u4EBA\u7269/\u8BBE\u5B9A/\u5730\u70B9/\u4F0F\u7B14/\u65F6\u95F4\u8F74\u4E8B\u4EF6/\u65F6\u95F4\u6807\u7B7E\u70B9\uFF09\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK(type IN ('character', 'setting', 'location', 'hook', 'event', 'timepoint', 'reference')),\n name TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}', -- JSON: \u5404\u7C7B\u578B\u7684\u4E13\u5C5E\u5B57\u6BB5\n sort_order INTEGER, -- \u65F6\u95F4\u8F74\u7EBF\u6027\u5E8F\uFF08G2 \u4FEE\u8BA2\uFF09\uFF1Aevent \u4E0E timepoint \u5404\u7C7B\u578B\u5185\u7EBF\u6027\uFF08\u5404\u81EA 0..n-1\uFF09\uFF0C\u5176\u4F59\u7C7B\u578B\u6052\u4E3A NULL\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF09\n deleted_at TEXT -- \u8F6F\u5220\u6807\u8BB0\uFF0CNULL \u8868\u793A\u672A\u5220\u9664\uFF1B\u975E NULL \u65F6\u8BE5\u5B9E\u4F53\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u672C\u4F53\u4FDD\u7559\u53EF\u8FD8\u539F\n);\n\n-- relation_records\uFF1A\u901A\u7528\u5173\u7CFB\u8868\nCREATE TABLE IF NOT EXISTS relation_records (\n id TEXT PRIMARY KEY,\n source_type TEXT NOT NULL, -- \u7AEF\u70B9\u7C7B\u578B\uFF1A\u5B9E\u4F53 'character'|'setting'|'location'|'hook'|'event'\uFF0C\u5927\u7EB2\u8282\u70B9 'outline_node'\n source_id TEXT NOT NULL,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n relation_type TEXT NOT NULL,\n metadata TEXT, -- JSON \u6269\u5C55\u5143\u6570\u636E\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF1B\u8F6F\u5220/\u8FD8\u539F\u4EA6\u66F4\u65B0\uFF09\n deleted_at TEXT -- \u7EA7\u8054\u8F6F\u5220\u6807\u8BB0\uFF1A\u4EC5\u5B9E\u4F53/\u8282\u70B9\u7EA7\u8054\u5220\u9664\u65F6\u5199\u5165\uFF1B\n -- \u624B\u52A8\u5220\u9664\u5173\u7CFB = \u7269\u7406\u5220\uFF08\u4E0D\u7F6E deleted_at\uFF0C\u4E0D\u8FDB\u5165\u56DE\u6536\u7AD9\uFF09\n);\n\n-- \u7D22\u5F15\uFF08\u8865\uFF09\uFF1Ak \u8DF3\u904D\u5386\u4E0E\u9AD8\u9891\u5173\u7CFB\u67E5\u8BE2\uFF08\u90E8\u5206\u7D22\u5F15\uFF0C\u4EC5\u8986\u76D6\u672A\u8F6F\u5220\u884C\uFF09\nCREATE INDEX IF NOT EXISTS idx_relation_source ON relation_records(source_id) WHERE deleted_at IS NULL;\nCREATE INDEX IF NOT EXISTS idx_relation_target ON relation_records(target_id) WHERE deleted_at IS NULL;\nCREATE INDEX IF NOT EXISTS idx_relation_type ON relation_records(relation_type) WHERE deleted_at IS NULL;\n\n-- delta_records\uFF1A\u5C5E\u6027\u53D8\u66F4\u8868\nCREATE TABLE IF NOT EXISTS delta_records (\n id TEXT PRIMARY KEY,\n node_id TEXT NOT NULL, -- \u89E6\u53D1\u53D8\u66F4\u7684\u5927\u7EB2\u8282\u70B9\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n changes TEXT NOT NULL, -- JSON: [{field, op, from?, to?, value?}]\n description TEXT NOT NULL, -- \u4EBA\u7C7B\u53EF\u8BFB\u63CF\u8FF0\n \"order\" INTEGER NOT NULL DEFAULT 0, -- \u540C\u4E00\u8282\u70B9\u5185\u591A\u4E2A Delta \u7684\u6392\u5E8F\uFF08\u5168\u5C40\u5355\u8C03\u9012\u589E\uFF0C\u670D\u52A1\u7AEF\u751F\u6210\uFF09\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u63D0\u6848\u5FEB\u7167\u6BD4\u5BF9\uFF09\n deleted_at TEXT -- \u7EA7\u8054\u8F6F\u5220\u6807\u8BB0\uFF1A\u4EC5\u5B9E\u4F53/\u8282\u70B9\u7EA7\u8054\u5220\u9664\u65F6\u5199\u5165\u3002\n -- \u53EF\u89C1\u6027\u8054\u52A8\u89E6\u53D1\u8282\u70B9\u4E0E\u76EE\u6807\u5B9E\u4F53\uFF1A\u4EFB\u4E00\u7AEF\u8F6F\u5220\u5373\u4E0D\u53EF\u89C1\n);\n\n-- document_records\uFF1A\u5757\u6587\u6863\u8868\uFF08\u7AE0\u6B63\u6587 / \u53C2\u8003\u8D44\u6599\u6B63\u6587\uFF0C2026-09\uFF09\nCREATE TABLE IF NOT EXISTS document_records (\n owner_kind TEXT NOT NULL, -- 'chapter' | 'reference'\uFF08\u679A\u4E3E\u503C\u5C11\u4E14\u7A33\u5B9A\uFF0C\u4E0D\u52A0 CHECK\uFF09\n owner_id TEXT NOT NULL, -- 'ch-*'\uFF08\u7AE0\u8282\u70B9 id\uFF09| 'ref-*'\uFF08\u53C2\u8003\u8D44\u6599\u5B9E\u4F53 id\uFF09\n content TEXT NOT NULL, -- \u5757\u6570\u7EC4 JSON \u5B57\u7B26\u4E32\uFF08\u771F\u76F8\uFF1B\u670D\u52A1\u7AEF\u8BFB\u8DEF\u5F84\u4E0D\u89E3\u6790\uFF09\n content_text TEXT NOT NULL, -- \u670D\u52A1\u7AEF\u6D3E\u751F\u7684\u8F7B\u91CF md \u6295\u5F71\uFF08AI \u8BFB\u53D6/\u5217\u8868\u6458\u8981/\u641C\u7D22/\u5B57\u6570\uFF09\n created_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\n updated_at TEXT NOT NULL, -- ISO 8601\uFF0C\u5E94\u7528\u5C42\u5199\u5165\uFF08\u7248\u672C\u6233\uFF1A\u591A\u6807\u7B7E\u9875\u9632\u8986\u76D6\uFF09\n PRIMARY KEY (owner_kind, owner_id) -- \u4E00 owner \u4E00\u884C\uFF08upsert \u8986\u76D6\uFF0C\u884C\u968F owner \u751F\u547D\u5468\u671F\uFF09\n);\n\n";
|
|
1040
685
|
//# sourceMappingURL=tables.d.ts.map
|
package/dist/tables.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAiBA,iDAAiD;AACjD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB3B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcxB,CAAC;AAEF,mEAAmE;AAEnE;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW3B,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAiBA,iDAAiD;AACjD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB3B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcxB,CAAC;AAEF,mEAAmE;AAEnE;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,gpKA2D7B,CAAC"}
|
package/dist/tables.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
// 由 schema.test.ts「DDL 与定义对齐」断言锁住(列名/类型/notNull/主键机械比对)。
|
|
6
6
|
//
|
|
7
7
|
// 边界:
|
|
8
|
-
// - JSON 列(data/changes/metadata
|
|
8
|
+
// - JSON 列(data/changes/metadata)一律 **text 模式**,
|
|
9
9
|
// 不用 drizzle `mode:'json'`——drizzle 的 json mode 对坏 JSON 直接 JSON.parse 抛错,
|
|
10
|
-
// 会打挂整表查询;防御在 queries 的行映射层(entity.ts parseDataColumn
|
|
10
|
+
// 会打挂整表查询;防御在 queries 的行映射层(entity.ts parseDataColumn)。
|
|
11
11
|
// - 对话历史**不在库内**(项目目录 `sessions/*.jsonl`,见 sessions.ts / docs/db/schema.md)。
|
|
12
12
|
// - 标识符由 drizzle escapeName 双引号包裹输出(`"order"` 关键字列安全,无需特殊转义)。
|
|
13
13
|
// - CHECK 约束与部分索引两处都声明(drizzle 侧供对齐核对;真实建表以 DDL 常量为准)。
|
|
@@ -73,37 +73,6 @@ export const documentRecords = sqliteTable("document_records", {
|
|
|
73
73
|
created_at: text("created_at").notNull(),
|
|
74
74
|
updated_at: text("updated_at").notNull(), // 版本戳:多标签页防覆盖(base_updated_at 比对)
|
|
75
75
|
}, (t) => [primaryKey({ columns: [t.owner_kind, t.owner_id] })]);
|
|
76
|
-
/**
|
|
77
|
-
* decompose_jobs:拆解小说 job(导入式批量管线,设计见 docs/design/60-decompose.md)。
|
|
78
|
-
* 一项目一 job(业务层保证,不设唯一约束):状态机 pending → running → (paused | done | failed),
|
|
79
|
-
* 范围与组批口径是 S1 的快照(续拆/重跑按同一口径重算批次);无 deleted_at——撤销 = 删书或恢复备份。
|
|
80
|
-
*/
|
|
81
|
-
export const decomposeJobs = sqliteTable("decompose_jobs", {
|
|
82
|
-
id: text("id").primaryKey(), // 'job-*'
|
|
83
|
-
status: text("status").notNull(), // pending | running | paused | done | failed(枚举值少且稳定,不加 CHECK)
|
|
84
|
-
scope_start: integer("scope_start").notNull(), // 分析范围起始章序(1-based,文件位置序)
|
|
85
|
-
scope_end: integer("scope_end").notNull(),
|
|
86
|
-
batch_target_chars: integer("batch_target_chars").notNull(), // 组批目标字数快照
|
|
87
|
-
model: text("model"), // 本次使用的模型(provider/id),审计用
|
|
88
|
-
merge_written: text("merge_written"), // JSON: 上次归并写入清单(幂等/重跑三路比对;text 模式)
|
|
89
|
-
error: text("error"), // job 级失败摘要
|
|
90
|
-
created_at: text("created_at").notNull(),
|
|
91
|
-
updated_at: text("updated_at").notNull(),
|
|
92
|
-
});
|
|
93
|
-
/**
|
|
94
|
-
* decompose_batches:批规划与批结果暂存(S2 的中间产物,不是待确认草稿)。
|
|
95
|
-
* 批结果只落 `result`(业务数据由 S3 写);无外键——job 行删除时批行由 helper 连带删。
|
|
96
|
-
*/
|
|
97
|
-
export const decomposeBatches = sqliteTable("decompose_batches", {
|
|
98
|
-
job_id: text("job_id").notNull(), // → decompose_jobs.id
|
|
99
|
-
seq: integer("seq").notNull(), // 1-based 批序号(文件位置序)
|
|
100
|
-
chapter_ids: text("chapter_ids").notNull(), // JSON: 本批覆盖的章节点 id 列表(顺序 = 文件序;text 模式)
|
|
101
|
-
status: text("status").notNull(), // pending | running | done | failed
|
|
102
|
-
result: text("result"), // JSON: 该批抽取结果(逐章对齐;未完成 = NULL;text 模式)
|
|
103
|
-
attempts: integer("attempts").notNull().default(0), // 已尝试次数(重试上限见设计文档)
|
|
104
|
-
error: text("error"), // 该批失败摘要
|
|
105
|
-
updated_at: text("updated_at").notNull(),
|
|
106
|
-
}, (t) => [primaryKey({ columns: [t.job_id, t.seq] })]);
|
|
107
76
|
/**
|
|
108
77
|
* 全部业务表 + 索引的建表 SQL(幂等:CREATE TABLE/INDEX IF NOT EXISTS)——建表执行的事实来源。
|
|
109
78
|
* 与上方 sqliteTable 定义必须同步(schema.test.ts 对齐断言覆盖)。
|
|
@@ -167,31 +136,5 @@ CREATE TABLE IF NOT EXISTS document_records (
|
|
|
167
136
|
PRIMARY KEY (owner_kind, owner_id) -- 一 owner 一行(upsert 覆盖,行随 owner 生命周期)
|
|
168
137
|
);
|
|
169
138
|
|
|
170
|
-
-- decompose_jobs:拆解小说 job(一项目一 job,2026-09)
|
|
171
|
-
CREATE TABLE IF NOT EXISTS decompose_jobs (
|
|
172
|
-
id TEXT PRIMARY KEY, -- 'job-*'
|
|
173
|
-
status TEXT NOT NULL, -- pending | running | paused | done | failed(枚举值少且稳定,不加 CHECK)
|
|
174
|
-
scope_start INTEGER NOT NULL, -- 分析范围起始章序(1-based,文件位置序)
|
|
175
|
-
scope_end INTEGER NOT NULL,
|
|
176
|
-
batch_target_chars INTEGER NOT NULL, -- 组批目标字数快照(续拆/重跑按同一口径重算批次)
|
|
177
|
-
model TEXT, -- 本次使用的模型(provider/id),审计用
|
|
178
|
-
merge_written TEXT, -- JSON: 上次归并写入清单(幂等/重跑三路比对)
|
|
179
|
-
error TEXT, -- job 级失败摘要
|
|
180
|
-
created_at TEXT NOT NULL, -- ISO 8601,应用层写入
|
|
181
|
-
updated_at TEXT NOT NULL
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
-- decompose_batches:批规划与批结果暂存(S2 中间产物;无外键,批行由 helper 连带删)
|
|
185
|
-
CREATE TABLE IF NOT EXISTS decompose_batches (
|
|
186
|
-
job_id TEXT NOT NULL, -- → decompose_jobs.id
|
|
187
|
-
seq INTEGER NOT NULL, -- 1-based 批序号(文件位置序)
|
|
188
|
-
chapter_ids TEXT NOT NULL, -- JSON: 本批覆盖的章节点 id 列表(顺序 = 文件序)
|
|
189
|
-
status TEXT NOT NULL, -- pending | running | done | failed
|
|
190
|
-
result TEXT, -- JSON: 该批抽取结果(逐章对齐;未完成 = NULL)
|
|
191
|
-
attempts INTEGER NOT NULL DEFAULT 0,-- 已尝试次数(重试上限见设计文档)
|
|
192
|
-
error TEXT, -- 该批失败摘要
|
|
193
|
-
updated_at TEXT NOT NULL,
|
|
194
|
-
PRIMARY KEY (job_id, seq)
|
|
195
|
-
);
|
|
196
139
|
`;
|
|
197
140
|
//# sourceMappingURL=tables.js.map
|
package/dist/tables.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,iEAAiE;AACjE,oEAAoE;AACpE,yDAAyD;AACzD,EAAE;AACF,MAAM;AACN,
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whispering233/ai-editor-db",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "数据库层:better-sqlite3 连接 / 建表 / 查询",
|
|
6
6
|
"type": "module",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"postpack": "node ../../scripts/restore-package-json.mjs"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@whispering233/ai-editor-shared": "0.0.
|
|
29
|
+
"@whispering233/ai-editor-shared": "0.0.55",
|
|
30
30
|
"better-sqlite3": "^13.0.0",
|
|
31
31
|
"drizzle-orm": "0.45.2"
|
|
32
32
|
},
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import type { DecomposeBatchRes, DecomposeBatchResult, DecomposeJobRes } from "@whispering233/ai-editor-shared";
|
|
2
|
-
import { type Db } from "../connection.js";
|
|
3
|
-
/** job id 前缀(api-public id 约定 `{前缀}-{nanoid}`;job 用 `job-`) */
|
|
4
|
-
export declare const DECOMPOSE_JOB_ID_PREFIX = "job-";
|
|
5
|
-
/** job 状态(pending → running → (paused | done | failed)) */
|
|
6
|
-
export type DecomposeJobStatus = DecomposeJobRes["status"];
|
|
7
|
-
/** 批状态(pending → running → done | failed) */
|
|
8
|
-
export type DecomposeBatchStatus = DecomposeBatchRes["status"];
|
|
9
|
-
/** `merge_written` 项(JSON 形状,字段名与库列同口径)——上次归并写入清单(实体 + 关系 + 报告) */
|
|
10
|
-
export interface DecomposeMergeWrittenEntry {
|
|
11
|
-
id: string;
|
|
12
|
-
type: string;
|
|
13
|
-
/** 写入时的 `updated_at`(重跑三路比对的快照;变了 = 用户手工编辑过) */
|
|
14
|
-
updated_at: string;
|
|
15
|
-
}
|
|
16
|
-
/** decompose_jobs 行(列名与 DDL 同形;`merge_written` 已解析为清单) */
|
|
17
|
-
export interface DecomposeJobRow {
|
|
18
|
-
id: string;
|
|
19
|
-
status: DecomposeJobStatus;
|
|
20
|
-
scope_start: number;
|
|
21
|
-
scope_end: number;
|
|
22
|
-
batch_target_chars: number;
|
|
23
|
-
model: string | null;
|
|
24
|
-
merge_written: DecomposeMergeWrittenEntry[];
|
|
25
|
-
error: string | null;
|
|
26
|
-
created_at: string;
|
|
27
|
-
updated_at: string;
|
|
28
|
-
}
|
|
29
|
-
/** decompose_batches 行(**不含 result**——列表口径,批结果正文按需另取) */
|
|
30
|
-
export interface DecomposeBatchRow {
|
|
31
|
-
job_id: string;
|
|
32
|
-
seq: number;
|
|
33
|
-
/** 本批覆盖的章节点 id 列表(顺序 = 文件序) */
|
|
34
|
-
chapter_ids: string[];
|
|
35
|
-
status: DecomposeBatchStatus;
|
|
36
|
-
/** 已尝试次数 */
|
|
37
|
-
attempts: number;
|
|
38
|
-
error: string | null;
|
|
39
|
-
updated_at: string;
|
|
40
|
-
}
|
|
41
|
-
/** 单批详情 = 批行 + 抽取结果(未完成 → null) */
|
|
42
|
-
export interface DecomposeBatchDetailRow extends DecomposeBatchRow {
|
|
43
|
-
result: DecomposeBatchResult | null;
|
|
44
|
-
}
|
|
45
|
-
/** 创建 job 入参:范围/组批口径快照 + 批规划(S1 组批结果);job 初始状态恒为 pending */
|
|
46
|
-
export interface CreateDecomposeJobInput {
|
|
47
|
-
/** 分析范围起始章序(1-based,文件位置序) */
|
|
48
|
-
scopeStart: number;
|
|
49
|
-
scopeEnd: number;
|
|
50
|
-
/** 组批目标字数快照(续拆/重跑按同一口径重算批次) */
|
|
51
|
-
batchTargetChars: number;
|
|
52
|
-
/** 本次使用的模型(provider/id,审计用);未配置 → null */
|
|
53
|
-
model: string | null;
|
|
54
|
-
/** 批规划(seq 升序,各批的章 id 列表按文件序) */
|
|
55
|
-
batches: readonly {
|
|
56
|
-
seq: number;
|
|
57
|
-
chapterIds: readonly string[];
|
|
58
|
-
}[];
|
|
59
|
-
now: string;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 创建 job 并落全部批行(S1 的组批结果)——**同一事务**:job 与批规划要么同时存在,要么都不存在。
|
|
63
|
-
* job 初始状态 = `pending`(启动 = `updateJobStatus(status='running')`);
|
|
64
|
-
* 批行初始状态 = `pending`、`attempts = 0`、`result = NULL`。
|
|
65
|
-
*
|
|
66
|
-
* @returns 落库后的 job 行(id 由本模块生成,`job-` 前缀 + nanoid)
|
|
67
|
-
*/
|
|
68
|
-
export declare function createDecomposeJob(db: Db, input: CreateDecomposeJobInput): DecomposeJobRow;
|
|
69
|
-
/**
|
|
70
|
-
* 读当前项目的 job(进度轮询、端点解析用)。
|
|
71
|
-
* 一项目一 job 是业务层不变式(`docs/db/schema.md`);多行时取最新创建的一条。
|
|
72
|
-
* @returns 行对象;从未开始拆解 → null(端点侧 404 `DECOMPOSE_JOB_NOT_FOUND`)
|
|
73
|
-
*/
|
|
74
|
-
export declare function getDecomposeJob(db: Db): DecomposeJobRow | null;
|
|
75
|
-
/**
|
|
76
|
-
* 读**全部** job 行(创建时间升序,同时间按 id)——S3 三路比对的**跨轮 baseline** 面:
|
|
77
|
-
* 「历史全部 job 的 `merge_written` 并集(同一 id 取最新一次记录的时间戳)」按此顺序覆盖取并
|
|
78
|
-
* (`docs/design/60-decompose.md` §6.1)。
|
|
79
|
-
*/
|
|
80
|
-
export declare function listDecomposeJobs(db: Db): DecomposeJobRow[];
|
|
81
|
-
/**
|
|
82
|
-
* job 状态流转(pending → running → paused/done/failed;前置状态校验归端点/runner,
|
|
83
|
-
* 状态字面量集见 `DecomposeJobStatus`)。同时推进 `updated_at`(进度轮询的时间戳)。
|
|
84
|
-
* @returns 影响行数(0 = job 不存在)
|
|
85
|
-
*/
|
|
86
|
-
export declare function updateJobStatus(db: Db, jobId: string, status: DecomposeJobStatus, now: string): number;
|
|
87
|
-
/**
|
|
88
|
-
* 写 job 级错误摘要(`null` = 清除,如续拆/重跑开工时)。
|
|
89
|
-
* @returns 影响行数(0 = job 不存在)
|
|
90
|
-
*/
|
|
91
|
-
export declare function setJobError(db: Db, jobId: string, error: string | null, now: string): number;
|
|
92
|
-
/**
|
|
93
|
-
* **状态归一**(打开项目时调用):把残留的 `running` 改判为 `paused`——进程内已无在跑 job
|
|
94
|
-
* (服务端重启 / 进程崩溃),UI 提示「上次拆解中断,可续拆」(`docs/design/60-decompose.md` §7)。
|
|
95
|
-
*
|
|
96
|
-
* 批行不动:续拆从第一个未完成批继续,`startBatchAttempt` 对残留 `running` 批同样成立
|
|
97
|
-
* (重新计入一次尝试),无需单独归一。
|
|
98
|
-
*
|
|
99
|
-
* @returns 被归一的 job 条数(正常路径 0)
|
|
100
|
-
*/
|
|
101
|
-
export declare function pauseRunningJobs(db: Db, now: string): number;
|
|
102
|
-
/**
|
|
103
|
-
* 写 `merge_written` 清单(上次归并写入的实体/关系/报告 id + 写入时 `updated_at`)——
|
|
104
|
-
* 重跑 S3 的三路比对快照(§6.1)。
|
|
105
|
-
* @returns 影响行数(0 = job 不存在)
|
|
106
|
-
*/
|
|
107
|
-
export declare function writeMergeWritten(db: Db, jobId: string, entries: readonly DecomposeMergeWrittenEntry[], now: string): number;
|
|
108
|
-
/**
|
|
109
|
-
* 删除 job 及其全部批行(**同事务**;无外键,孤儿批行只能由本函数拦住)。
|
|
110
|
-
* 用于清场重来(重跑整套 / 重置拆解);删整本书走书目录删除、不经过本函数。
|
|
111
|
-
* @returns 删除的总行数(job 1 + 批 N;不存在 → 0,幂等)
|
|
112
|
-
*/
|
|
113
|
-
export declare function deleteDecomposeJob(db: Db, jobId: string): number;
|
|
114
|
-
/**
|
|
115
|
-
* 读某 job 的批列表(**不含 `result`**,按 `seq` 升序)。
|
|
116
|
-
* 列表口径投影:不 SELECT `result`——数百批 × 每条千级 token 的结果正文不得进列表响应。
|
|
117
|
-
*/
|
|
118
|
-
export declare function listDecomposeBatches(db: Db, jobId: string): DecomposeBatchRow[];
|
|
119
|
-
/** 读单批(含 `result`)——进度页展开行时按需拉取;批序号越界 → null(端点侧 404) */
|
|
120
|
-
export declare function getDecomposeBatch(db: Db, jobId: string, seq: number): DecomposeBatchDetailRow | null;
|
|
121
|
-
/**
|
|
122
|
-
* 开始一次尝试:批状态 → `running`、`attempts` 自增、清上一条错误摘要。
|
|
123
|
-
* 对 `pending` / `failed` / 残留 `running` 同样成立(续拆重取同一批即新一轮尝试)。
|
|
124
|
-
* @returns 自增后的尝试序号;批不存在 → null
|
|
125
|
-
*/
|
|
126
|
-
export declare function startBatchAttempt(db: Db, jobId: string, seq: number, now: string): number | null;
|
|
127
|
-
/** 批完成:抽取结果落库、状态 → `done`、清错误摘要 */
|
|
128
|
-
export declare function completeBatch(db: Db, input: {
|
|
129
|
-
jobId: string;
|
|
130
|
-
seq: number;
|
|
131
|
-
result: DecomposeBatchResult;
|
|
132
|
-
now: string;
|
|
133
|
-
}): number;
|
|
134
|
-
/**
|
|
135
|
-
* 批失败:状态 → `failed` + 失败摘要;`result` 置 **NULL**(契约口径「未完成 = NULL」——
|
|
136
|
-
* 重跑失败后不得留着上一轮结果冒充本批产物)。
|
|
137
|
-
*/
|
|
138
|
-
export declare function failBatch(db: Db, input: {
|
|
139
|
-
jobId: string;
|
|
140
|
-
seq: number;
|
|
141
|
-
error: string;
|
|
142
|
-
now: string;
|
|
143
|
-
}): number;
|
|
144
|
-
//# sourceMappingURL=decompose.d.ts.map
|