@agent-native/core 0.4.2 → 0.4.3

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 (254) hide show
  1. package/dist/agent/production-agent.d.ts.map +1 -1
  2. package/dist/agent/production-agent.js +9 -3
  3. package/dist/agent/production-agent.js.map +1 -1
  4. package/dist/agent/types.d.ts +2 -0
  5. package/dist/agent/types.d.ts.map +1 -1
  6. package/dist/application-state/emitter.d.ts +10 -0
  7. package/dist/application-state/emitter.d.ts.map +1 -0
  8. package/dist/application-state/emitter.js +18 -0
  9. package/dist/application-state/emitter.js.map +1 -0
  10. package/dist/application-state/handlers.d.ts +20 -0
  11. package/dist/application-state/handlers.d.ts.map +1 -0
  12. package/dist/application-state/handlers.js +94 -0
  13. package/dist/application-state/handlers.js.map +1 -0
  14. package/dist/application-state/index.d.ts +5 -0
  15. package/dist/application-state/index.d.ts.map +1 -0
  16. package/dist/application-state/index.js +9 -0
  17. package/dist/application-state/index.js.map +1 -0
  18. package/dist/application-state/script-helpers.d.ts +17 -0
  19. package/dist/application-state/script-helpers.d.ts.map +1 -0
  20. package/dist/application-state/script-helpers.js +28 -0
  21. package/dist/application-state/script-helpers.js.map +1 -0
  22. package/dist/application-state/store.d.ts +9 -0
  23. package/dist/application-state/store.d.ts.map +1 -0
  24. package/dist/application-state/store.js +93 -0
  25. package/dist/application-state/store.js.map +1 -0
  26. package/dist/cli/create.d.ts.map +1 -1
  27. package/dist/cli/create.js +38 -24
  28. package/dist/cli/create.js.map +1 -1
  29. package/dist/client/AgentPanel.d.ts +53 -0
  30. package/dist/client/AgentPanel.d.ts.map +1 -0
  31. package/dist/client/AgentPanel.js +70 -0
  32. package/dist/client/AgentPanel.js.map +1 -0
  33. package/dist/client/AssistantChat.d.ts +27 -0
  34. package/dist/client/AssistantChat.d.ts.map +1 -0
  35. package/dist/client/AssistantChat.js +165 -0
  36. package/dist/client/AssistantChat.js.map +1 -0
  37. package/dist/client/ErrorBoundary.d.ts +4 -0
  38. package/dist/client/ErrorBoundary.d.ts.map +1 -0
  39. package/dist/client/ErrorBoundary.js +22 -0
  40. package/dist/client/ErrorBoundary.js.map +1 -0
  41. package/dist/client/MultiTabAssistantChat.d.ts +4 -0
  42. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -0
  43. package/dist/client/MultiTabAssistantChat.js +125 -0
  44. package/dist/client/MultiTabAssistantChat.js.map +1 -0
  45. package/dist/client/ProductionAgentPanel.d.ts +3 -7
  46. package/dist/client/ProductionAgentPanel.d.ts.map +1 -1
  47. package/dist/client/ProductionAgentPanel.js +3 -118
  48. package/dist/client/ProductionAgentPanel.js.map +1 -1
  49. package/dist/client/agent-chat-adapter.d.ts +10 -0
  50. package/dist/client/agent-chat-adapter.d.ts.map +1 -0
  51. package/dist/client/agent-chat-adapter.js +235 -0
  52. package/dist/client/agent-chat-adapter.js.map +1 -0
  53. package/dist/client/agent-chat.d.ts +9 -1
  54. package/dist/client/agent-chat.d.ts.map +1 -1
  55. package/dist/client/agent-chat.js +11 -1
  56. package/dist/client/agent-chat.js.map +1 -1
  57. package/dist/client/index.d.ts +8 -2
  58. package/dist/client/index.d.ts.map +1 -1
  59. package/dist/client/index.js +9 -2
  60. package/dist/client/index.js.map +1 -1
  61. package/dist/client/terminal/AgentTerminal.d.ts +35 -0
  62. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -0
  63. package/dist/client/terminal/AgentTerminal.js +346 -0
  64. package/dist/client/terminal/AgentTerminal.js.map +1 -0
  65. package/dist/client/terminal/index.d.ts +7 -0
  66. package/dist/client/terminal/index.d.ts.map +1 -0
  67. package/dist/client/terminal/index.js +7 -0
  68. package/dist/client/terminal/index.js.map +1 -0
  69. package/dist/client/use-agent-chat.d.ts +1 -1
  70. package/dist/client/use-agent-chat.d.ts.map +1 -1
  71. package/dist/client/use-agent-chat.js +1 -1
  72. package/dist/client/use-agent-chat.js.map +1 -1
  73. package/dist/client/useProductionAgent.d.ts +6 -1
  74. package/dist/client/useProductionAgent.d.ts.map +1 -1
  75. package/dist/client/useProductionAgent.js +4 -2
  76. package/dist/client/useProductionAgent.js.map +1 -1
  77. package/dist/db/create-get-db.d.ts +3 -0
  78. package/dist/db/create-get-db.d.ts.map +1 -0
  79. package/dist/db/create-get-db.js +18 -0
  80. package/dist/db/create-get-db.js.map +1 -0
  81. package/dist/db/index.d.ts +2 -0
  82. package/dist/db/index.d.ts.map +1 -1
  83. package/dist/db/index.js +2 -0
  84. package/dist/db/index.js.map +1 -1
  85. package/dist/db/migrations.d.ts +7 -0
  86. package/dist/db/migrations.d.ts.map +1 -0
  87. package/dist/db/migrations.js +35 -0
  88. package/dist/db/migrations.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/oauth-tokens/index.d.ts +2 -0
  94. package/dist/oauth-tokens/index.d.ts.map +1 -0
  95. package/dist/oauth-tokens/index.js +2 -0
  96. package/dist/oauth-tokens/index.js.map +1 -0
  97. package/dist/oauth-tokens/store.d.ts +9 -0
  98. package/dist/oauth-tokens/store.d.ts.map +1 -0
  99. package/dist/oauth-tokens/store.js +90 -0
  100. package/dist/oauth-tokens/store.js.map +1 -0
  101. package/dist/scripts/db/exec.d.ts.map +1 -1
  102. package/dist/scripts/db/exec.js +31 -16
  103. package/dist/scripts/db/exec.js.map +1 -1
  104. package/dist/scripts/db/query.d.ts.map +1 -1
  105. package/dist/scripts/db/query.js +24 -8
  106. package/dist/scripts/db/query.js.map +1 -1
  107. package/dist/scripts/db/schema.d.ts.map +1 -1
  108. package/dist/scripts/db/schema.js +56 -28
  109. package/dist/scripts/db/schema.js.map +1 -1
  110. package/dist/scripts/dev/index.d.ts +15 -0
  111. package/dist/scripts/dev/index.d.ts.map +1 -0
  112. package/dist/scripts/dev/index.js +118 -0
  113. package/dist/scripts/dev/index.js.map +1 -0
  114. package/dist/scripts/dev/list-files.d.ts +5 -0
  115. package/dist/scripts/dev/list-files.d.ts.map +1 -0
  116. package/dist/scripts/dev/list-files.js +102 -0
  117. package/dist/scripts/dev/list-files.js.map +1 -0
  118. package/dist/scripts/dev/read-file.d.ts +5 -0
  119. package/dist/scripts/dev/read-file.d.ts.map +1 -0
  120. package/dist/scripts/dev/read-file.js +68 -0
  121. package/dist/scripts/dev/read-file.js.map +1 -0
  122. package/dist/scripts/dev/search-files.d.ts +5 -0
  123. package/dist/scripts/dev/search-files.d.ts.map +1 -0
  124. package/dist/scripts/dev/search-files.js +133 -0
  125. package/dist/scripts/dev/search-files.js.map +1 -0
  126. package/dist/scripts/dev/shell.d.ts +5 -0
  127. package/dist/scripts/dev/shell.d.ts.map +1 -0
  128. package/dist/scripts/dev/shell.js +65 -0
  129. package/dist/scripts/dev/shell.js.map +1 -0
  130. package/dist/scripts/dev/write-file.d.ts +5 -0
  131. package/dist/scripts/dev/write-file.d.ts.map +1 -0
  132. package/dist/scripts/dev/write-file.js +50 -0
  133. package/dist/scripts/dev/write-file.js.map +1 -0
  134. package/dist/scripts/index.d.ts +1 -0
  135. package/dist/scripts/index.d.ts.map +1 -1
  136. package/dist/scripts/index.js +1 -0
  137. package/dist/scripts/index.js.map +1 -1
  138. package/dist/server/agent-chat-plugin.d.ts +43 -0
  139. package/dist/server/agent-chat-plugin.d.ts.map +1 -0
  140. package/dist/server/agent-chat-plugin.js +92 -0
  141. package/dist/server/agent-chat-plugin.js.map +1 -0
  142. package/dist/server/auth-plugin.d.ts +6 -0
  143. package/dist/server/auth-plugin.d.ts.map +1 -0
  144. package/dist/server/auth-plugin.js +8 -0
  145. package/dist/server/auth-plugin.js.map +1 -0
  146. package/dist/server/auth.d.ts +18 -2
  147. package/dist/server/auth.d.ts.map +1 -1
  148. package/dist/server/auth.js +103 -46
  149. package/dist/server/auth.js.map +1 -1
  150. package/dist/server/create-server.d.ts +7 -0
  151. package/dist/server/create-server.d.ts.map +1 -1
  152. package/dist/server/create-server.js +7 -1
  153. package/dist/server/create-server.js.map +1 -1
  154. package/dist/server/default-watcher.d.ts +17 -0
  155. package/dist/server/default-watcher.d.ts.map +1 -0
  156. package/dist/server/default-watcher.js +37 -0
  157. package/dist/server/default-watcher.js.map +1 -0
  158. package/dist/server/file-sync-plugin.d.ts +7 -0
  159. package/dist/server/file-sync-plugin.d.ts.map +1 -0
  160. package/dist/server/file-sync-plugin.js +38 -0
  161. package/dist/server/file-sync-plugin.js.map +1 -0
  162. package/dist/server/google-auth-plugin.d.ts +22 -0
  163. package/dist/server/google-auth-plugin.d.ts.map +1 -0
  164. package/dist/server/google-auth-plugin.js +122 -0
  165. package/dist/server/google-auth-plugin.js.map +1 -0
  166. package/dist/server/index.d.ts +9 -2
  167. package/dist/server/index.d.ts.map +1 -1
  168. package/dist/server/index.js +9 -2
  169. package/dist/server/index.js.map +1 -1
  170. package/dist/server/sse.d.ts +9 -4
  171. package/dist/server/sse.d.ts.map +1 -1
  172. package/dist/server/sse.js +19 -12
  173. package/dist/server/sse.js.map +1 -1
  174. package/dist/settings/handlers.d.ts +9 -0
  175. package/dist/settings/handlers.d.ts.map +1 -0
  176. package/dist/settings/handlers.js +29 -0
  177. package/dist/settings/handlers.js.map +1 -0
  178. package/dist/settings/index.d.ts +5 -0
  179. package/dist/settings/index.d.ts.map +1 -0
  180. package/dist/settings/index.js +9 -0
  181. package/dist/settings/index.js.map +1 -0
  182. package/dist/settings/script-helpers.d.ts +9 -0
  183. package/dist/settings/script-helpers.d.ts.map +1 -0
  184. package/dist/settings/script-helpers.js +16 -0
  185. package/dist/settings/script-helpers.js.map +1 -0
  186. package/dist/settings/store.d.ts +7 -0
  187. package/dist/settings/store.d.ts.map +1 -0
  188. package/dist/settings/store.js +88 -0
  189. package/dist/settings/store.js.map +1 -0
  190. package/dist/settings/user-settings.d.ts +21 -0
  191. package/dist/settings/user-settings.d.ts.map +1 -0
  192. package/dist/settings/user-settings.js +35 -0
  193. package/dist/settings/user-settings.js.map +1 -0
  194. package/dist/tailwind.preset.js +1 -1
  195. package/dist/tailwind.preset.js.map +1 -1
  196. package/dist/terminal/cli-registry.d.ts +16 -0
  197. package/dist/terminal/cli-registry.d.ts.map +1 -0
  198. package/dist/terminal/cli-registry.js +42 -0
  199. package/dist/terminal/cli-registry.js.map +1 -0
  200. package/dist/terminal/index.d.ts +9 -0
  201. package/dist/terminal/index.d.ts.map +1 -0
  202. package/dist/terminal/index.js +9 -0
  203. package/dist/terminal/index.js.map +1 -0
  204. package/dist/terminal/pty-server.d.ts +31 -0
  205. package/dist/terminal/pty-server.d.ts.map +1 -0
  206. package/dist/terminal/pty-server.js +252 -0
  207. package/dist/terminal/pty-server.js.map +1 -0
  208. package/dist/terminal/terminal-plugin.d.ts +23 -0
  209. package/dist/terminal/terminal-plugin.d.ts.map +1 -0
  210. package/dist/terminal/terminal-plugin.js +90 -0
  211. package/dist/terminal/terminal-plugin.js.map +1 -0
  212. package/dist/vite/client.d.ts.map +1 -1
  213. package/dist/vite/client.js +19 -1
  214. package/dist/vite/client.js.map +1 -1
  215. package/dist/vite/dev-api-server.d.ts.map +1 -1
  216. package/dist/vite/dev-api-server.js +12 -0
  217. package/dist/vite/dev-api-server.js.map +1 -1
  218. package/package.json +50 -4
  219. package/src/templates/default/.agents/skills/create-skill/SKILL.md +1 -1
  220. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +3 -3
  221. package/src/templates/default/.agents/skills/files-as-database/SKILL.md +82 -63
  222. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +2 -2
  223. package/src/templates/default/.agents/skills/scripts/SKILL.md +20 -17
  224. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +2 -2
  225. package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +49 -64
  226. package/src/templates/default/.ignore +0 -0
  227. package/src/templates/default/AGENTS.md +30 -55
  228. package/src/templates/default/app/global.css +95 -0
  229. package/src/templates/default/{client → app}/root.tsx +22 -9
  230. package/src/templates/default/app/routes/_index.tsx +62 -0
  231. package/src/templates/default/application-state/.gitkeep +0 -0
  232. package/src/templates/default/components.json +1 -1
  233. package/src/templates/default/data/sync-config.json +1 -0
  234. package/src/templates/default/package.json +2 -1
  235. package/src/templates/default/react-router.config.ts +1 -1
  236. package/src/templates/default/scripts/run.ts +1 -8
  237. package/src/templates/default/server/plugins/agent-chat.ts +1 -0
  238. package/src/templates/default/server/plugins/auth.ts +1 -5
  239. package/src/templates/default/server/plugins/file-sync.ts +1 -39
  240. package/src/templates/default/server/plugins/terminal.ts +1 -0
  241. package/src/templates/default/server/routes/api/events.get.ts +2 -6
  242. package/src/templates/default/server/routes/api/file-sync/status.get.ts +2 -11
  243. package/src/templates/default/tailwind.config.ts +1 -1
  244. package/src/templates/default/tsconfig.json +1 -1
  245. package/tsconfig.base.json +2 -2
  246. package/src/templates/default/client/App.tsx +0 -56
  247. package/src/templates/default/client/global.css +0 -75
  248. package/src/templates/default/client/routes/_index.tsx +0 -19
  249. package/src/templates/default/server/lib/watcher.ts +0 -21
  250. /package/src/templates/default/{client → app}/entry.client.tsx +0 -0
  251. /package/src/templates/default/{client → app}/entry.server.tsx +0 -0
  252. /package/src/templates/default/{client → app}/lib/utils.ts +0 -0
  253. /package/src/templates/default/{client → app}/routes.ts +0 -0
  254. /package/src/templates/default/{client → app}/vite-env.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"dev-api-server.js","sourceRoot":"","sources":["../../src/vite/dev-api-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-api-server.js","sourceRoot":"","sources":["../../src/vite/dev-api-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "type": "module",
5
5
  "description": "Framework for agent-native application development — where AI agents and UI share state via files",
6
6
  "license": "MIT",
@@ -23,6 +23,9 @@
23
23
  "./client": "./dist/client/index.js",
24
24
  "./shared": "./dist/shared/index.js",
25
25
  "./scripts": "./dist/scripts/index.js",
26
+ "./application-state": "./dist/application-state/index.js",
27
+ "./settings": "./dist/settings/index.js",
28
+ "./oauth-tokens": "./dist/oauth-tokens/index.js",
26
29
  "./adapters/sync": "./dist/adapters/sync/index.js",
27
30
  "./adapters/drizzle": "./dist/adapters/drizzle/index.js",
28
31
  "./adapters/firestore": "./dist/adapters/firestore/index.js",
@@ -31,6 +34,8 @@
31
34
  "./adapters/cli": "./dist/adapters/cli/index.js",
32
35
  "./router": "./dist/router/index.js",
33
36
  "./a2a": "./dist/a2a/index.js",
37
+ "./terminal": "./dist/client/terminal/index.js",
38
+ "./terminal/server": "./dist/terminal/index.js",
34
39
  "./tailwind": "./dist/tailwind.preset.js",
35
40
  "./tsconfig.base.json": "./tsconfig.base.json"
36
41
  },
@@ -50,26 +55,37 @@
50
55
  },
