@agentuity/cli 0.0.100 → 0.0.102

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 (264) hide show
  1. package/AGENTS.md +19 -188
  2. package/bin/cli.ts +13 -6
  3. package/dist/api.d.ts +1 -0
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +1 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +41 -12
  9. package/dist/cli.js.map +1 -1
  10. package/dist/cmd/ai/index.d.ts.map +1 -1
  11. package/dist/cmd/ai/index.js +6 -1
  12. package/dist/cmd/ai/index.js.map +1 -1
  13. package/dist/cmd/ai/prompt/agent.d.ts +7 -0
  14. package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
  15. package/dist/cmd/ai/prompt/agent.js +12 -323
  16. package/dist/cmd/ai/prompt/agent.js.map +1 -1
  17. package/dist/cmd/ai/prompt/api.d.ts +7 -0
  18. package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
  19. package/dist/cmd/ai/prompt/api.js +12 -260
  20. package/dist/cmd/ai/prompt/api.js.map +1 -1
  21. package/dist/cmd/ai/prompt/version.d.ts +35 -0
  22. package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
  23. package/dist/cmd/ai/prompt/version.js +55 -0
  24. package/dist/cmd/ai/prompt/version.js.map +1 -0
  25. package/dist/cmd/ai/prompt/web.d.ts +7 -0
  26. package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
  27. package/dist/cmd/ai/prompt/web.js +12 -283
  28. package/dist/cmd/ai/prompt/web.js.map +1 -1
  29. package/dist/cmd/ai/skills/generate.d.ts +3 -0
  30. package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
  31. package/dist/cmd/ai/skills/generate.js +65 -0
  32. package/dist/cmd/ai/skills/generate.js.map +1 -0
  33. package/dist/cmd/ai/skills/generator.d.ts +4 -0
  34. package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
  35. package/dist/cmd/ai/skills/generator.js +402 -0
  36. package/dist/cmd/ai/skills/generator.js.map +1 -0
  37. package/dist/cmd/ai/skills/index.d.ts +4 -0
  38. package/dist/cmd/ai/skills/index.d.ts.map +1 -0
  39. package/dist/cmd/ai/skills/index.js +21 -0
  40. package/dist/cmd/ai/skills/index.js.map +1 -0
  41. package/dist/cmd/auth/signup.d.ts.map +1 -1
  42. package/dist/cmd/auth/signup.js +1 -0
  43. package/dist/cmd/auth/signup.js.map +1 -1
  44. package/dist/cmd/build/ast.d.ts +2 -1
  45. package/dist/cmd/build/ast.d.ts.map +1 -1
  46. package/dist/cmd/build/ast.js +135 -47
  47. package/dist/cmd/build/ast.js.map +1 -1
  48. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  49. package/dist/cmd/build/entry-generator.js +255 -188
  50. package/dist/cmd/build/entry-generator.js.map +1 -1
  51. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
  52. package/dist/cmd/build/vite/agent-discovery.js +103 -45
  53. package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
  54. package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
  55. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  56. package/dist/cmd/build/vite/bun-dev-server.js +52 -26
  57. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  58. package/dist/cmd/build/vite/docs-generator.d.ts +13 -0
  59. package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -0
  60. package/dist/cmd/build/vite/docs-generator.js +81 -0
  61. package/dist/cmd/build/vite/docs-generator.js.map +1 -0
  62. package/dist/cmd/build/vite/index.d.ts +3 -3
  63. package/dist/cmd/build/vite/index.d.ts.map +1 -1
  64. package/dist/cmd/build/vite/index.js +9 -7
  65. package/dist/cmd/build/vite/index.js.map +1 -1
  66. package/dist/cmd/build/vite/lifecycle-generator.d.ts +1 -1
  67. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
  68. package/dist/cmd/build/vite/lifecycle-generator.js +19 -5
  69. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
  70. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  71. package/dist/cmd/build/vite/metadata-generator.js +203 -7
  72. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  73. package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
  74. package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
  75. package/dist/cmd/build/vite/prompt-generator.js +123 -0
  76. package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
  77. package/dist/cmd/build/vite/registry-generator.d.ts +3 -3
  78. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  79. package/dist/cmd/build/vite/registry-generator.js +644 -103
  80. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  81. package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
  82. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  83. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  84. package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
  85. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
  86. package/dist/cmd/build/vite/server-bundler.js +63 -17
  87. package/dist/cmd/build/vite/server-bundler.js.map +1 -1
  88. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  89. package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
  90. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  91. package/dist/cmd/build/vite/vite-builder.d.ts +1 -1
  92. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  93. package/dist/cmd/build/vite/vite-builder.js +118 -96
  94. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  95. package/dist/cmd/build/vite-bundler.js +6 -6
  96. package/dist/cmd/build/vite-bundler.js.map +1 -1
  97. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  98. package/dist/cmd/cloud/deploy.js +89 -32
  99. package/dist/cmd/cloud/deploy.js.map +1 -1
  100. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
  102. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  103. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
  105. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  106. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
  107. package/dist/cmd/cloud/keyvalue/delete.js +3 -1
  108. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  109. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
  110. package/dist/cmd/cloud/keyvalue/set.js +4 -2
  111. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  112. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  113. package/dist/cmd/cloud/stream/get.js +2 -13
  114. package/dist/cmd/cloud/stream/get.js.map +1 -1
  115. package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
  116. package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
  117. package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
  118. package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
  119. package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
  120. package/dist/cmd/cloud/vector/index.js +21 -4
  121. package/dist/cmd/cloud/vector/index.js.map +1 -1
  122. package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
  123. package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
  124. package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
  125. package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
  126. package/dist/cmd/cloud/vector/stats.d.ts +3 -0
  127. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
  128. package/dist/cmd/cloud/vector/stats.js +142 -0
  129. package/dist/cmd/cloud/vector/stats.js.map +1 -0
  130. package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
  131. package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
  132. package/dist/cmd/cloud/vector/upsert.js +192 -0
  133. package/dist/cmd/cloud/vector/upsert.js.map +1 -0
  134. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  135. package/dist/cmd/dev/file-watcher.js +94 -33
  136. package/dist/cmd/dev/file-watcher.js.map +1 -1
  137. package/dist/cmd/dev/index.d.ts.map +1 -1
  138. package/dist/cmd/dev/index.js +298 -61
  139. package/dist/cmd/dev/index.js.map +1 -1
  140. package/dist/cmd/dev/skills.d.ts +10 -0
  141. package/dist/cmd/dev/skills.d.ts.map +1 -0
  142. package/dist/cmd/dev/skills.js +57 -0
  143. package/dist/cmd/dev/skills.js.map +1 -0
  144. package/dist/cmd/dev/sync.d.ts.map +1 -1
  145. package/dist/cmd/dev/sync.js +19 -3
  146. package/dist/cmd/dev/sync.js.map +1 -1
  147. package/dist/cmd/index.d.ts.map +1 -1
  148. package/dist/cmd/index.js +1 -0
  149. package/dist/cmd/index.js.map +1 -1
  150. package/dist/cmd/project/create.d.ts.map +1 -1
  151. package/dist/cmd/project/create.js +3 -0
  152. package/dist/cmd/project/create.js.map +1 -1
  153. package/dist/cmd/project/template-flow.d.ts +1 -0
  154. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  155. package/dist/cmd/project/template-flow.js +30 -5
  156. package/dist/cmd/project/template-flow.js.map +1 -1
  157. package/dist/cmd/setup/index.d.ts.map +1 -1
  158. package/dist/cmd/setup/index.js +1 -0
  159. package/dist/cmd/setup/index.js.map +1 -1
  160. package/dist/cmd/upgrade/index.d.ts +15 -0
  161. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  162. package/dist/cmd/upgrade/index.js +59 -4
  163. package/dist/cmd/upgrade/index.js.map +1 -1
  164. package/dist/config.d.ts.map +1 -1
  165. package/dist/config.js +8 -0
  166. package/dist/config.js.map +1 -1
  167. package/dist/domain.d.ts +45 -0
  168. package/dist/domain.d.ts.map +1 -0
  169. package/dist/domain.js +200 -0
  170. package/dist/domain.js.map +1 -0
  171. package/dist/index.d.ts +0 -1
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +0 -1
  174. package/dist/index.js.map +1 -1
  175. package/dist/schema-generator.d.ts +2 -0
  176. package/dist/schema-generator.d.ts.map +1 -1
  177. package/dist/schema-generator.js +18 -0
  178. package/dist/schema-generator.js.map +1 -1
  179. package/dist/steps.d.ts +1 -1
  180. package/dist/steps.d.ts.map +1 -1
  181. package/dist/steps.js +16 -5
  182. package/dist/steps.js.map +1 -1
  183. package/dist/tui/prompt.d.ts +1 -2
  184. package/dist/tui/prompt.d.ts.map +1 -1
  185. package/dist/tui/prompt.js +8 -4
  186. package/dist/tui/prompt.js.map +1 -1
  187. package/dist/tui.d.ts +16 -0
  188. package/dist/tui.d.ts.map +1 -1
  189. package/dist/tui.js +23 -2
  190. package/dist/tui.js.map +1 -1
  191. package/dist/types.d.ts +9 -2
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js +3 -3
  194. package/dist/types.js.map +1 -1
  195. package/package.json +5 -8
  196. package/src/api.ts +1 -1
  197. package/src/cli.ts +47 -12
  198. package/src/cmd/ai/index.ts +6 -1
  199. package/src/cmd/ai/prompt/agent.md +306 -0
  200. package/src/cmd/ai/prompt/agent.ts +12 -322
  201. package/src/cmd/ai/prompt/api.md +360 -0
  202. package/src/cmd/ai/prompt/api.ts +13 -260
  203. package/src/cmd/ai/prompt/version.ts +61 -0
  204. package/src/cmd/ai/prompt/web.md +509 -0
  205. package/src/cmd/ai/prompt/web.ts +12 -282
  206. package/src/cmd/ai/skills/generate.ts +75 -0
  207. package/src/cmd/ai/skills/generator.ts +519 -0
  208. package/src/cmd/ai/skills/index.ts +23 -0
  209. package/src/cmd/auth/signup.ts +1 -0
  210. package/src/cmd/build/ast.ts +161 -48
  211. package/src/cmd/build/entry-generator.ts +258 -187
  212. package/src/cmd/build/vite/agent-discovery.ts +151 -58
  213. package/src/cmd/build/vite/bun-dev-server.ts +57 -27
  214. package/src/cmd/build/vite/docs-generator.ts +87 -0
  215. package/src/cmd/build/vite/index.ts +9 -7
  216. package/src/cmd/build/vite/lifecycle-generator.ts +19 -5
  217. package/src/cmd/build/vite/metadata-generator.ts +251 -7
  218. package/src/cmd/build/vite/prompt-generator.ts +169 -0
  219. package/src/cmd/build/vite/registry-generator.ts +750 -108
  220. package/src/cmd/build/vite/route-discovery.ts +4 -0
  221. package/src/cmd/build/vite/server-bundler.ts +73 -23
  222. package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
  223. package/src/cmd/build/vite/vite-builder.ts +134 -100
  224. package/src/cmd/build/vite-bundler.ts +6 -6
  225. package/src/cmd/cloud/deploy.ts +114 -36
  226. package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
  227. package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
  228. package/src/cmd/cloud/keyvalue/delete.ts +3 -1
  229. package/src/cmd/cloud/keyvalue/set.ts +4 -2
  230. package/src/cmd/cloud/stream/get.ts +2 -9
  231. package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
  232. package/src/cmd/cloud/vector/index.ts +21 -4
  233. package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
  234. package/src/cmd/cloud/vector/stats.ts +160 -0
  235. package/src/cmd/cloud/vector/upsert.ts +216 -0
  236. package/src/cmd/dev/file-watcher.ts +109 -34
  237. package/src/cmd/dev/index.ts +364 -60
  238. package/src/cmd/dev/skills.ts +82 -0
  239. package/src/cmd/dev/sync.ts +41 -6
  240. package/src/cmd/index.ts +1 -0
  241. package/src/cmd/project/create.ts +3 -0
  242. package/src/cmd/project/template-flow.ts +37 -5
  243. package/src/cmd/setup/index.ts +1 -0
  244. package/src/cmd/upgrade/index.ts +68 -4
  245. package/src/config.ts +9 -0
  246. package/src/domain.ts +273 -0
  247. package/src/index.ts +0 -5
  248. package/src/runtime-bootstrap.md +1 -1
  249. package/src/schema-generator.ts +23 -0
  250. package/src/steps.ts +16 -5
  251. package/src/tui/prompt.ts +11 -5
  252. package/src/tui.ts +21 -2
  253. package/src/types/md.d.ts +8 -0
  254. package/src/types.ts +12 -3
  255. package/dist/cmd/cloud/domain.d.ts +0 -17
  256. package/dist/cmd/cloud/domain.d.ts.map +0 -1
  257. package/dist/cmd/cloud/domain.js +0 -79
  258. package/dist/cmd/cloud/domain.js.map +0 -1
  259. package/dist/runtime-bootstrap.d.ts +0 -56
  260. package/dist/runtime-bootstrap.d.ts.map +0 -1
  261. package/dist/runtime-bootstrap.js +0 -95
  262. package/dist/runtime-bootstrap.js.map +0 -1
  263. package/src/cmd/cloud/domain.ts +0 -100
  264. package/src/runtime-bootstrap.ts +0 -131
