@ketvietlab/ketjs 0.1.1

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 (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/agent/capabilities.d.ts +62 -0
  4. package/dist/agent/capabilities.d.ts.map +1 -0
  5. package/dist/agent/capabilities.js +89 -0
  6. package/dist/agent/capabilities.js.map +1 -0
  7. package/dist/agent/permissions.d.ts +56 -0
  8. package/dist/agent/permissions.d.ts.map +1 -0
  9. package/dist/agent/permissions.js +209 -0
  10. package/dist/agent/permissions.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +698 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/codegen/dts.d.ts +3 -0
  16. package/dist/codegen/dts.d.ts.map +1 -0
  17. package/dist/codegen/dts.js +94 -0
  18. package/dist/codegen/dts.js.map +1 -0
  19. package/dist/data/adapter.d.ts +4 -0
  20. package/dist/data/adapter.d.ts.map +1 -0
  21. package/dist/data/adapter.js +18 -0
  22. package/dist/data/adapter.js.map +1 -0
  23. package/dist/data/changeset.d.ts +49 -0
  24. package/dist/data/changeset.d.ts.map +1 -0
  25. package/dist/data/changeset.js +206 -0
  26. package/dist/data/changeset.js.map +1 -0
  27. package/dist/data/expr.d.ts +59 -0
  28. package/dist/data/expr.d.ts.map +1 -0
  29. package/dist/data/expr.js +61 -0
  30. package/dist/data/expr.js.map +1 -0
  31. package/dist/data/fleet.d.ts +28 -0
  32. package/dist/data/fleet.d.ts.map +1 -0
  33. package/dist/data/fleet.js +82 -0
  34. package/dist/data/fleet.js.map +1 -0
  35. package/dist/data/list-search.d.ts +93 -0
  36. package/dist/data/list-search.d.ts.map +1 -0
  37. package/dist/data/list-search.js +268 -0
  38. package/dist/data/list-search.js.map +1 -0
  39. package/dist/data/migrate.d.ts +75 -0
  40. package/dist/data/migrate.d.ts.map +1 -0
  41. package/dist/data/migrate.js +136 -0
  42. package/dist/data/migrate.js.map +1 -0
  43. package/dist/data/pool.d.ts +20 -0
  44. package/dist/data/pool.d.ts.map +1 -0
  45. package/dist/data/pool.js +92 -0
  46. package/dist/data/pool.js.map +1 -0
  47. package/dist/data/query.d.ts +111 -0
  48. package/dist/data/query.d.ts.map +1 -0
  49. package/dist/data/query.js +268 -0
  50. package/dist/data/query.js.map +1 -0
  51. package/dist/data/sqlite.d.ts +3 -0
  52. package/dist/data/sqlite.d.ts.map +1 -0
  53. package/dist/data/sqlite.js +107 -0
  54. package/dist/data/sqlite.js.map +1 -0
  55. package/dist/data/time.d.ts +9 -0
  56. package/dist/data/time.d.ts.map +1 -0
  57. package/dist/data/time.js +107 -0
  58. package/dist/data/time.js.map +1 -0
  59. package/dist/index.d.ts +79 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +51 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/kernel/apps.d.ts +43 -0
  64. package/dist/kernel/apps.d.ts.map +1 -0
  65. package/dist/kernel/apps.js +234 -0
  66. package/dist/kernel/apps.js.map +1 -0
  67. package/dist/kernel/compose.d.ts +6 -0
  68. package/dist/kernel/compose.d.ts.map +1 -0
  69. package/dist/kernel/compose.js +976 -0
  70. package/dist/kernel/compose.js.map +1 -0
  71. package/dist/kernel/define.d.ts +9 -0
  72. package/dist/kernel/define.d.ts.map +1 -0
  73. package/dist/kernel/define.js +140 -0
  74. package/dist/kernel/define.js.map +1 -0
  75. package/dist/kernel/diff.d.ts +11 -0
  76. package/dist/kernel/diff.d.ts.map +1 -0
  77. package/dist/kernel/diff.js +106 -0
  78. package/dist/kernel/diff.js.map +1 -0
  79. package/dist/kernel/errors.d.ts +17 -0
  80. package/dist/kernel/errors.d.ts.map +1 -0
  81. package/dist/kernel/errors.js +43 -0
  82. package/dist/kernel/errors.js.map +1 -0
  83. package/dist/kernel/graph.d.ts +3 -0
  84. package/dist/kernel/graph.d.ts.map +1 -0
  85. package/dist/kernel/graph.js +56 -0
  86. package/dist/kernel/graph.js.map +1 -0
  87. package/dist/kernel/i18n.d.ts +43 -0
  88. package/dist/kernel/i18n.d.ts.map +1 -0
  89. package/dist/kernel/i18n.js +79 -0
  90. package/dist/kernel/i18n.js.map +1 -0
  91. package/dist/kernel/index.d.ts +7 -0
  92. package/dist/kernel/index.d.ts.map +1 -0
  93. package/dist/kernel/index.js +7 -0
  94. package/dist/kernel/index.js.map +1 -0
  95. package/dist/kernel/layout.d.ts +17 -0
  96. package/dist/kernel/layout.d.ts.map +1 -0
  97. package/dist/kernel/layout.js +77 -0
  98. package/dist/kernel/layout.js.map +1 -0
  99. package/dist/kernel/menu.d.ts +27 -0
  100. package/dist/kernel/menu.d.ts.map +1 -0
  101. package/dist/kernel/menu.js +65 -0
  102. package/dist/kernel/menu.js.map +1 -0
  103. package/dist/kernel/modules.d.ts +31 -0
  104. package/dist/kernel/modules.d.ts.map +1 -0
  105. package/dist/kernel/modules.js +322 -0
  106. package/dist/kernel/modules.js.map +1 -0
  107. package/dist/kernel/routes.d.ts +24 -0
  108. package/dist/kernel/routes.d.ts.map +1 -0
  109. package/dist/kernel/routes.js +98 -0
  110. package/dist/kernel/routes.js.map +1 -0
  111. package/dist/kernel/types.d.ts +8 -0
  112. package/dist/kernel/types.d.ts.map +1 -0
  113. package/dist/kernel/types.js +67 -0
  114. package/dist/kernel/types.js.map +1 -0
  115. package/dist/kernel/workspace.d.ts +62 -0
  116. package/dist/kernel/workspace.d.ts.map +1 -0
  117. package/dist/kernel/workspace.js +156 -0
  118. package/dist/kernel/workspace.js.map +1 -0
  119. package/dist/scaffold/index.d.ts +2 -0
  120. package/dist/scaffold/index.d.ts.map +1 -0
  121. package/dist/scaffold/index.js +49 -0
  122. package/dist/scaffold/index.js.map +1 -0
  123. package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
  124. package/dist/scaffold/templates/biome.json.tmpl +30 -0
  125. package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
  126. package/dist/scaffold/templates/gitignore.tmpl +24 -0
  127. package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
  128. package/dist/scaffold/templates/module.ts.tmpl +27 -0
  129. package/dist/scaffold/templates/package.json.tmpl +25 -0
  130. package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
  131. package/dist/server/boot.d.ts +173 -0
  132. package/dist/server/boot.d.ts.map +1 -0
  133. package/dist/server/boot.js +659 -0
  134. package/dist/server/boot.js.map +1 -0
  135. package/dist/server/config.d.ts +48 -0
  136. package/dist/server/config.d.ts.map +1 -0
  137. package/dist/server/config.js +82 -0
  138. package/dist/server/config.js.map +1 -0
  139. package/dist/server/ctx.d.ts +13 -0
  140. package/dist/server/ctx.d.ts.map +1 -0
  141. package/dist/server/ctx.js +496 -0
  142. package/dist/server/ctx.js.map +1 -0
  143. package/dist/server/fn.d.ts +34 -0
  144. package/dist/server/fn.d.ts.map +1 -0
  145. package/dist/server/fn.js +170 -0
  146. package/dist/server/fn.js.map +1 -0
  147. package/dist/server/http.d.ts +79 -0
  148. package/dist/server/http.d.ts.map +1 -0
  149. package/dist/server/http.js +459 -0
  150. package/dist/server/http.js.map +1 -0
  151. package/dist/server/idem.d.ts +31 -0
  152. package/dist/server/idem.d.ts.map +1 -0
  153. package/dist/server/idem.js +68 -0
  154. package/dist/server/idem.js.map +1 -0
  155. package/dist/server/jobs.d.ts +5 -0
  156. package/dist/server/jobs.d.ts.map +1 -0
  157. package/dist/server/jobs.js +24 -0
  158. package/dist/server/jobs.js.map +1 -0
  159. package/dist/server/multipart.d.ts +18 -0
  160. package/dist/server/multipart.d.ts.map +1 -0
  161. package/dist/server/multipart.js +183 -0
  162. package/dist/server/multipart.js.map +1 -0
  163. package/dist/server/project.d.ts +9 -0
  164. package/dist/server/project.d.ts.map +1 -0
  165. package/dist/server/project.js +67 -0
  166. package/dist/server/project.js.map +1 -0
  167. package/dist/server/queue.d.ts +80 -0
  168. package/dist/server/queue.d.ts.map +1 -0
  169. package/dist/server/queue.js +494 -0
  170. package/dist/server/queue.js.map +1 -0
  171. package/dist/server/respond.d.ts +91 -0
  172. package/dist/server/respond.d.ts.map +1 -0
  173. package/dist/server/respond.js +99 -0
  174. package/dist/server/respond.js.map +1 -0
  175. package/dist/server/runtime.d.ts +14 -0
  176. package/dist/server/runtime.d.ts.map +1 -0
  177. package/dist/server/runtime.js +25 -0
  178. package/dist/server/runtime.js.map +1 -0
  179. package/dist/server/session.d.ts +55 -0
  180. package/dist/server/session.d.ts.map +1 -0
  181. package/dist/server/session.js +172 -0
  182. package/dist/server/session.js.map +1 -0
  183. package/dist/server/sessionstore.d.ts +54 -0
  184. package/dist/server/sessionstore.d.ts.map +1 -0
  185. package/dist/server/sessionstore.js +232 -0
  186. package/dist/server/sessionstore.js.map +1 -0
  187. package/dist/server/storage/index.d.ts +11 -0
  188. package/dist/server/storage/index.d.ts.map +1 -0
  189. package/dist/server/storage/index.js +31 -0
  190. package/dist/server/storage/index.js.map +1 -0
  191. package/dist/server/storage/local.d.ts +5 -0
  192. package/dist/server/storage/local.d.ts.map +1 -0
  193. package/dist/server/storage/local.js +165 -0
  194. package/dist/server/storage/local.js.map +1 -0
  195. package/dist/server/storage/s3.d.ts +11 -0
  196. package/dist/server/storage/s3.d.ts.map +1 -0
  197. package/dist/server/storage/s3.js +133 -0
  198. package/dist/server/storage/s3.js.map +1 -0
  199. package/dist/server/storage/sigv4.d.ts +23 -0
  200. package/dist/server/storage/sigv4.d.ts.map +1 -0
  201. package/dist/server/storage/sigv4.js +79 -0
  202. package/dist/server/storage/sigv4.js.map +1 -0
  203. package/dist/server/storage/types.d.ts +37 -0
  204. package/dist/server/storage/types.d.ts.map +1 -0
  205. package/dist/server/storage/types.js +82 -0
  206. package/dist/server/storage/types.js.map +1 -0
  207. package/dist/server/stream.d.ts +43 -0
  208. package/dist/server/stream.d.ts.map +1 -0
  209. package/dist/server/stream.js +117 -0
  210. package/dist/server/stream.js.map +1 -0
  211. package/dist/server/streamstore.d.ts +29 -0
  212. package/dist/server/streamstore.d.ts.map +1 -0
  213. package/dist/server/streamstore.js +140 -0
  214. package/dist/server/streamstore.js.map +1 -0
  215. package/dist/server/tenants.d.ts +108 -0
  216. package/dist/server/tenants.d.ts.map +1 -0
  217. package/dist/server/tenants.js +172 -0
  218. package/dist/server/tenants.js.map +1 -0
  219. package/dist/server/transport/index.d.ts +5 -0
  220. package/dist/server/transport/index.d.ts.map +1 -0
  221. package/dist/server/transport/index.js +3 -0
  222. package/dist/server/transport/index.js.map +1 -0
  223. package/dist/server/transport/memory.d.ts +14 -0
  224. package/dist/server/transport/memory.d.ts.map +1 -0
  225. package/dist/server/transport/memory.js +36 -0
  226. package/dist/server/transport/memory.js.map +1 -0
  227. package/dist/server/transport/types.d.ts +44 -0
  228. package/dist/server/transport/types.d.ts.map +1 -0
  229. package/dist/server/transport/types.js +79 -0
  230. package/dist/server/transport/types.js.map +1 -0
  231. package/dist/server/worker.d.ts +33 -0
  232. package/dist/server/worker.d.ts.map +1 -0
  233. package/dist/server/worker.js +428 -0
  234. package/dist/server/worker.js.map +1 -0
  235. package/dist/testing.d.ts +146 -0
  236. package/dist/testing.d.ts.map +1 -0
  237. package/dist/testing.js +406 -0
  238. package/dist/testing.js.map +1 -0
  239. package/dist/theme/contracts.d.ts +4 -0
  240. package/dist/theme/contracts.d.ts.map +1 -0
  241. package/dist/theme/contracts.js +87 -0
  242. package/dist/theme/contracts.js.map +1 -0
  243. package/dist/theme/index.d.ts +8 -0
  244. package/dist/theme/index.d.ts.map +1 -0
  245. package/dist/theme/index.js +7 -0
  246. package/dist/theme/index.js.map +1 -0
  247. package/dist/theme/joints.d.ts +19 -0
  248. package/dist/theme/joints.d.ts.map +1 -0
  249. package/dist/theme/joints.js +126 -0
  250. package/dist/theme/joints.js.map +1 -0
  251. package/dist/theme/ktl/compile.d.ts +26 -0
  252. package/dist/theme/ktl/compile.d.ts.map +1 -0
  253. package/dist/theme/ktl/compile.js +226 -0
  254. package/dist/theme/ktl/compile.js.map +1 -0
  255. package/dist/theme/ktl/lexer.d.ts +20 -0
  256. package/dist/theme/ktl/lexer.d.ts.map +1 -0
  257. package/dist/theme/ktl/lexer.js +56 -0
  258. package/dist/theme/ktl/lexer.js.map +1 -0
  259. package/dist/theme/ktl/parser.d.ts +64 -0
  260. package/dist/theme/ktl/parser.d.ts.map +1 -0
  261. package/dist/theme/ktl/parser.js +220 -0
  262. package/dist/theme/ktl/parser.js.map +1 -0
  263. package/dist/theme/render.d.ts +19 -0
  264. package/dist/theme/render.d.ts.map +1 -0
  265. package/dist/theme/render.js +246 -0
  266. package/dist/theme/render.js.map +1 -0
  267. package/dist/theme/templates.d.ts +2 -0
  268. package/dist/theme/templates.d.ts.map +1 -0
  269. package/dist/theme/templates.js +40 -0
  270. package/dist/theme/templates.js.map +1 -0
  271. package/dist/theme/tokens.d.ts +4 -0
  272. package/dist/theme/tokens.d.ts.map +1 -0
  273. package/dist/theme/tokens.js +15 -0
  274. package/dist/theme/tokens.js.map +1 -0
  275. package/dist/theme/viewmodel.d.ts +6 -0
  276. package/dist/theme/viewmodel.d.ts.map +1 -0
  277. package/dist/theme/viewmodel.js +40 -0
  278. package/dist/theme/viewmodel.js.map +1 -0
  279. package/dist/types.d.ts +614 -0
  280. package/dist/types.d.ts.map +1 -0
  281. package/dist/types.js +3 -0
  282. package/dist/types.js.map +1 -0
  283. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ketviet
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # KetJS
2
+
3
+ KetJS is a module-composable, SSR-first full-stack framework for Node.js. It provides models,
4
+ migrations, typed functions, jobs, themes, fragment navigation, and persistent islands without a
5
+ required application-server dependency.
6
+
7
+ > KetJS 0.x is preview software. APIs and deployment contracts may change before 1.0.
8
+
9
+ ## Requirements
10
+
11
+ - Node.js 24 or newer
12
+ - npm
13
+
14
+ ## Create an application
15
+
16
+ ```bash
17
+ npx --package @ketvietlab/ketjs ket new notes
18
+ cd notes
19
+ npm install
20
+ npm run dev
21
+ ```
22
+
23
+ The generated project uses SQLite by default, contains a real module and integration test, and runs
24
+ at `http://127.0.0.1:3000`.
25
+
26
+ ## Install in an existing project
27
+
28
+ ```bash
29
+ npm install @ketvietlab/ketjs
30
+ ```
31
+
32
+ ```ts
33
+ import { defineApp, defineModule, defineWorkspace } from '@ketvietlab/ketjs'
34
+ ```
35
+
36
+ Documentation and source: [github.com/ketvietlab/ketjs](https://github.com/ketvietlab/ketjs)
@@ -0,0 +1,62 @@
1
+ import type { Manifest } from '../types.ts';
2
+ export type AgentTool = {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: 'object';
7
+ properties: Record<string, {
8
+ type: string;
9
+ format?: string;
10
+ description?: string;
11
+ }>;
12
+ required: string[];
13
+ };
14
+ effects: string[];
15
+ idempotent: boolean;
16
+ dryRunnable: boolean;
17
+ mutates: boolean;
18
+ /** Reads past the company boundary. Rare, and worth an agent knowing about. */
19
+ crossCompany: boolean;
20
+ };
21
+ export declare function agentTools(manifest: Manifest): AgentTool[];
22
+ export type CompositionSchema = {
23
+ /** What a page may be composed of, and what each part accepts. */
24
+ sections: Record<string, {
25
+ by: string;
26
+ title: string;
27
+ settings: Record<string, string>;
28
+ }>;
29
+ regions: Record<string, {
30
+ providedBy: string[];
31
+ }>;
32
+ joints: Record<string, {
33
+ owner: string;
34
+ props: Record<string, string>;
35
+ filledBy: string[];
36
+ }>;
37
+ tokens: string[];
38
+ contentTypes: Manifest['contentTypes'];
39
+ taxonomies: Manifest['taxonomies'];
40
+ };
41
+ export declare function compositionSchema(manifest: Manifest): CompositionSchema;
42
+ export declare function agentDescriptor(manifest: Manifest): {
43
+ ket: string;
44
+ modules: Record<string, {
45
+ version: string;
46
+ kind: string;
47
+ depends: string[];
48
+ install: import("../types.ts").InstallPolicy;
49
+ removable: boolean;
50
+ } & import("../types.ts").AppMeta>;
51
+ tools: AgentTool[];
52
+ composition: CompositionSchema;
53
+ models: {
54
+ [k: string]: {
55
+ [k: string]: string;
56
+ };
57
+ };
58
+ views: Record<string, import("../types.ts").ViewDef & {
59
+ by: string;
60
+ }>;
61
+ };
62
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/agent/capabilities.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACnF,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,+EAA+E;IAC/E,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAcD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,CA8B1D;AAGD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IACzF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC5F,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;CACnC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAuBvE;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ;IAE9C,GAAG;IACH,OAAO;;;;;;;IACP,KAAK;IACL,WAAW;IACX,MAAM;;;;;IAQN,KAAK;;;EAER"}
@@ -0,0 +1,89 @@
1
+ // The agent surface.
2
+ //
3
+ // Two things make an agent trustworthy against a real database: it writes through
4
+ // a declared, schema-checked surface rather than by editing code, and every
5
+ // mutation can be dry-run before it commits. Both fall out of the manifest, so
6
+ // there is no second definition to keep in sync.
7
+ const JSON_TYPE = {
8
+ id: 'string',
9
+ text: 'string',
10
+ ref: 'string',
11
+ int: 'integer',
12
+ float: 'number',
13
+ bool: 'boolean',
14
+ date: 'string',
15
+ datetime: 'string',
16
+ json: 'object',
17
+ };
18
+ export function agentTools(manifest) {
19
+ const tools = [];
20
+ for (const [key, fn] of Object.entries(manifest.functions)) {
21
+ if (!fn.agent || fn.exposure === 'internal')
22
+ continue;
23
+ const properties = {};
24
+ const required = [];
25
+ for (const [name, spec] of Object.entries(fn.input)) {
26
+ const optional = spec.endsWith('?');
27
+ const base = optional ? spec.slice(0, -1) : spec;
28
+ properties[name] = {
29
+ type: JSON_TYPE[base.startsWith('ref:') ? 'ref' : base] ?? 'string',
30
+ ...(base === 'date' || base === 'datetime' ? { format: base === 'date' ? 'date' : 'date-time' } : {}),
31
+ };
32
+ if (!optional)
33
+ required.push(name);
34
+ }
35
+ const mutates = fn.effects.some((e) => e.startsWith('write:') || e.startsWith('enqueue:'));
36
+ tools.push({
37
+ name: key.replace('.', '__'),
38
+ description: `${key} — declared effects: ${fn.effects.join(', ') || 'none'}` +
39
+ (fn.crossCompany ? ' · reads across companies' : ''),
40
+ inputSchema: { type: 'object', properties, required },
41
+ effects: fn.effects,
42
+ idempotent: fn.idempotent,
43
+ dryRunnable: fn.dryRun,
44
+ mutates,
45
+ crossCompany: fn.crossCompany,
46
+ });
47
+ }
48
+ return tools;
49
+ }
50
+ export function compositionSchema(manifest) {
51
+ const joints = {};
52
+ for (const [key, j] of Object.entries(manifest.joints)) {
53
+ joints[key] = {
54
+ owner: j.owner,
55
+ props: j.props,
56
+ filledBy: manifest.fills.filter((f) => f.joint === key).map((f) => f.by),
57
+ };
58
+ }
59
+ const sections = {};
60
+ for (const [name, s] of Object.entries(manifest.sections)) {
61
+ sections[name] = { by: s.by, title: s.title ?? name, settings: s.settings ?? {} };
62
+ }
63
+ const regions = {};
64
+ for (const [name, by] of Object.entries(manifest.regions.provided))
65
+ regions[name] = { providedBy: by };
66
+ return {
67
+ sections,
68
+ regions,
69
+ joints,
70
+ tokens: Object.keys(manifest.tokens),
71
+ contentTypes: manifest.contentTypes,
72
+ taxonomies: manifest.taxonomies,
73
+ };
74
+ }
75
+ // What an agent is allowed to read to orient itself, in one call.
76
+ export function agentDescriptor(manifest) {
77
+ return {
78
+ ket: manifest.ket,
79
+ modules: manifest.modules,
80
+ tools: agentTools(manifest),
81
+ composition: compositionSchema(manifest),
82
+ models: Object.fromEntries(Object.entries(manifest.models).map(([k, m]) => [
83
+ k,
84
+ Object.fromEntries(Object.entries(m.fields).map(([f, d]) => [f, `${d.base}${d.optional ? '?' : ''} (by ${d.by})`])),
85
+ ])),
86
+ views: manifest.views,
87
+ };
88
+ }
89
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/agent/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { Manifest } from '../types.ts';
2
+ export type GrantedFn = {
3
+ key: string;
4
+ by: string;
5
+ effects: string[];
6
+ reads: string[];
7
+ writes: string[];
8
+ enqueues: string[];
9
+ crossCompany: boolean;
10
+ mutates: boolean;
11
+ /**
12
+ * Whether the function declares the shape it returns. Undeclared means the reach
13
+ * is known at model level but not at field level: the rows come back whole, so a
14
+ * role that may see an order's product name may also see its cost.
15
+ */
16
+ projected: boolean;
17
+ /** The fields it hands back, when it says. Empty means it says nothing. */
18
+ returns: string[];
19
+ };
20
+ export type ModelReach = {
21
+ model: string;
22
+ read: boolean;
23
+ write: boolean;
24
+ /** The functions that grant it, so a surprise can be traced to its cause. */
25
+ via: string[];
26
+ /** Fields a theme may read of this model, if any module declared a view. */
27
+ viewFields: string[] | null;
28
+ };
29
+ export type Reach = {
30
+ functions: GrantedFn[];
31
+ models: ModelReach[];
32
+ /** Reads that cross legal entities. Rare and worth seeing on its own. */
33
+ crossCompany: string[];
34
+ /** Functions whose field-level reach cannot be stated, because output is undeclared. */
35
+ unprojected: string[];
36
+ unknown: string[];
37
+ };
38
+ export declare function reachOf(manifest: Manifest, functions: string[]): Reach;
39
+ /** Every function a module owns — what granting the whole module would mean. */
40
+ export declare function functionsOf(manifest: Manifest, module: string): string[];
41
+ export declare function formatReach(r: Reach): string;
42
+ /** The whole surface, grouped by module: what exists to be granted at all. */
43
+ export declare function formatInventory(manifest: Manifest): string;
44
+ /**
45
+ * The function keys a role grants, read from the database.
46
+ *
47
+ * The only part of this file that touches one. A role is data — what it grants is
48
+ * a fact about a deployment, not about the code — so answering "what can the
49
+ * warehouse role do here" has to look at the same rows the server enforces from.
50
+ *
51
+ * The table name is a convention rather than an import: the framework does not
52
+ * ship a role model, because roles are the app's to shape. If an app names them
53
+ * differently this command has nothing to read, and says so.
54
+ */
55
+ export declare function grantsOfRole(adapter: import('../types.ts').Adapter, role: string): Promise<string[]>;
56
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/agent/permissions.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,6EAA6E;IAC7E,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,4EAA4E;IAC5E,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,SAAS,EAAE,CAAA;IACtB,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,yEAAyE;IACzE,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,wFAAwF;IACxF,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAmBD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,CA0DtE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAYxE;AAID,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAmC5C;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA2B1D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8B1G"}
@@ -0,0 +1,209 @@
1
+ // What a role can actually reach.
2
+ //
3
+ // This exists because the question "can this user see products?" has no answer in
4
+ // most systems until you read every module. Here it does have one, and it is
5
+ // arithmetic rather than investigation: a function cannot touch a model it did not
6
+ // declare — not through a relation, not by calling another function, because there
7
+ // is no way to call one — so the reach of a set of functions is the union of their
8
+ // declared effects. Nothing to traverse.
9
+ //
10
+ // It is a report before it is a mechanism on purpose. Deciding how roles should be
11
+ // shaped is easier while looking at what the current functions already imply.
12
+ import { KetError } from '../kernel/errors.js';
13
+ const splitEffect = (e) => {
14
+ const at = e.indexOf(':');
15
+ return at === -1 ? ['', e] : [e.slice(0, at), e.slice(at + 1)];
16
+ };
17
+ /** Every field any module exposes to a theme for this model, if any does. */
18
+ const viewFieldsOf = (manifest, model) => {
19
+ const fields = new Set();
20
+ let any = false;
21
+ for (const v of Object.values(manifest.views)) {
22
+ if (v.of !== model)
23
+ continue;
24
+ any = true;
25
+ for (const f of v.fields)
26
+ fields.add(f);
27
+ }
28
+ return any ? [...fields].sort() : null;
29
+ };
30
+ export function reachOf(manifest, functions) {
31
+ const granted = [];
32
+ const unknown = [];
33
+ const models = new Map();
34
+ for (const key of functions) {
35
+ const fn = manifest.functions[key];
36
+ if (!fn) {
37
+ unknown.push(key);
38
+ continue;
39
+ }
40
+ const reads = [];
41
+ const writes = [];
42
+ const enqueues = [];
43
+ for (const e of fn.effects) {
44
+ const [verb, model] = splitEffect(e);
45
+ if (verb === 'enqueue') {
46
+ enqueues.push(model);
47
+ continue;
48
+ }
49
+ const slot = models.get(model) ?? {
50
+ model,
51
+ read: false,
52
+ write: false,
53
+ via: [],
54
+ viewFields: viewFieldsOf(manifest, model),
55
+ };
56
+ if (verb === 'read') {
57
+ slot.read = true;
58
+ reads.push(model);
59
+ }
60
+ else {
61
+ slot.write = true;
62
+ writes.push(model);
63
+ }
64
+ if (!slot.via.includes(key))
65
+ slot.via.push(key);
66
+ models.set(model, slot);
67
+ }
68
+ granted.push({
69
+ key,
70
+ by: fn.by,
71
+ effects: [...fn.effects],
72
+ reads: [...new Set(reads)].sort(),
73
+ writes: [...new Set(writes)].sort(),
74
+ enqueues: [...new Set(enqueues)].sort(),
75
+ crossCompany: fn.crossCompany,
76
+ mutates: writes.length > 0 || enqueues.length > 0,
77
+ projected: Object.keys(fn.output).length > 0,
78
+ returns: Object.keys(fn.output).sort(),
79
+ });
80
+ }
81
+ return {
82
+ functions: granted.sort((a, b) => a.key.localeCompare(b.key)),
83
+ models: [...models.values()].sort((a, b) => a.model.localeCompare(b.model)),
84
+ crossCompany: granted.filter((f) => f.crossCompany).map((f) => f.key),
85
+ unprojected: granted.filter((f) => !f.projected).map((f) => f.key),
86
+ unknown,
87
+ };
88
+ }
89
+ /** Every function a module owns — what granting the whole module would mean. */
90
+ export function functionsOf(manifest, module) {
91
+ const keys = Object.entries(manifest.functions)
92
+ .filter(([, f]) => f.by === module)
93
+ .map(([k]) => k);
94
+ if (!keys.length && !manifest.modules[module]) {
95
+ throw new KetError({
96
+ code: 'E_UNKNOWN_MODULE',
97
+ message: `no module "${module}"`,
98
+ hint: `installed: ${Object.keys(manifest.modules).sort().join(', ')}`,
99
+ });
100
+ }
101
+ return keys.sort();
102
+ }
103
+ const pad = (s, n) => s.padEnd(n);
104
+ export function formatReach(r) {
105
+ const out = [];
106
+ if (r.unknown.length)
107
+ out.push(`unknown functions: ${r.unknown.join(', ')}\n`);
108
+ const w = Math.max(20, ...r.functions.map((f) => f.key.length));
109
+ out.push('functions granted:');
110
+ for (const f of r.functions) {
111
+ const marks = [f.mutates ? 'writes' : 'reads', ...(f.crossCompany ? ['cross-company'] : [])];
112
+ out.push(` ${pad(f.key, w)} ${marks.join(' · ')}`);
113
+ // The field-level answer, which is the one that was missing: what a caller
114
+ // actually receives, rather than which tables were touched to build it.
115
+ out.push(` ${pad('', w)} returns ${f.projected ? f.returns.join(', ') : 'WHOLE ROWS — output undeclared'}`);
116
+ }
117
+ out.push('\nmodels reachable:');
118
+ const mw = Math.max(20, ...r.models.map((m) => m.model.length));
119
+ for (const m of r.models) {
120
+ const access = [m.read ? 'read' : null, m.write ? 'write' : null].filter(Boolean).join('+');
121
+ out.push(` ${pad(m.model, mw)} ${pad(access, 10)} via ${m.via.join(', ')}`);
122
+ }
123
+ if (!r.models.length)
124
+ out.push(' (none)');
125
+ if (r.crossCompany.length) {
126
+ out.push('\nreads across legal entities:');
127
+ for (const k of r.crossCompany)
128
+ out.push(` ${k}`);
129
+ }
130
+ if (r.unprojected.length) {
131
+ out.push('\nfield-level reach not stated — these return whole rows:');
132
+ for (const k of r.unprojected)
133
+ out.push(` ${k}`);
134
+ out.push(' (declare `output` to say what a caller actually receives)');
135
+ }
136
+ return out.join('\n');
137
+ }
138
+ /** The whole surface, grouped by module: what exists to be granted at all. */
139
+ export function formatInventory(manifest) {
140
+ const byModule = new Map();
141
+ for (const [key, fn] of Object.entries(manifest.functions)) {
142
+ const list = byModule.get(fn.by) ?? [];
143
+ list.push(key);
144
+ byModule.set(fn.by, list);
145
+ }
146
+ const out = [];
147
+ let total = 0;
148
+ let unprojected = 0;
149
+ for (const [module, keys] of [...byModule].sort()) {
150
+ out.push(`${module}:`);
151
+ const w = Math.max(...keys.map((k) => k.length));
152
+ for (const key of keys.sort()) {
153
+ const fn = manifest.functions[key];
154
+ total++;
155
+ if (!Object.keys(fn.output).length)
156
+ unprojected++;
157
+ const marks = [
158
+ fn.effects.length ? fn.effects.join(' ') : 'no effects',
159
+ ...(fn.crossCompany ? ['cross-company'] : []),
160
+ ...(Object.keys(fn.output).length ? [] : ['unprojected']),
161
+ ];
162
+ out.push(` ${pad(key, w)} ${marks.join(' · ')}`);
163
+ }
164
+ }
165
+ out.push(`\n${total} function(s); ${unprojected} return an undeclared shape`);
166
+ return out.join('\n');
167
+ }
168
+ /**
169
+ * The function keys a role grants, read from the database.
170
+ *
171
+ * The only part of this file that touches one. A role is data — what it grants is
172
+ * a fact about a deployment, not about the code — so answering "what can the
173
+ * warehouse role do here" has to look at the same rows the server enforces from.
174
+ *
175
+ * The table name is a convention rather than an import: the framework does not
176
+ * ship a role model, because roles are the app's to shape. If an app names them
177
+ * differently this command has nothing to read, and says so.
178
+ */
179
+ export async function grantsOfRole(adapter, role) {
180
+ const pg = adapter.name === 'postgres';
181
+ const p = (n) => (pg ? `$${n}` : '?');
182
+ const q = (s) => adapter.quoteIdent(s);
183
+ try {
184
+ const roles = await adapter.all(`SELECT id FROM user_role WHERE ${q('name')} = ${p(1)} OR id = ${p(2)}`, [
185
+ role,
186
+ role,
187
+ ]);
188
+ if (!roles.length) {
189
+ throw new KetError({
190
+ code: 'E_UNKNOWN_ROLE',
191
+ message: `no role named "${role}" in this database`,
192
+ hint: 'roles are rows, so this reads what is actually there — check the name, or the datastore',
193
+ });
194
+ }
195
+ const ids = roles.map((r) => String(r.id));
196
+ const rows = await adapter.all(`SELECT ${q('fnKey')} FROM user_grant WHERE ${q('roleId')} IN (${ids.map((_, i) => p(i + 1)).join(', ')})`, ids);
197
+ return [...new Set(rows.map((r) => String(r.fnKey)))].sort();
198
+ }
199
+ catch (e) {
200
+ if (e instanceof KetError)
201
+ throw e;
202
+ throw new KetError({
203
+ code: 'E_NO_ROLE_TABLE',
204
+ message: `this database has no role tables to read`,
205
+ hint: 'roles are an app model, not a framework one — this command expects user_role and user_grant',
206
+ });
207
+ }
208
+ }
209
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/agent/permissions.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs/src/cli.ts"],"names":[],"mappings":""}