51
56
  "dependencies": {
52
57
  "@anthropic-ai/sdk": "^0.80.0",
58
+ "@libsql/client": "^0.15.0",
53
59
  "@react-router/dev": "^7.13.1",
54
60
  "@react-router/fs-routes": "^7.13.1",
61
+ "@tailwindcss/typography": "^0.5.19",
55
62
  "better-sqlite3": "^12.8.0",
56
63
  "chokidar": "^4.0.0",
57
64
  "clsx": "^2.1.1",
58
65
  "dotenv": "^17.2.1",
59
- "drizzle-orm": "^0.38.0",
66
+ "drizzle-orm": "^0.44.0",
60
67
  "h3": "^1.14.0",
68
+ "isbot": "^5",
61
69
  "minimatch": "^10.0.0",
62
70
  "nitro": "^3.0.0",
63
71
  "p-limit": "^7.3.0",
72
+ "react-markdown": "^10.1.0",
64
73
  "react-router": "^7.13.1",
74
+ "remark-gfm": "^4.0.1",
65
75
  "tailwind-merge": "^2.6.0"
66
76
  },
67
77
  "peerDependencies": {
78
+ "@assistant-ui/react": ">=0.12",
79
+ "@assistant-ui/react-markdown": ">=0.12",
68
80
  "@supabase/supabase-js": ">=2",
69
81
  "@tanstack/react-query": ">=5",
70
82
  "@vitejs/plugin-react-swc": ">=4",
83
+ "@xterm/addon-fit": ">=0.10",
84
+ "@xterm/addon-web-links": ">=0.11",
85
+ "@xterm/xterm": ">=5",
71
86
  "autoprefixer": ">=10",
72
87
  "convex": ">=1",
88
+ "node-pty": ">=1",
73
89
  "postcss": ">=8",
74
90
  "react": ">=18",
75
91
  "react-dom": ">=18",
@@ -77,9 +93,16 @@
77
93
  "tailwindcss": ">=3",
78
94
  "tailwindcss-animate": ">=1",
79
95
  "typescript": ">=5",
80
- "vite": ">=7"
96
+ "vite": ">=7",
97
+ "ws": ">=8"
81
98
  },