@@ -1,6 +1,8 @@
1
1
  import { createSubcommand } from '../../../types';
2
2
  import type { CommandContext } from '../../../types';
3
3
  import { getCommand } from '../../../command-prefix';
4
+ import { appendHashComment } from './version';
5
+ import apiPromptContent from './api.md' with { type: 'text' };
4
6
 
5
7
  export const apiSubcommand = createSubcommand({
6
8
  name: 'api',
@@ -14,265 +16,16 @@ export const apiSubcommand = createSubcommand({
14
16
  },
15
17
  });
16
18
 
17
- export function generateLLMPrompt(): string {
18
- return `# APIs Folder Guide
19
-
20
- This folder contains REST API routes for your Agentuity application. Each API is organized in its own subdirectory.
21
-
22
- ## Directory Structure
23
-
24
- Each API folder must contain:
25
- - **route.ts** (required) - HTTP route definitions using Hono router
26
-
27
- Example structure:
28
- \`\`\`
29
- src/api/
30
- ├── index.ts (optional, mounted at /api)
31
- ├── status/
32
- │ └── route.ts (mounted at /api/status)
33
- ├── users/
34
- │ └── route.ts (mounted at /api/users)
35
- ├── agent-call/
36
- └── route.ts (mounted at /api/agent-call)
37
- \`\`\`
38
-
39
- ## Creating an API
40
-
41
- ### Basic API (route.ts)
42
-
43
- \`\`\`typescript
44
- import { createRouter } from '@agentuity/runtime';
45
-
46
- const router = createRouter();
47
-
48
- // GET /api/status
49
- router.get('/', (c) => {
50
- return c.json({
51
- status: 'ok',
52
- timestamp: new Date().toISOString(),
53
- version: '1.0.0',
54
- });
55
- });
56
-
57
- // POST /api/status
58
- router.post('/', async (c) => {
59
- const body = await c.req.json();
60
- return c.json({ received: body });
61
- });
62
-
63
- export default router;
64
- \`\`\`
65
-
66
- ### API with Request Validation
67
-
68
- \`\`\`typescript
69
- import { createRouter } from '@agentuity/runtime';
70
- import { s } from '@agentuity/schema';
71
-
72
- const router = createRouter();
73
-
74
- const createUserSchema = s.object({
75
- name: s.string(),
76
- email: s.string(),
77
- age: s.number(),
78
- });
79
-
80
- const validator = createRouter.validator({
81
- input: createUserSchema,
82
- });
83
-
84
- router.post('/', validator, async (c) => {
85
- const data = c.req.valid('json');
86
- // data is fully typed: { name: string, email: string, age: number }
87
- return c.json({
88
- success: true,
89
- user: data
90
- });
91
- });
92
-
93
- export default router;
94
- \`\`\`
95
-
96
- ### API Calling Agents
97
-
98
- APIs can call agents directly:
99
-
100
- \`\`\`typescript
101
- import { createRouter } from '@agentuity/runtime';
102
-
103
- const router = createRouter();
104
-
105
- router.get('/', async (c) => {
106
- // Call an agent from the agents/ folder
107
- const result = await c.agent.hello.run({ name: 'API Caller', age: 42 });
108
-
109
- return c.json({
110
- success: true,
111
- agentResult: result,
112
- });
113
- });
114
-
115
- router.post('/with-input', async (c) => {
116
- const body = await c.req.json();
117
- const { name, age } = body;
118
-
119
- // Call agent with dynamic input
120
- const result = await c.agent.simple.run({ name, age });
121
-
122
- return c.json({
123
- success: true,
124
- agentResult: result,
125
- });
126
- });
127
-
128
- export default router;
129
- \`\`\`
130
-
131
- ### API with Logging
132
-
133
- \`\`\`typescript
134
- import { createRouter } from '@agentuity/runtime';
135
-
136
- const router = createRouter();
137
-
138
- router.get('/log-test', (c) => {
139
- c.var.logger.info('Info message');
140
- c.var.logger.error('Error message');
141
- c.var.logger.warn('Warning message');
142
- c.var.logger.debug('Debug message');
143
- c.var.logger.trace('Trace message');
144
-
145
- return c.text('Check logs');
146
- });
147
-
148
- export default router;
149
- \`\`\`
150
-
151
- ## Route Context (c)
152
-
153
- The route handler receives a Hono context object with:
154
-
155
- - **c.req** - Request object (c.req.json(), c.req.param(), c.req.query(), etc.)
156
- - **c.json()** - Return JSON response
157
- - **c.text()** - Return text response
158
- - **c.html()** - Return HTML response
159
- - **c.redirect()** - Redirect to URL
160
- - **c.var.logger** - Structured logger (info, warn, error, debug, trace)
161
- - **Import agents directly** - Import and call agents directly instead of using c.var.agent
162
- - **c.var.kv** - Key-value storage
163
- - **c.var.vector** - Vector storage
164
- - **c.var.stream** - Stream management
165
-
166
- ## HTTP Methods
167
-
168
- \`\`\`typescript
169
- const router = createRouter();
170
-
171
- router.get('/path', (c) => { /* ... */ });
172
- router.post('/path', (c) => { /* ... */ });
173
- router.put('/path', (c) => { /* ... */ });
174
- router.patch('/path', (c) => { /* ... */ });
175
- router.delete('/path', (c) => { /* ... */ });
176
- router.options('/path', (c) => { /* ... */ });
177
- \`\`\`
178
-
179
- ## Path Parameters
180
-
181
- \`\`\`typescript
182
- // GET /api/users/:id
183
- router.get('/:id', (c) => {
184
- const id = c.req.param('id');
185
- return c.json({ userId: id });
186
- });
187
-
188
- // GET /api/posts/:postId/comments/:commentId
189
- router.get('/:postId/comments/:commentId', (c) => {
190
- const postId = c.req.param('postId');
191
- const commentId = c.req.param('commentId');
192
- return c.json({ postId, commentId });
193
- });
194
- \`\`\`
195
-
196
- ## Query Parameters
197
-
198
- \`\`\`typescript
199
- // GET /api/search?q=hello&limit=10
200
- router.get('/search', (c) => {
201
- const query = c.req.query('q');
202
- const limit = c.req.query('limit') || '20';
203
- return c.json({ query, limit: parseInt(limit) });
204
- });
205
- \`\`\`
206
-
207
- ## Request Body
208
-
209
- \`\`\`typescript
210
- // JSON body
211
- router.post('/', async (c) => {
212
- const body = await c.req.json();
213
- return c.json({ received: body });
214
- });
215
-
216
- // Form data
217
- router.post('/upload', async (c) => {
218
- const formData = await c.req.formData();
219
- const file = formData.get('file');
220
- return c.json({ fileName: file?.name });
221
- });
222
- \`\`\`
223
-
224
- ## Error Handling
225
-
226
- \`\`\`typescript
227
- router.get('/', async (c) => {
228
- try {
229
- const result = await c.agent.myAgent.run({ data: 'test' });
230
- return c.json({ success: true, result });
231
- } catch (error) {
232
- c.var.logger.error('Agent call failed:', error);
233
- return c.json(
234
- {
235
- success: false,
236
- error: error instanceof Error ? error.message : String(error),
237
- },
238
- 500
239
- );
240
- }
241
- });
242
- \`\`\`
243
-
244
- ## Response Types
245
-
246
- \`\`\`typescript
247
- // JSON response
248
- return c.json({ data: 'value' });
249
-
250
- // Text response
251
- return c.text('Hello World');
252
-
253
- // HTML response
254
- return c.html('<h1>Hello</h1>');
255
-
256
- // Custom status code
257
- return c.json({ error: 'Not found' }, 404);
258
-
259
- // Redirect
260
- return c.redirect('/new-path');
261
-
262
- // Headers
263
- return c.json({ data: 'value' }, 200, {
264
- 'X-Custom-Header': 'value',
265
- });
266
- \`\`\`
267
-
268
- ## Rules
19
+ /**
20
+ * Get the raw prompt content without hash.
21
+ */
22
+ export function getPromptContent(): string {
23
+ return apiPromptContent;
24
+ }
269
25
 
270
- - Each API folder name becomes the route name (e.g., \`status/\` → \`/api/status\`)
271
- - **route.ts** must export default the router instance
272
- - Use c.var.logger for logging, not console.log
273
- - All agents are accessible via c.agent.{agentName}
274
- - Validation should use @agentuity/schema or any Standard Schema compatible library
275
- - Return appropriate HTTP status codes
276
- - APIs run at \`/api/{folderName}\` by default
277
- `;
26
+ /**
27
+ * Generate the API prompt with hash comment.
28
+ */
29
+ export function generateLLMPrompt(): string {
30
+ return appendHashComment(apiPromptContent);
278
31
  }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Prompt file versioning utilities.
3
+ *
4
+ * Hash format at end of file: <!-- prompt_hash: [hash] -->
5
+ *
6
+ * - hash: SHA256 of file content (excluding the hash line)
7
+ *
8
+ * This allows detecting if the source template has changed.
9
+ */
10
+
11
+ const HASH_REGEX = /\n?<!-- prompt_hash: ([a-f0-9]+) -->$/;
12
+
13
+ /**
14
+ * Compute SHA256 hash of content using Bun's built-in hasher.
15
+ */
16
+ export function computeHash(content: string): string {
17
+ const hasher = new Bun.CryptoHasher('sha256');
18
+ hasher.update(content);
19
+ return hasher.digest().toHex();
20
+ }
21
+
22
+ /**
23
+ * Strip the hash comment from content.
24
+ */
25
+ export function stripHashComment(content: string): string {
26
+ return content.replace(HASH_REGEX, '');
27
+ }
28
+
29
+ /**
30
+ * Extract hash from file content.
31
+ * Returns null if no hash comment found.
32
+ */
33
+ export function extractHash(content: string): string | null {
34
+ const match = content.match(HASH_REGEX);
35
+ return match ? match[1] : null;
36
+ }
37
+
38
+ /**
39
+ * Generate content with hash comment appended.
40
+ */
41
+ export function appendHashComment(content: string): string {
42
+ const hash = computeHash(content);
43
+ return `${content}\n<!-- prompt_hash: ${hash} -->`;
44
+ }
45
+
46
+ /**
47
+ * Check if a file needs to be updated based on hash comparison.
48
+ *
49
+ * @param fileContent - Current file content (with hash comment)
50
+ * @param sourceContent - Source template content (without hash comment)
51
+ * @returns true if file needs to be updated (hashes differ)
52
+ */
53
+ export function needsUpdate(fileContent: string, sourceContent: string): boolean {
54
+ const fileHash = extractHash(fileContent);
55
+ if (!fileHash) {
56
+ return true;
57
+ }
58
+
59
+ const sourceHash = computeHash(sourceContent);
60
+ return fileHash !== sourceHash;
61
+ }