@downcity/city 0.2.17

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 (142) hide show
  1. package/README.md +182 -0
  2. package/bin/core/auth/authenticator.d.ts +79 -0
  3. package/bin/core/auth/authenticator.d.ts.map +1 -0
  4. package/bin/core/auth/authenticator.js +125 -0
  5. package/bin/core/auth/authenticator.js.map +1 -0
  6. package/bin/core/auth/token-signer.d.ts +27 -0
  7. package/bin/core/auth/token-signer.d.ts.map +1 -0
  8. package/bin/core/auth/token-signer.js +116 -0
  9. package/bin/core/auth/token-signer.js.map +1 -0
  10. package/bin/core/auth/types.d.ts +94 -0
  11. package/bin/core/auth/types.d.ts.map +1 -0
  12. package/bin/core/auth/types.js +7 -0
  13. package/bin/core/auth/types.js.map +1 -0
  14. package/bin/core/base/base-env-catalog.d.ts +13 -0
  15. package/bin/core/base/base-env-catalog.d.ts.map +1 -0
  16. package/bin/core/base/base-env-catalog.js +85 -0
  17. package/bin/core/base/base-env-catalog.js.map +1 -0
  18. package/bin/core/base/base-init.d.ts +48 -0
  19. package/bin/core/base/base-init.d.ts.map +1 -0
  20. package/bin/core/base/base-init.js +105 -0
  21. package/bin/core/base/base-init.js.map +1 -0
  22. package/bin/core/base/base-instruction.d.ts +11 -0
  23. package/bin/core/base/base-instruction.d.ts.map +1 -0
  24. package/bin/core/base/base-instruction.js +37 -0
  25. package/bin/core/base/base-instruction.js.map +1 -0
  26. package/bin/core/base/base-router.d.ts +41 -0
  27. package/bin/core/base/base-router.d.ts.map +1 -0
  28. package/bin/core/base/base-router.js +222 -0
  29. package/bin/core/base/base-router.js.map +1 -0
  30. package/bin/core/base/base-runtime.d.ts +13 -0
  31. package/bin/core/base/base-runtime.d.ts.map +1 -0
  32. package/bin/core/base/base-runtime.js +116 -0
  33. package/bin/core/base/base-runtime.js.map +1 -0
  34. package/bin/core/base/base.d.ts +82 -0
  35. package/bin/core/base/base.d.ts.map +1 -0
  36. package/bin/core/base/base.js +156 -0
  37. package/bin/core/base/base.js.map +1 -0
  38. package/bin/core/runtime.d.ts +120 -0
  39. package/bin/core/runtime.d.ts.map +1 -0
  40. package/bin/core/runtime.js +13 -0
  41. package/bin/core/runtime.js.map +1 -0
  42. package/bin/core/types.d.ts +60 -0
  43. package/bin/core/types.d.ts.map +1 -0
  44. package/bin/core/types.js +7 -0
  45. package/bin/core/types.js.map +1 -0
  46. package/bin/index.d.ts +33 -0
  47. package/bin/index.d.ts.map +1 -0
  48. package/bin/index.js +37 -0
  49. package/bin/index.js.map +1 -0
  50. package/bin/service/action.d.ts +44 -0
  51. package/bin/service/action.d.ts.map +1 -0
  52. package/bin/service/action.js +48 -0
  53. package/bin/service/action.js.map +1 -0
  54. package/bin/service/ai/ai-service.d.ts +56 -0
  55. package/bin/service/ai/ai-service.d.ts.map +1 -0
  56. package/bin/service/ai/ai-service.js +262 -0
  57. package/bin/service/ai/ai-service.js.map +1 -0
  58. package/bin/service/ai/openai-compatible-provider.d.ts +54 -0
  59. package/bin/service/ai/openai-compatible-provider.d.ts.map +1 -0
  60. package/bin/service/ai/openai-compatible-provider.js +175 -0
  61. package/bin/service/ai/openai-compatible-provider.js.map +1 -0
  62. package/bin/service/ai/provider.d.ts +43 -0
  63. package/bin/service/ai/provider.d.ts.map +1 -0
  64. package/bin/service/ai/provider.js +50 -0
  65. package/bin/service/ai/provider.js.map +1 -0
  66. package/bin/service/ai/types.d.ts +94 -0
  67. package/bin/service/ai/types.d.ts.map +1 -0
  68. package/bin/service/ai/types.js +7 -0
  69. package/bin/service/ai/types.js.map +1 -0
  70. package/bin/service/env/env-service.d.ts +12 -0
  71. package/bin/service/env/env-service.d.ts.map +1 -0
  72. package/bin/service/env/env-service.js +39 -0
  73. package/bin/service/env/env-service.js.map +1 -0
  74. package/bin/service/env/env-store.d.ts +15 -0
  75. package/bin/service/env/env-store.d.ts.map +1 -0
  76. package/bin/service/env/env-store.js +35 -0
  77. package/bin/service/env/env-store.js.map +1 -0
  78. package/bin/service/env/schema.d.ts +171 -0
  79. package/bin/service/env/schema.d.ts.map +1 -0
  80. package/bin/service/env/schema.js +52 -0
  81. package/bin/service/env/schema.js.map +1 -0
  82. package/bin/service/env/types.d.ts +79 -0
  83. package/bin/service/env/types.d.ts.map +1 -0
  84. package/bin/service/env/types.js +8 -0
  85. package/bin/service/env/types.js.map +1 -0
  86. package/bin/service/hook.d.ts +23 -0
  87. package/bin/service/hook.d.ts.map +1 -0
  88. package/bin/service/hook.js +49 -0
  89. package/bin/service/hook.js.map +1 -0
  90. package/bin/service/installable-service.d.ts +75 -0
  91. package/bin/service/installable-service.d.ts.map +1 -0
  92. package/bin/service/installable-service.js +89 -0
  93. package/bin/service/installable-service.js.map +1 -0
  94. package/bin/service/instruction.d.ts +106 -0
  95. package/bin/service/instruction.d.ts.map +1 -0
  96. package/bin/service/instruction.js +70 -0
  97. package/bin/service/instruction.js.map +1 -0
  98. package/bin/service/service.d.ts +140 -0
  99. package/bin/service/service.d.ts.map +1 -0
  100. package/bin/service/service.js +94 -0
  101. package/bin/service/service.js.map +1 -0
  102. package/bin/service/studios/schema.d.ts +207 -0
  103. package/bin/service/studios/schema.d.ts.map +1 -0
  104. package/bin/service/studios/schema.js +60 -0
  105. package/bin/service/studios/schema.js.map +1 -0
  106. package/bin/service/studios/studio-store.d.ts +17 -0
  107. package/bin/service/studios/studio-store.d.ts.map +1 -0
  108. package/bin/service/studios/studio-store.js +49 -0
  109. package/bin/service/studios/studio-store.js.map +1 -0
  110. package/bin/service/studios/studios-service.d.ts +15 -0
  111. package/bin/service/studios/studios-service.d.ts.map +1 -0
  112. package/bin/service/studios/studios-service.js +51 -0
  113. package/bin/service/studios/studios-service.js.map +1 -0
  114. package/bin/service/studios/types.d.ts +51 -0
  115. package/bin/service/studios/types.d.ts.map +1 -0
  116. package/bin/service/studios/types.js +7 -0
  117. package/bin/service/studios/types.js.map +1 -0
  118. package/bin/service/types.d.ts +11 -0
  119. package/bin/service/types.d.ts.map +1 -0
  120. package/bin/service/types.js +5 -0
  121. package/bin/service/types.js.map +1 -0
  122. package/bin/store/db.d.ts +61 -0
  123. package/bin/store/db.d.ts.map +1 -0
  124. package/bin/store/db.js +29 -0
  125. package/bin/store/db.js.map +1 -0
  126. package/bin/store/table-api.d.ts +42 -0
  127. package/bin/store/table-api.d.ts.map +1 -0
  128. package/bin/store/table-api.js +100 -0
  129. package/bin/store/table-api.js.map +1 -0
  130. package/bin/store/types.d.ts +14 -0
  131. package/bin/store/types.d.ts.map +1 -0
  132. package/bin/store/types.js +7 -0
  133. package/bin/store/types.js.map +1 -0
  134. package/bin/utils/helpers.d.ts +101 -0
  135. package/bin/utils/helpers.d.ts.map +1 -0
  136. package/bin/utils/helpers.js +192 -0
  137. package/bin/utils/helpers.js.map +1 -0
  138. package/bin/utils/validation.d.ts +18 -0
  139. package/bin/utils/validation.d.ts.map +1 -0
  140. package/bin/utils/validation.js +28 -0
  141. package/bin/utils/validation.js.map +1 -0
  142. package/package.json +55 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * City 组装模块。