82
99
  "peerDependenciesMeta": {
100
+ "@assistant-ui/react": {
101
+ "optional": true
102
+ },
103
+ "@assistant-ui/react-markdown": {
104
+ "optional": true
105
+ },
83
106
  "@tanstack/react-query": {
84
107
  "optional": true
85
108
  },
@@ -109,9 +132,26 @@
109
132
  },
110
133
  "convex": {
111
134
  "optional": true
135
+ },
136
+ "@xterm/xterm": {
137
+ "optional": true
138
+ },
139
+ "@xterm/addon-fit": {
140
+ "optional": true
141
+ },
142
+ "@xterm/addon-web-links": {
143
+ "optional": true
144
+ },
145
+ "node-pty": {
146
+ "optional": true
147
+ },
148
+ "ws": {
149
+ "optional": true
112
150
  }
113
151
  },
114
152
  "devDependencies": {
153
+ "@assistant-ui/react": "^0.12.19",
154
+ "@assistant-ui/react-markdown": "^0.12.6",
115
155
  "@react-router/dev": "^7.13.1",
116
156
  "@react-router/fs-routes": "^7.13.1",
117
157
  "@supabase/supabase-js": "^2.49.0",
@@ -120,10 +160,15 @@
120
160
  "@types/express": "^5.0.6",
121
161
  "@types/node": "^24.2.1",
122
162
  "@types/react": "^18.3.23",
163
+ "@types/ws": "^8.18.1",
123
164
  "@vitejs/plugin-react-swc": "^4.0.0",
165
+ "@xterm/addon-fit": "^0.10.0",
166
+ "@xterm/addon-web-links": "^0.11.0",
167
+ "@xterm/xterm": "^5.5.0",
124
168
  "autoprefixer": "^10.4.21",
125
169
  "express": "^5.2.1",
126
170
  "firebase-admin": "^13.0.0",
171
+ "node-pty": "^1.1.0",
127
172
  "postcss": "^8.5.6",
128
173
  "react": "^18.3.1",
129
174
  "react-router": "^7.13.1",
@@ -131,6 +176,7 @@
131
176
  "tailwindcss-animate": "^1.0.7",
132
177
  "typescript": "^5.9.2",
133
178
  "vite": "^8.0.0",
134
- "vitest": "^3.2.4"
179
+ "vitest": "^3.2.4",
180
+ "ws": "^8.18.0"
135
181
  }
136
182
  }
@@ -135,7 +135,7 @@ description: >-
135
135
  ## Naming Conventions
136
136
 
137
137
  - Hyphen-case only: `[a-z0-9-]`, max 64 characters
138
- - Pattern skills: descriptive names (`files-as-database`, `delegate-to-agent`)
138
+ - Pattern skills: descriptive names (`storing-data`, `delegate-to-agent`)
139
139
  - Workflow/generator skills: verb-noun (`create-script`, `capture-learnings`)
140
140
 
141
141
  ## Tips
@@ -14,7 +14,7 @@ The UI and server never call an LLM directly. All AI work is delegated to the ag
14
14
 
15
15
  ## Why
16
16
 
17
- The agent is the single AI interface. It has context about the full project, can read/write any file, and can run scripts. Inline LLM calls bypass this — they create a shadow AI that doesn't know what the agent knows and can't coordinate with it.
17
+ The agent is the single AI interface. It has context about the full project, can read/write the database, and can run scripts. Inline LLM calls bypass this — they create a shadow AI that doesn't know what the agent knows and can't coordinate with it.
18
18
 
19
19
  ## How
20
20
 
@@ -86,5 +86,5 @@ Scripts may call external APIs (image generation, search, etc.) — but the AI r
86
86
 
87
87
  - **scripts** — The agent invokes scripts via `pnpm script <name>` to perform complex operations