3
+ *
4
+ * 负责把用户传入的 Drizzle db 适配成 City 内部 runtime 能力,
5
+ * 并提供默认的数据库 env provider。
6
+ */
7
+ import { pgEnv, sqliteEnv } from "../../service/env/schema.js";
8
+ import { pgStudios, sqliteStudios } from "../../service/studios/schema.js";
9
+ import { normalizeEnvKey, parseDotenvEntries } from "../../utils/helpers.js";
10
+ /**
11
+ * 从 CityOptions 创建 runtime。
12
+ */
13
+ export function create_runtime_from_db(options) {
14
+ const dialect = options.dialect ?? infer_dialect(options.db);
15
+ const builtin_tables = builtin_tables_for(dialect);
16
+ const client = extract_db_client(options.db);
17
+ return {
18
+ database: options.db,
19
+ client,
20
+ env: new DatabaseEnvProvider(),
21
+ builtinTables: builtin_tables,
22
+ raw: options.raw ?? options.db.$client,
23
+ };
24
+ }
25
+ /**
26
+ * 推断 City 内置表定义。
27
+ */
28
+ function builtin_tables_for(dialect) {
29
+ return dialect === "pg"
30
+ ? { studios: pgStudios, env: pgEnv }
31
+ : { studios: sqliteStudios, env: sqliteEnv };
32
+ }
33
+ /**
34
+ * 从 Drizzle 实例推断方言。
35
+ */
36
+ function infer_dialect(db) {
37
+ const entity_kind = db.constructor?.name ?? "";
38
+ if (/pg|postgres/i.test(entity_kind))
39
+ return "pg";
40
+ if (/sqlite|d1/i.test(entity_kind))
41
+ return "sqlite";
42
+ throw new Error("Unable to infer Drizzle dialect. Pass { dialect: \"pg\" } or { dialect: \"sqlite\" } to City.");
43
+ }
44
+ /**
45
+ * 提取底层数据库 client。
46
+ */
47
+ function extract_db_client(db) {
48
+ const client = db.$client;
49
+ if (client && typeof client === "object") {
50
+ return client;
51
+ }
52
+ if (typeof client === "function") {
53
+ return {
54
+ unsafe: (sql, params) => client(sql, params),
55
+ };
56
+ }
57
+ throw new Error("Drizzle db must expose $client so City can initialize tables.");
58
+ }
59
+ /**
60
+ * 数据库存储的 env provider。
61
+ *
62
+ * 关键说明(中文)
63
+ * - City 把所有系统与业务 env 统一托管到 env 表
64
+ * - 运行时通过内存 cache 加速读取,每次请求前 refresh 保证最新视图
65
+ */
66
+ class DatabaseEnvProvider {
67
+ store;
68
+ cache = new Map();
69
+ async attachStore(store) {
70
+ this.store = store;
71
+ await this.refresh();
72
+ }
73
+ get(key) {
74
+ return this.cache.get(normalizeEnvKey(key));
75
+ }
76
+ async refresh() {
77
+ if (!this.store)
78
+ return;
79
+ const entries = await this.store.list();
80
+ this.cache.clear();
81
+ for (const entry of entries) {
82
+ this.cache.set(entry.key, entry.value);
83
+ }
84
+ }
85
+ async list() {
86
+ await this.refresh();
87
+ return [...this.cache.entries()].map(([key, value]) => ({
88
+ key,
89
+ value,
90
+ source: "database",
91
+ }));
92
+ }
93
+ async upsert(input) {
94
+ if (!this.store)
95
+ throw new Error("Env store is not ready");
96
+ const entry = await this.store.upsert(input);
97
+ this.cache.set(entry.key, entry.value);
98
+ return entry;
99
+ }
100
+ async remove(key) {
101
+ if (!this.store)
102
+ throw new Error("Env store is not ready");
103
+ const normalized_key = normalizeEnvKey(key);
104
+ await this.store.remove(normalized_key);
105
+ this.cache.delete(normalized_key);
106
+ }
107
+ async import(raw) {
108
+ const entries = parseDotenvEntries(raw);
109
+ const stored = [];
110
+ for (const entry of entries) {
111
+ stored.push(await this.upsert(entry));
112
+ }
113
+ return stored;
114
+ }
115
+ }
116
+ //# sourceMappingURL=base-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-runtime.js","sourceRoot":"","sources":["../../../src/core/base/base-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * City 主模块。
3
+ *
4
+ * City 是城市基础设施运行容器,负责协调:
5
+ * - service 注册
6
+ * - runtime 初始化
7
+ * - 鉴权器访问
8
+ * - HTTP 路由暴露
9
+ *
10
+ * 具体初始化、路由构建、instruction 聚合等实现已拆到独立模块。
11
+ */
12
+ import type { Hono } from "hono";
13
+ import { Service } from "../../service/service.js";
14
+ import { type ServiceDefinition } from "../../service/installable-service.js";
15
+ import type { CityOptions, CityHealthStatus } from "../types.js";
16
+ import type { Authenticator } from "../auth/authenticator.js";
17
+ import type { CityTableApi } from "../../store/table-api.js";
18
+ export declare class City {
19
+ private readonly runtime;
20
+ private readonly services;
21
+ private database?;
22
+ private client?;
23
+ private table_map?;
24
+ private init_promise?;
25
+ private hono?;
26
+ private authenticator?;
27
+ private studio_store?;
28
+ constructor(options: CityOptions);
29
+ /**
30
+ * 注册 service。
31
+ */
32
+ use(service_input: Service | ServiceDefinition): this;
33
+ /**
34
+ * 获取单个 service。
35
+ */
36
+ getService(id: string): Service | undefined;
37
+ /**
38
+ * 获取所有已注册 service。
39
+ */
40
+ getServices(): Service[];
41
+ /**
42
+ * 获取鉴权器。
43
+ */
44
+ getAuthenticator(): Promise<Authenticator>;
45
+ /**
46
+ * 获取表 API。
47
+ */
48
+ table<TRow extends Record<string, unknown> = Record<string, unknown>>(name: string): Promise<CityTableApi<TRow>>;
49
+ /**
50
+ * 返回已构建好的 Hono router。
51
+ */
52
+ router(): Hono;
53
+ /**
54
+ * 处理 HTTP 请求。
55
+ */
56
+ handleRequest(request: Request): Promise<Response>;
57
+ /**
58
+ * 健康检查。
59
+ */
60
+ health(): Promise<CityHealthStatus>;
61
+ /**
62
+ * 聚合 instruction 文档。
63
+ */
64
+ instruction(): Promise<string>;
65
+ /**
66
+ * 执行 City 初始化。
67
+ */
68
+ private initialize;
69
+ /**
70
+ * 确保初始化完成。
71
+ */
72
+ private ensure_ready;
73
+ /**
74
+ * 同步要求初始化完成。
75
+ */
76
+ private require_ready_sync;
77
+ /**
78
+ * 给 Authenticator 延迟访问 studio store。
79
+ */
80
+ private require_ready;
81
+ }
82
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAOpG,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAwB;IACvC,OAAO,CAAC,SAAS,CAAC,CAA4B;IAC9C,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC,OAAO,CAAC,IAAI,CAAC,CAAO;IACpB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAC,CAAc;gBAEvB,OAAO,EAAE,WAAW;IAMhC;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI;IAQrD;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C;;OAEG;IACH,WAAW,IAAI,OAAO,EAAE;IAIxB;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAKhD;;OAEG;IACG,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxE,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAO9B;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAYzC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;OAEG;YACW,UAAU;IAoBxB;;OAEG;YACW,YAAY;IAO1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;YACW,aAAa;CAQ5B"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * City 主模块。
3
+ *
4
+ * City 是城市基础设施运行容器,负责协调:
5
+ * - service 注册
6
+ * - runtime 初始化
7
+ * - 鉴权器访问
8
+ * - HTTP 路由暴露
9
+ *
10
+ * 具体初始化、路由构建、instruction 聚合等实现已拆到独立模块。
11
+ */
12
+ import { asInstallableService } from "../../service/installable-service.js";
13
+ import { EnvService } from "../../service/env/env-service.js";
14
+ import { StudiosService } from "../../service/studios/studios-service.js";
15
+ import { build_city_instruction } from "./base-instruction.js";
16
+ import { initialize_city } from "./base-init.js";
17
+ import { build_city_router } from "./base-router.js";
18
+ import { create_runtime_from_db } from "./base-runtime.js";
19
+ export class City {
20
+ runtime;
21
+ services = new Map();
22
+ database;
23
+ client;
24
+ table_map;
25
+ init_promise;
26
+ hono;
27
+ authenticator;
28
+ studio_store;
29
+ constructor(options) {
30
+ this.runtime = options.runtime ?? create_runtime_from_db(options);
31
+ this.use(new EnvService());
32
+ this.use(new StudiosService());
33
+ }
34
+ /**
35
+ * 注册 service。
36
+ */
37
+ use(service_input) {
38
+ const service = "install" in service_input && !("get" in service_input)
39
+ ? asInstallableService(service_input)
40
+ : service_input;
41
+ this.services.set(service.id, service);
42
+ return this;
43
+ }
44
+ /**
45
+ * 获取单个 service。
46
+ */
47
+ getService(id) {
48
+ return this.services.get(id);
49
+ }
50
+ /**
51
+ * 获取所有已注册 service。
52
+ */
53
+ getServices() {
54
+ return [...this.services.values()];
55
+ }
56
+ /**
57
+ * 获取鉴权器。
58
+ */
59
+ async getAuthenticator() {
60
+ await this.ensure_ready();
61
+ return this.authenticator;
62
+ }
63
+ /**
64
+ * 获取表 API。
65
+ */
66
+ async table(name) {
67
+ await this.ensure_ready();
68
+ const api = this.table_map?.get(name);
69
+ if (!api)
70
+ throw new Error(`Unknown schema table: ${name}`);
71
+ return api;
72
+ }
73
+ /**
74
+ * 返回已构建好的 Hono router。
75
+ */
76
+ router() {
77
+ this.require_ready_sync();
78
+ return this.hono;
79
+ }
80
+ /**
81
+ * 处理 HTTP 请求。
82
+ */
83
+ async handleRequest(request) {
84
+ await this.ensure_ready();
85
+ return this.hono.fetch(request);
86
+ }
87
+ /**
88
+ * 健康检查。
89
+ */
90
+ async health() {
91
+ await this.ensure_ready();
92
+ const services = this.getServices();
93
+ return {
94
+ ok: true,
95
+ name: "downcity",
96
+ checked_at: new Date().toISOString(),
97
+ services: services.map((service) => service.id),
98
+ service_list: services.map((service) => ({ id: service.id, name: service.name })),
99
+ };
100
+ }
101
+ /**
102
+ * 聚合 instruction 文档。
103
+ */
104
+ async instruction() {
105
+ await this.ensure_ready();
106
+ return build_city_instruction(this.getServices());
107
+ }
108
+ /**
109
+ * 执行 City 初始化。
110
+ */
111
+ async initialize() {
112
+ const state = await initialize_city({
113
+ runtime: this.runtime,
114
+ services: this.getServices(),
115
+ require_ready: () => this.require_ready(),
116
+ });
117
+ this.database = state.database;
118
+ this.client = state.client;
119
+ this.table_map = state.table_map;
120
+ this.studio_store = state.studio_store;
121
+ this.authenticator = state.authenticator;
122
+ this.hono = build_city_router({
123
+ runtime: this.runtime,
124
+ services: this.getServices(),
125
+ authenticator: state.authenticator,
126
+ table_map: state.table_map,
127
+ });
128
+ }
129
+ /**
130
+ * 确保初始化完成。
131
+ */
132
+ async ensure_ready() {
133
+ if (!this.init_promise) {
134
+ this.init_promise = this.initialize();
135
+ }
136
+ await this.init_promise;
137
+ }
138
+ /**
139
+ * 同步要求初始化完成。
140
+ */
141
+ require_ready_sync() {
142
+ if (!this.hono) {
143
+ throw new Error("City init has not completed yet");
144
+ }
145
+ }
146
+ /**
147
+ * 给 Authenticator 延迟访问 studio store。
148
+ */
149
+ async require_ready() {
150
+ await this.ensure_ready();
151
+ return {
152
+ studio: this.studio_store ?? { get: () => Promise.resolve(undefined) },
153
+ };
154
+ }
155
+ }
156
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Runtime 能力接口模块。
3
+ *
4
+ * 定义 City 内部依赖的能力集合。用户侧只需要传入 Drizzle db,
5
+ * City 会从 db 组装这些能力。
6
+ *
7
+ * 使用示例:
8
+ * ```ts
9
+ * const city = new City({ db });
10
+ * ```
11
+ */
12
+ import type { Database, DbClient } from "../store/db.js";
13
+ import type { EnvEntry, EnvUpsertInput } from "../service/env/types.js";
14
+ import type { EnvStore } from "../service/env/env-store.js";
15
+ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
16
+ import type { AnyPgTable } from "drizzle-orm/pg-core";
17
+ /** 表定义类型(SQLite 或 Postgres) */
18
+ export type TableDef = AnySQLiteTable | AnyPgTable;
19
+ /**
20
+ * 环境变量提供者接口。
21
+ *
22
+ * City 通过此接口读取/写入运行时环境变量。
23
+ */
24
+ export interface EnvProvider {
25
+ /**
26
+ * 读取单个环境变量。
27
+ *
28
+ * @param key - 环境变量名(会自动标准化)
29
+ */
30
+ get(key: string): string | undefined;
31
+ /**
32
+ * 主动刷新当前 provider 的读取视图。
33
+ *
34
+ * 关键说明(中文)
35
+ * - City 在每次 HTTP 请求进入时会先调用它
36
+ * - 这样 Worker 常驻实例也能及时看到别的请求刚写入的 City env
37
+ */
38
+ refresh(): Promise<void>;
39
+ /**
40
+ * 列出所有环境变量(含来源信息)。
41
+ */
42
+ list(): EnvEntry[] | Promise<EnvEntry[]>;
43
+ /**
44
+ * 写入或更新环境变量。
45
+ *
46
+ * @param input - 环境变量键值
47
+ */
48
+ upsert(input: EnvUpsertInput): Promise<EnvEntry>;
49
+ /**
50
+ * 删除环境变量。
51
+ *
52
+ * @param key - 环境变量名
53
+ */
54
+ remove(key: string): Promise<void>;
55
+ /**
56
+ * 批量导入环境变量文本(.env 格式)。
57
+ *
58
+ * @param raw - .env 文本内容
59
+ */
60
+ import(raw: unknown): Promise<EnvEntry[]>;
61
+ /**
62
+ * 关联数据库存储。
63
+ *
64
+ * City 初始化内置 env 表后调用。
65
+ * 默认 env provider 会把 City env 表作为唯一业务 env 来源。
66
+ */
67
+ attachStore(store: EnvStore): Promise<void>;
68
+ }
69
+ /**
70
+ * City 内置表定义。
71
+ *
72
+ * 包含 studios 和 env 两个内置表。
73
+ * 适配器根据数据库类型(SQLite / Postgres)提供对应的表定义。
74
+ */
75
+ export interface BuiltinTables {
76
+ /** 产品表 */
77
+ studios: TableDef;
78
+ /** 环境变量表 */
79
+ env: TableDef;
80
+ }
81
+ /**
82
+ * 运行时能力接口。
83
+ *
84
+ * 这是 City 内部从 Drizzle db 组装出来的结构,不作为用户主要入口。
85
+ */
86
+ export interface Runtime {
87
+ /**
88
+ * 数据库实例(Drizzle Database 接口)。
89
+ *
90
+ * 用于 Service 的 CRUD 操作。
91
+ */
92
+ database: Database;
93
+ /**
94
+ * 底层数据库客户端(用于 DDL 执行)。
95
+ */
96
+ client: DbClient;
97
+ /**
98
+ * 环境变量提供者。
99
+ *
100
+ * 用于读取密钥、API key 等配置。
101
+ */
102
+ env: EnvProvider;
103
+ /**
104
+ * City 内置表定义(studios + env)。
105
+ *
106
+ * 适配器根据数据库类型提供正确的 Drizzle 表定义。
107
+ */
108
+ builtinTables: BuiltinTables;
109
+ /**
110
+ * 原始数据库实例(better-sqlite3 Database / D1Database 等)。
111
+ * 供 better-auth 等第三方库直接使用。
112
+ */
113
+ raw?: unknown;
114
+ /**
115
+ * 服务公网 URL(http://localhost:43127 或 https://xxx.workers.dev)。
116
+ * 用于 OAuth callback、邮件链接等。
117
+ */
118
+ baseURL?: string;
119
+ }
120
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAMnD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAErC;;;;;;OAMG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,IAAI,IAAI,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEzC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAMD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU;IACV,OAAO,EAAE,QAAQ,CAAC;IAClB,YAAY;IACZ,GAAG,EAAE,QAAQ,CAAC;CACf;AAMD;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,QAAQ,CAAC;IAEjB;;;;OAIG;IACH,GAAG,EAAE,WAAW,CAAC;IAEjB;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Runtime 能力接口模块。
3
+ *
4
+ * 定义 City 内部依赖的能力集合。用户侧只需要传入 Drizzle db,
5
+ * City 会从 db 组装这些能力。
6
+ *
7
+ * 使用示例:
8
+ * ```ts
9
+ * const city = new City({ db });
10
+ * ```
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * City 配置类型模块。
3
+ *
4
+ * 包含创建 City 实例和健康检查所需的所有类型定义。
5
+ */
6
+ import type { Runtime } from "./runtime.js";
7
+ import type { Database } from "../store/db.js";
8
+ /**
9
+ * City 健康检查结果。
10
+ */
11
+ export interface CityHealthStatus {
12
+ /** 当前 Runtime 是否已经完成初始化并可处理请求 */
13
+ ok: boolean;
14
+ /** 服务名称,用于外部探测确认命中的服务类型 */
15
+ name: string;
16
+ /** 健康检查响应时间 */
17
+ checked_at: string;
18
+ /** 当前注册的 service ID 列表 */
19
+ services: string[];
20
+ /** 当前启用的 service 信息列表 */
21
+ service_list: {
22
+ id: string;
23
+ name: string;
24
+ }[];
25
+ }
26
+ /**
27
+ * 创建 City 实例时传入的顶层配置。
28
+ *
29
+ * 默认只需要传入 Drizzle db。City 会自动初始化内置 env/studios 能力。
30
+ */
31
+ export interface CityOptions {
32
+ /**
33
+ * Drizzle database 对象。
34
+ *
35
+ * 支持 pg 与 sqlite 方言;D1 也属于 sqlite 方言。
36
+ */
37
+ db: Database & {
38
+ $client?: unknown;
39
+ };
40
+ /**
41
+ * 数据库方言。
42
+ *
43
+ * 默认会从 Drizzle db 自动推断;当自定义 db 无法推断时可以显式传入。
44
+ */
45
+ dialect?: "pg" | "sqlite";
46
+ /**
47
+ * 原始数据库实例。
48
+ *
49
+ * 某些服务需要把底层数据库传给第三方库时使用,例如 accounts 服务。
50
+ * 默认使用 db.$client。
51
+ */
52
+ raw?: unknown;
53
+ /**
54
+ * 内部运行时能力。
55
+ *
56
+ * 保留给测试和高级适配场景;普通用户不需要传入。
57
+ */
58
+ runtime?: Runtime;
59
+ }
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,EAAE,EAAE,QAAQ,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAErC;;;;OAIG;IACH,OAAO,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;IAE1B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * City 配置类型模块。
3
+ *
4
+ * 包含创建 City 实例和健康检查所需的所有类型定义。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/bin/index.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @downcity/city 公共入口。
3
+ */
4
+ export { City } from "./core/base/base.js";
5
+ export type { CityOptions, CityHealthStatus } from "./core/types.js";
6
+ export type { Runtime, EnvProvider, BuiltinTables, TableDef } from "./core/runtime.js";
7
+ export { Service } from "./service/service.js";
8
+ export { InstallableService } from "./service/installable-service.js";
9
+ export { Action } from "./service/action.js";
10
+ export type { Context, RouteAuth, EnvRequirement, } from "./service/service.js";
11
+ export type { ActionFn, HookFn, } from "./service/action.js";
12
+ export type { ServiceDefinition, ServiceInstallContext, ServiceRouteContext, } from "./service/installable-service.js";
13
+ export type { InstructionDefinition, InstructionContext, InstructionActionDefinition, InstructionCapable, } from "./service/instruction.js";
14
+ export { AIService } from "./service/ai/ai-service.js";
15
+ export { Provider } from "./service/ai/provider.js";
16
+ export { createOpenAICompatibleProvider } from "./service/ai/openai-compatible-provider.js";
17
+ export type { ModelConfig, ModelActions, PublicModel, } from "./service/ai/types.js";
18
+ export type { OpenAICompatibleClient, OpenAICompatibleClientConfig, OpenAICompatibleClientFactory, OpenAICompatibleProviderOptions, } from "./service/ai/openai-compatible-provider.js";
19
+ export { TokenSigner } from "./core/auth/token-signer.js";
20
+ export type { RuntimeUser, CreateUserTokenInput, UserTokenPayload, UserTokenIssueResult, } from "./core/auth/types.js";
21
+ export { EnvService } from "./service/env/env-service.js";
22
+ export type { EnvEntry, EnvUpsertInput, EnvRequirementStatus, EnvCatalogScope, } from "./service/env/types.js";
23
+ export { EnvStore } from "./service/env/env-store.js";
24
+ export { StudiosService } from "./service/studios/studios-service.js";
25
+ export type { Studio, StudioCreateInput, StudioStatus } from "./service/studios/types.js";
26
+ export type { Database, DbClient } from "./store/db.js";
27
+ export { executeDDL } from "./store/db.js";
28
+ export type { CityTableApi } from "./store/table-api.js";
29
+ export type { CityUserSchemaInput } from "./store/types.js";
30
+ export { sqliteStudios, pgStudios } from "./service/studios/schema.js";
31
+ export { sqliteEnv, pgEnv } from "./service/env/schema.js";
32
+ export { randomSecret, base64UrlEncode, base64UrlDecode, base64UrlEncodeBytes, base64UrlDecodeBytes, timingSafeEqualBytes, httpError, normalizeEnvKey, bearerToken, parseDotenvEntries, } from "./utils/helpers.js";
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMvF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,YAAY,EACV,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,QAAQ,EACR,MAAM,GACP,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AAE5F,YAAY,EACV,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AAMpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,YAAY,EACV,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1F,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAM5D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAM3D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}