88
88
  - **self-modifying-code** — The agent operates through the chat bridge to make code changes
89
- - **files-as-database** — The agent writes results to data files after processing requests
90
- - **sse-file-watcher** — The UI updates automatically when the agent writes files
89
+ - **storing-data** — The agent writes results to the database after processing requests
90
+ - **real-time-sync** — The UI updates automatically when the agent writes to the database
@@ -1,91 +1,110 @@
1
1
  ---
2
- name: files-as-database
2
+ name: storing-data
3
3
  description: >-
4
- How to store and manage application state as JSON/markdown files in data/.
5
- Use when adding data models, creating file-based state, deciding where to
6
- store data, or reading/writing application data files.
4
+ How and where to store application data. Use when adding new data models,
5
+ deciding between settings vs Drizzle tables, reading/writing app config,
6
+ or working with application state.
7
7
  ---
8
8
 
9
- # Files as Database
9
+ # Storing Data
10
10
 
11
- ## Rule
11
+ ## Where Data Goes
12
12
 
13
- All application state must be stored as files. There is no traditional database in an agent-native app.
13
+ All data lives in one SQLite database (`data/app.db`). In production, set `DATABASE_URL` to point to Turso, Neon, Supabase, or D1 — same code, no changes needed.
14
14
 
15
- ## Why
15
+ There are three storage layers, each for a different kind of data:
16
16
 
17
- Files are the shared interface between the AI agent and the UI. The agent reads and writes files directly on the filesystem. The UI reads files via API routes. SSE streams file changes back to the UI in real-time. This only works if files are the single source of truth.
17
+ ### 1. Settings app configuration
18
18
 
19
- ## How
19
+ Key-value store for persistent config that the user or agent can change. Theme, preferences, integration API keys, availability schedules.
20
20
 
21
- - Store data as JSON or markdown files in `data/` (or a project-specific subdirectory).
22
- - API routes in `server/index.ts` read files with `fs.readFile` and return them.
23
- - The agent modifies files directly — no API calls needed from the agent side.
24
- - `createFileWatcher("./data")` watches for changes and streams them via SSE.
25
- - `useFileWatcher()` on the client invalidates React Query caches when files change.
21
+ ```ts
22
+ import { getSetting, putSetting } from "@agent-native/core/settings";
23
+
24
+ // Read (returns null if not set)
25
+ const prefs = await getSetting("user-preferences");
26
+
27
+ // Write (creates or replaces)
28
+ await putSetting("user-preferences", { theme: "dark", density: "comfortable" });
29
+ ```
30
+
31
+ From scripts:
32
+ ```ts
33
+ import { readSetting, writeSetting } from "@agent-native/core/settings";
34
+ const prefs = await readSetting("user-preferences");
35
+ ```
26
36
 
27
- ## Don't
37
+ SSE: writes automatically notify the UI via `{ source: "settings", type: "change", key }`.
28
38
 
29
- - Don't add a database (SQLite, Postgres, MongoDB, etc.)
30
- - Don't store app state in localStorage, sessionStorage, or cookies
31
- - Don't keep state only in memory (server variables, global stores)
32
- - Don't use Redis or any external state store
33
- - Don't interpolate user input directly into file paths (see Security below)
39
+ ### 2. Application State ephemeral UI state
34
40
 
35
- ## Example
41
+ For state the agent and UI share in real-time: what the user is looking at, compose drafts, navigation commands. Scoped by session — cleared between sessions.
36
42
 
37
43
  ```ts
38
- import fs from "fs";
39
-
40
- // Writing state (agent or script)
41
- fs.writeFileSync(
42
- "data/projects/my-project.json",
43
- JSON.stringify(project, null, 2),
44
- );
45
-
46
- // Reading state (server route) note the path sanitization
47
- app.get("/api/projects/:id", (req, res) => {
48
- const id = req.params.id.replace(/[^a-zA-Z0-9_-]/g, "");
49
- const data = fs.readFileSync(`data/projects/${id}.json`, "utf-8");
50
- res.json(JSON.parse(data));
51
- });
44
+ import { readAppState, writeAppState, deleteAppState, listAppState } from "@agent-native/core/application-state";
45
+
46
+ // Write state (UI updates instantly via SSE)
47
+ await writeAppState("navigate", { view: "inbox", threadId: "t-123" });
48
+
49
+ // Read state
50
+ const nav = await readAppState("navigation");
51
+
52
+ // List by prefix (e.g., all compose drafts)
53
+ const drafts = await listAppState("compose-");
54
+
55
+ // Delete (one-shot commands: UI reads, then agent or UI deletes)
56
+ await deleteAppState("navigate");
52
57
  ```
53
58
 
54
- ## Creating a New Data Model
59
+ SSE: writes automatically notify the UI via `{ source: "app-state", type: "change", key }`.
60
+
61
+ ### 3. Drizzle Tables — structured domain data
62
+
63
+ For data with schemas, relationships, and queries: forms, bookings, emails, compositions. Define tables in `server/db/schema.ts` using Drizzle ORM.
64
+
65
+ ```ts
66
+ import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
67
+
68
+ export const bookings = sqliteTable("bookings", {
69
+ id: text("id").primaryKey(),
70
+ name: text("name").notNull(),
71
+ email: text("email").notNull(),
72
+ startTime: integer("start_time").notNull(),
73
+ endTime: integer("end_time").notNull(),
74
+ });
75
+ ```
55
76
 
56
- When adding a new data entity (e.g., projects, tasks, settings):
77
+ Query via `getDb()` singleton from `server/db/index.ts`.
57
78
 
58
- 1. **Define the type** in `shared/` so both client and server import it
59
- 2. **Create the data directory** — `data/<model>/<id>.json` (one file per item) or `data/<model>.json` (single collection)
60
- 3. **Add API routes** in `server/` that read/write the files (sanitize IDs from params)
61
- 4. **Wire SSE invalidation** — Add the query key to `useFileWatcher()` so the UI refreshes on changes
79
+ ### 4. OAuth Tokens credentials
62
80
 
63
- ## Judgment Criteria
81
+ For OAuth tokens acquired at runtime (Google, etc.). Never store these in settings — use the dedicated encrypted store.
64
82
 
65
- | Question | Single file | Directory of files |
66
- | ------------------------------------ | ----------------- | ---------------------------- |
67
- | Are items independently addressable? | No — use one file | Yes — one file per item |
68
- | Will there be >50 items? | Probably fine | Definitely split |
69
- | Do items need individual URLs? | No | Yes |
70
- | Do items change independently? | No | Yes — avoids write conflicts |
83
+ ```ts
84
+ import { saveOAuthTokens, getOAuthTokens, listOAuthAccounts } from "@agent-native/core/oauth-tokens";
71
85
 
72
- ## Scaling Guidance
86
+ await saveOAuthTokens("google", "user@gmail.com", { access_token: "...", refresh_token: "..." });
87
+ const tokens = await getOAuthTokens("google", "user@gmail.com");
88
+ const accounts = await listOAuthAccounts("google");
89
+ ```
73
90
 
74
- | File Count | Recommendation |
75
- | ---------- | --------------------------------------------------------------------- |
76
- | Under 50 | Read-all with `readdirSync` + `readFileSync` is fine |
77
- | 50–200 | Add an index file (`data/<model>/_index.json`) with IDs and summaries |
78
- | 200+ | Partition into subdirectories |
91
+ ## Which Layer to Use
79
92
 
80
- For list endpoints serving many files, use `fs.promises.readFile` instead of `readFileSync` to avoid blocking the event loop.
93
+ | Data | Layer | Why |
94
+ |------|-------|-----|
95
+ | User preferences, theme, config | Settings | Persistent KV, SSE notifications, simple read/write |
96
+ | What the user sees on screen | Application State | Ephemeral, real-time sync, agent ↔ UI bridge |
97
+ | Compose drafts, wizard steps | Application State | Temporary, deleted when done |
98
+ | Domain records (forms, bookings) | Drizzle table | Needs schema, queries, relationships |
99
+ | OAuth refresh tokens | OAuth Tokens | Secure, per-provider, per-account |
81
100
 
82
- ## Security
101
+ ## Environment Variables
83
102
 
84
- - **Path sanitization** Always sanitize IDs from request params before constructing file paths. Use `id.replace(/[^a-zA-Z0-9_-]/g, "")` or the core utility `isValidPath()`. Without this, `../../.env` as an ID reads your environment file.
85
- - **Validate before writing** — Check data shape before writing files, especially for user-submitted data. A malformed write can break all subsequent reads.
103
+ Infrastructure config stays in `.env` these differ per deployment:
86
104
 
87
- ## Related Skills
105
+ - `DATABASE_URL` — database connection (default: `file:./data/app.db`)
106
+ - `DATABASE_AUTH_TOKEN` — for remote databases
107
+ - `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` — OAuth app credentials
108
+ - `ACCESS_TOKEN` — production auth token
88
109
 
89
- - **sse-file-watcher** Set up real-time sync so the UI updates when data files change
90
- - **scripts** — Create scripts that read/write data files for complex operations
91
- - **self-modifying-code** — The agent writes data files as Tier 1 (auto-apply) modifications
110
+ Everything else (user settings, tokens, app state) goes in SQL.
@@ -61,9 +61,9 @@ In the agent-native framework context:
61
61
  - For complex visual effects, use a `<style>` tag in the component or a dedicated CSS file
62
62
  - Fonts can be loaded from Google Fonts via `@import` in a CSS file or `<link>` in `index.html`
63
63
  - Animation libraries: prefer CSS transitions and keyframes; use Framer Motion for complex sequences
64
- - All new UI components should be placed in `client/components/`
64
+ - All new UI components should be placed in `app/components/`
65
65
 
66
66
  ## Related Skills
67
67
 
68
68
  - **self-modifying-code** — The agent can edit source code to apply design changes
69
- - **files-as-database** — Design configuration can be stored as JSON in `data/` for agent-editable theming
69
+ - **storing-data** — Design configuration can be stored in the settings table for agent-editable theming
@@ -21,8 +21,9 @@ Scripts give the agent callable tools with structured input/output. They keep th
21
21
  Create `scripts/my-script.ts`:
22
22
 
23
23
  ```ts
24
- import fs from "fs";
25
24
  import { parseArgs, loadEnv, fail, agentChat } from "@agent-native/core";
25
+ import { readSetting, writeSetting } from "@agent-native/core/settings";
26
+ import { readAppState, writeAppState } from "@agent-native/core/application-state";
26
27
 
27
28
  export default async function myScript(args: string[]) {
28
29
  loadEnv();
@@ -31,19 +32,21 @@ export default async function myScript(args: string[]) {
31
32
  const input = parsed.input;
32
33
  if (!input) fail("--input is required");
33
34
 
34
- const outputPath = parsed.output ?? "data/result.json";
35
- const raw = fs.readFileSync(input, "utf-8");
36
- const data = JSON.parse(raw) as unknown;
35
+ // Read/write settings (persistent config)
36
+ const settings = await readSetting("my-settings");
37
+ await writeSetting("my-settings", { ...settings, lastRun: new Date().toISOString() });
38
+
39
+ // Read/write app state (ephemeral UI state)
40
+ await writeAppState("processing-status", { status: "done", input });
37
41
 
38
- fs.writeFileSync(outputPath, JSON.stringify(data, null, 2));
39
- agentChat.submit(`Processed ${input}, result saved to ${outputPath}`);
42
+ agentChat.submit(`Processed ${input}`);
40
43
  }
41
44
  ```
42
45
 
43
46
  ## How to Run
44
47
 
45
48
  ```bash
46
- pnpm script my-script --input data/source.json --output data/result.json
49
+ pnpm script my-script --input some-value
47
50
  ```
48
51
 
49
52
  ## Script Dispatcher
@@ -63,7 +66,7 @@ This is the canonical approach for new apps. Script names must be lowercase with
63
66
  - **Use `parseArgs()`** for structured argument parsing. It converts `--key value` pairs to a `Record<string, string>`.
64
67
  - **Use `loadEnv()`** if the script needs environment variables (API keys, etc.).
65
68
  - **Use `fail()`** for user-friendly error messages (exits with message, no stack trace).
66
- - **Write results to files.** The agent and UI will pick them up via the file watcher.
69
+ - **Write results to the database.** Use `writeSetting()` or `writeAppState()` for structured data. The UI will pick up changes via SSE.
67
70
  - **Use `agentChat.submit()`** to report results or errors back to the agent chat.
68
71
  - **Import from `@agent-native/core`** — Don't redefine `parseArgs()` or other utilities locally.
69
72
 
@@ -91,17 +94,17 @@ export default async function generateImage(args: string[]) {
91
94
  **Data processing script:**
92
95
 
93
96
  ```ts
94
- import fs from "fs";
95
97
  import { parseArgs, fail } from "@agent-native/core";
98
+ import { readSetting, writeSetting } from "@agent-native/core/settings";
96
99
 
97
100
  export default async function transform(args: string[]) {
98
101
  const parsed = parseArgs(args);
99
- const source = parsed.source;
100
- if (!source) fail("--source is required");
102
+ const key = parsed.key;
103
+ if (!key) fail("--key is required");
101
104
 
102
- const data = JSON.parse(fs.readFileSync(source, "utf-8")) as unknown[];
103
- const result = data.map(transformItem);
104
- fs.writeFileSync(source, JSON.stringify(result, null, 2));
105
+ const data = await readSetting(key);
106
+ const result = processData(data);
107
+ await writeSetting(key, result);
105
108
  }
106
109
  ```
107
110
 
@@ -109,10 +112,10 @@ export default async function transform(args: string[]) {
109
112
 
110
113
  - **Script not found** — Check that the filename matches the command name exactly. `pnpm script foo-bar` looks for `scripts/foo-bar.ts`.
111
114
  - **Args not parsing** — Ensure args use `--key value` or `--key=value` format. Boolean flags use `--flag` (sets value to `"true"`).
112
- - **Script runs but UI doesn't update** — Make sure results are written to a path under `data/` that the file watcher monitors.
115
+ - **Script runs but UI doesn't update** — Make sure you're using core store helpers (`writeSetting`, `writeAppState`) which emit SSE events automatically. Direct SQL writes don't emit events.
113
116
 
114
117
  ## Related Skills
115
118
 
116
- - **files-as-database** — Scripts read/write data files in `data/`
119
+ - **storing-data** — Scripts read/write data via core SQL stores and Drizzle ORM
117
120
  - **delegate-to-agent** — The agent invokes scripts via `pnpm script <name>`
118
- - **sse-file-watcher** — File writes from scripts trigger SSE events to update the UI
121
+ - **real-time-sync** — Database writes from scripts trigger SSE events to update the UI
@@ -73,7 +73,7 @@ el.dataset.selectedId = selectedItem?.id || "";
73
73
 
74
74
  ## Related Skills
75
75
 
76
- - **files-as-database** — Tier 1 modifications (data files) are the safest and most common
76
+ - **storing-data** — Tier 1 modifications (database writes) are the safest and most common
77
77
  - **scripts** — The agent can create or modify scripts to add new capabilities
78
78
  - **delegate-to-agent** — Self-modification requests come through the agent chat
79
- - **sse-file-watcher** — Source and data file edits trigger SSE events to update the UI
79
+ - **real-time-sync** — Source edits and database writes trigger SSE events to update the UI
@@ -1,95 +1,80 @@
1
1
  ---
2
- name: sse-file-watcher
2
+ name: real-time-sync
3
3
  description: >-
4
- How to keep the UI in sync with agent changes via Server-Sent Events. Use
5
- when setting up real-time file sync, adding SSE to a new data directory,
6
- wiring query invalidation for new data models, or debugging UI not updating.
4
+ How the UI stays in sync when the agent writes data. Use when wiring up
5
+ query invalidation, debugging UI not updating, or understanding how SSE
6
+ connects the agent to the browser.
7
7
  ---
8
8
 
9
- # SSE File Watcher
10
-
11
- ## Rule
12
-
13
- The UI stays in sync with agent changes through Server-Sent Events. When the agent writes a file, the UI updates automatically — no polling, no manual refresh.
14
-
15
- ## Why
16
-
17
- The agent modifies files on disk, but the UI runs in the browser. SSE bridges this gap: a file watcher on the server detects changes, streams them to the browser, and React Query invalidates the relevant caches. This is what makes the "files as database" pattern feel real-time.
9
+ # Real-Time Sync
18
10
 
19
11
  ## How It Works
20
12
 
21
- 1. **Server** watches the data directory with chokidar:
13
+ When the agent writes data (via scripts or server handlers), the UI updates instantly. No polling, no manual refresh.
22
14
 
23
- ```ts
24
- import { createFileWatcher, createSSEHandler } from "@agent-native/core";
25
- const watcher = createFileWatcher("./data");
26
- app.get("/api/events", createSSEHandler(watcher));
27
- ```
15
+ The flow:
28
16
 
29
- 2. **Client** listens for changes and invalidates React Query caches:
17
+ 1. **Agent writes** `writeAppState("navigate", { view: "starred" })`
18
+ 2. **Store emits SSE event** → `{ source: "app-state", type: "change", key: "navigate" }`
19
+ 3. **Browser receives** → `useFileWatcher()` hook gets the event
20
+ 4. **React Query invalidates** → relevant queries refetch, UI re-renders
30
21
 
31
- ```ts
32
- import { useFileWatcher } from "@agent-native/core";
33
- useFileWatcher({ queryClient, queryKeys: ["files", "projects"] });
34
- ```
22
+ This happens automatically for all writes through `@agent-native/core/application-state` and `@agent-native/core/settings`.
35
23
 
36
- 3. When the agent writes to `data/`, chokidar detects it, SSE pushes the event, and React Query refetches the affected queries.
24
+ ## SSE Events
37
25
 
38
- ## Don't
26
+ | Source | Emitted by | Example |
27
+ |--------|-----------|---------|
28
+ | `"app-state"` | `writeAppState`, `deleteAppState` | `{ source: "app-state", type: "change", key: "navigation" }` |
29
+ | `"settings"` | `putSetting`, `deleteSetting` | `{ source: "settings", type: "change", key: "mail-settings" }` |
39
30
 
40
- - Don't poll for changes — SSE handles it
41
- - Don't create per-model `fs.watch()` instances — `createFileWatcher("./data")` watches recursively. One watcher is enough.
42
- - Don't create your own EventSource connections alongside `useFileWatcher` — use the `onEvent` callback for custom handling
31
+ ## Client Setup
43
32
 
44
- ## Query Key Mapping
33
+ Every template has an SSE endpoint and a `useFileWatcher` hook in `root.tsx`:
45
34
 
46
- By default, `useFileWatcher` invalidates all listed query keys on every file change. For apps with multiple data models, this causes unnecessary refetches. Use path-based filtering via the `onEvent` callback:
35
+ ```ts
36
+ // server/routes/api/events.get.ts
37
+ import { createDefaultSSEHandler } from "@agent-native/core/server";
38
+ export default createDefaultSSEHandler();
39
+ ```
47
40
 
48
41
  ```ts
42
+ // In root.tsx
49
43
  useFileWatcher({
50
- queryClient,
51
- queryKeys: [], // don't auto-invalidate everything
44
+ queryClient: qc,
45
+ queryKeys: [],
52
46
  onEvent: (data) => {
53
- if (data.path?.includes("projects")) {
54
- queryClient.invalidateQueries({ queryKey: ["projects"] });
55
- } else if (data.path?.includes("settings")) {
56
- queryClient.invalidateQueries({ queryKey: ["settings"] });
47
+ if (data.source === "app-state") {
48
+ // Invalidate queries affected by app state changes
49
+ qc.invalidateQueries({ queryKey: ["compose-drafts"] });
50
+ } else if (data.source === "settings") {
51
+ qc.invalidateQueries({ queryKey: ["settings"] });
57
52
  }
58
53
  },
59
54
  });
60
55
  ```
61
56
 
62
- To prevent cache thrashing during rapid agent writes, set `staleTime` on your queries:
57
+ Use the `key` field to selectively invalidate don't invalidate everything on every event.
63
58
 
64
- ```ts
65
- useQuery({
66
- queryKey: ["projects"],
67
- queryFn: fetchProjects,
68
- staleTime: 2000, // don't refetch within 2 seconds
69
- });
70
- ```
71
-
72
- ## Performance
59
+ ## For Custom Domain Data
73
60
 
74
- When the agent writes many files rapidly (e.g., during self-modification), each write fires a chokidar event → SSE broadcast React Query invalidation. This can cause excessive refetching.
61
+ If your template has Drizzle tables and you want SSE notifications after writes, emit from your handler:
75
62
 
76
- Mitigations:
63
+ ```ts
64
+ import { getAppStateEmitter } from "@agent-native/core/application-state";
77
65
 
78
- - Use `staleTime: 2000` on React Query to debounce refetches
79
- - Use path-based filtering (see Query Key Mapping) to limit which queries invalidate
66
+ // After inserting a booking:
67
+ getAppStateEmitter().emit("app-state", {
68
+ source: "app-state",
69
+ type: "change",
70
+ key: "bookings-updated",
71
+ });
72
+ ```
80
73
 
81
74
  ## Troubleshooting
82
75
 
83
- | Symptom | Check |
84
- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------- |
85
- | UI not updating after agent writes | Is `useFileWatcher` called with the correct `queryClient`? Are the `queryKeys` matching your `useQuery` keys? |
86
- | SSE not firing | Open browser devtools → Network tab filter by EventStream. Is `/api/events` connected? Is the server running? |
87
- | Watcher not detecting changes | Is the path correct? `createFileWatcher("./data")` is relative to CWD. Check the server's working directory. |
88
- | Constant reconnections | Check for server crashes in terminal output. |
89
- | High CPU / event storms | The agent is writing many files rapidly. Add `staleTime` to queries and use path-based filtering. |
90
-
91
- ## Related Skills
92
-
93
- - **files-as-database** — SSE watches the data files that store application state
94
- - **scripts** — Script outputs written to `data/` trigger SSE events
95
- - **self-modifying-code** — Agent code edits trigger SSE events; rapid edits can cause event storms
76
+ | Symptom | Check |
77
+ |---------|-------|
78
+ | UI not updating after script writes | Is the script using `writeAppState`/`writeSetting`? Direct SQL writes don't emit SSE. |
79
+ | SSE not connected | Browser devtools → Network → EventStream. Is `/api/events` connected? |
80
+ | Wrong queries invalidating | Check the `onEvent` callback filter by `data.source` and `data.key` |
File without changes