@standardagents/cli 0.11.0-next.ab7e1ea → 0.11.0-next.af971ae
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chat/src/App.tsx +1 -1
- package/chat/src/components/MessageList.tsx +94 -40
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/chat/src/App.tsx
CHANGED
|
@@ -110,7 +110,7 @@ function AuthenticatedApp() {
|
|
|
110
110
|
</button>
|
|
111
111
|
|
|
112
112
|
{currentThreadId ? (
|
|
113
|
-
<ThreadProvider key={currentThreadId} threadId={currentThreadId} live>
|
|
113
|
+
<ThreadProvider key={currentThreadId} threadId={currentThreadId} live useWorkblocks>
|
|
114
114
|
<Chat
|
|
115
115
|
thread={threads.find(t => t.id === currentThreadId)}
|
|
116
116
|
onUpdateTitle={(title) => updateThreadTitle(currentThreadId, title)}
|
|
@@ -228,62 +228,114 @@ function WorkItemStatus({ status }: { status: 'pending' | 'success' | 'error' |
|
|
|
228
228
|
return <SpinnerIcon className="w-3.5 h-3.5 text-[var(--text-secondary)]" />
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
+
// Chevron icon for collapse/expand
|
|
232
|
+
function ChevronIcon({ className, expanded }: { className?: string; expanded: boolean }) {
|
|
233
|
+
return (
|
|
234
|
+
<svg
|
|
235
|
+
className={`${className} transition-transform duration-200 ${expanded ? 'rotate-90' : ''}`}
|
|
236
|
+
viewBox="0 0 24 24"
|
|
237
|
+
fill="none"
|
|
238
|
+
stroke="currentColor"
|
|
239
|
+
strokeWidth={2}
|
|
240
|
+
strokeLinecap="round"
|
|
241
|
+
strokeLinejoin="round"
|
|
242
|
+
>
|
|
243
|
+
<path d="M9 18l6-6-6-6" />
|
|
244
|
+
</svg>
|
|
245
|
+
)
|
|
246
|
+
}
|
|
247
|
+
|
|
231
248
|
// Workblock component
|
|
232
|
-
function Workblock({ workblock }: { workblock: WorkMessage }) {
|
|
249
|
+
function Workblock({ workblock, isLast, threadLoading }: { workblock: WorkMessage; isLast?: boolean; threadLoading?: boolean }) {
|
|
250
|
+
const [isExpanded, setIsExpanded] = useState(false)
|
|
233
251
|
const { text } = parseMessageContent(workblock.content)
|
|
234
252
|
const isPending = workblock.status === 'pending'
|
|
235
253
|
|
|
236
254
|
// Group work items by tool_call_id to pair calls with results
|
|
237
255
|
const toolCalls = workblock.workItems.filter(item => item.type === 'tool_call')
|
|
256
|
+
const toolResults = workblock.workItems.filter(item => item.type === 'tool_result')
|
|
238
257
|
|
|
239
|
-
// Count completed vs total
|
|
258
|
+
// Count completed vs total and check for errors
|
|
240
259
|
const completedCount = toolCalls.filter(item => item.status === 'success' || item.status === 'error').length
|
|
260
|
+
const errorCount = toolCalls.filter(item => item.status === 'error').length
|
|
241
261
|
const totalCount = toolCalls.length
|
|
262
|
+
const hasErrors = errorCount > 0
|
|
263
|
+
|
|
264
|
+
// Get most recent info for the badge (last tool result or last tool call name)
|
|
265
|
+
const lastResult = toolResults[toolResults.length - 1]
|
|
266
|
+
const lastToolCall = toolCalls[toolCalls.length - 1]
|
|
267
|
+
const badgeText = lastResult?.content
|
|
268
|
+
? (lastResult.content.length > 40 ? lastResult.content.slice(0, 40) + '...' : lastResult.content)
|
|
269
|
+
: lastToolCall?.name
|
|
270
|
+
? formatToolName(lastToolCall.name)
|
|
271
|
+
: null
|
|
272
|
+
|
|
273
|
+
// Determine status label and color
|
|
274
|
+
const statusLabel = isPending ? 'Working' : hasErrors ? 'Completed with errors' : 'Completed'
|
|
275
|
+
const statusColor = isPending ? 'text-violet-500' : hasErrors ? 'text-amber-500' : 'text-emerald-500'
|
|
276
|
+
|
|
277
|
+
// Show loader if this is the last workblock and thread is still loading
|
|
278
|
+
const showLoader = isLast && threadLoading && !isPending
|
|
242
279
|
|
|
243
280
|
return (
|
|
244
|
-
<div className="animate-fade-in
|
|
245
|
-
{/*
|
|
281
|
+
<div className="animate-fade-in">
|
|
282
|
+
{/* Workblock panel */}
|
|
246
283
|
<div className={`bg-[var(--bg-tertiary)] border border-[var(--border-primary)] rounded-xl overflow-hidden max-w-[85%] ${isPending ? 'workblock-shimmer' : ''}`}>
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
284
|
+
{/* Header - clickable to toggle */}
|
|
285
|
+
<button
|
|
286
|
+
onClick={() => setIsExpanded(!isExpanded)}
|
|
287
|
+
className="w-full px-3 py-2 bg-[var(--bg-hover)] flex items-center gap-2 hover:bg-[var(--bg-tertiary)] transition-colors text-left"
|
|
288
|
+
>
|
|
289
|
+
<ChevronIcon className="w-3.5 h-3.5 text-[var(--text-tertiary)]" expanded={isExpanded} />
|
|
290
|
+
<span className={`text-xs font-medium uppercase tracking-wide ${statusColor}`}>
|
|
291
|
+
{statusLabel}
|
|
292
|
+
</span>
|
|
293
|
+
{(isPending || showLoader) && (
|
|
294
|
+
<SpinnerIcon className="w-3 h-3 text-violet-500" />
|
|
295
|
+
)}
|
|
296
|
+
{/* Badge with most recent info when collapsed */}
|
|
297
|
+
{!isExpanded && badgeText && (
|
|
298
|
+
<span className="ml-auto text-xs text-[var(--text-tertiary)] bg-[var(--bg-secondary)] px-2 py-0.5 rounded truncate max-w-[200px]">
|
|
299
|
+
{badgeText}
|
|
251
300
|
</span>
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
)
|
|
255
|
-
</div>
|
|
256
|
-
{totalCount > 1 && (
|
|
257
|
-
<span className="text-xs text-[var(--text-tertiary)]">
|
|
301
|
+
)}
|
|
302
|
+
{isExpanded && totalCount > 1 && (
|
|
303
|
+
<span className="ml-auto text-xs text-[var(--text-tertiary)]">
|
|
258
304
|
{completedCount}/{totalCount}
|
|
259
305
|
</span>
|
|
260
306
|
)}
|
|
261
|
-
</
|
|
307
|
+
</button>
|
|
308
|
+
|
|
309
|
+
{/* Collapsible content */}
|
|
310
|
+
{isExpanded && (
|
|
311
|
+
<>
|
|
312
|
+
{/* Text content (thinking/reasoning) inside the workblock */}
|
|
313
|
+
{text && text.trim() && (
|
|
314
|
+
<div className="px-3 py-2.5 border-t border-[var(--border-primary)] bg-[var(--bg-secondary)]">
|
|
315
|
+
<p className="text-sm text-[var(--text-secondary)] italic whitespace-pre-wrap break-words">
|
|
316
|
+
{text.trim()}
|
|
317
|
+
</p>
|
|
318
|
+
</div>
|
|
319
|
+
)}
|
|
262
320
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
321
|
+
{/* Tool calls list */}
|
|
322
|
+
<div className="divide-y divide-[var(--border-primary)] border-t border-[var(--border-primary)]">
|
|
323
|
+
{toolCalls.map((item, index) => (
|
|
324
|
+
<div
|
|
325
|
+
key={item.id}
|
|
326
|
+
className="px-3 py-2.5 flex items-center gap-3 animate-slide-in"
|
|
327
|
+
style={{ animationDelay: `${index * 50}ms` }}
|
|
328
|
+
>
|
|
329
|
+
<WorkItemStatus status={item.status} />
|
|
330
|
+
<span className="text-sm text-[var(--text-primary)]">
|
|
331
|
+
{formatToolName(item.name)}
|
|
332
|
+
</span>
|
|
333
|
+
</div>
|
|
334
|
+
))}
|
|
274
335
|
</div>
|
|
275
|
-
|
|
276
|
-
|
|
336
|
+
</>
|
|
337
|
+
)}
|
|
277
338
|
</div>
|
|
278
|
-
|
|
279
|
-
{/* Text content if present */}
|
|
280
|
-
{text && (
|
|
281
|
-
<div className="max-w-[85%]">
|
|
282
|
-
<div className="whitespace-pre-wrap break-words text-[15px] leading-relaxed text-[var(--text-primary)]">
|
|
283
|
-
{text}
|
|
284
|
-
</div>
|
|
285
|
-
</div>
|
|
286
|
-
)}
|
|
287
339
|
</div>
|
|
288
340
|
)
|
|
289
341
|
}
|
|
@@ -717,7 +769,7 @@ function ThinkingIndicator() {
|
|
|
717
769
|
}
|
|
718
770
|
|
|
719
771
|
export function MessageList() {
|
|
720
|
-
const { messages, loading, threadId } = useThread()
|
|
772
|
+
const { workblocks: messages, loading, threadId } = useThread()
|
|
721
773
|
const bottomRef = useRef<HTMLDivElement>(null)
|
|
722
774
|
|
|
723
775
|
const scrollToBottom = useCallback(() => {
|
|
@@ -771,10 +823,12 @@ export function MessageList() {
|
|
|
771
823
|
|
|
772
824
|
return (
|
|
773
825
|
<div className="py-6 px-4 space-y-6">
|
|
774
|
-
{messages.map((msg) => {
|
|
826
|
+
{messages.map((msg, index) => {
|
|
827
|
+
const isLast = index === messages.length - 1
|
|
828
|
+
|
|
775
829
|
// Handle workblocks
|
|
776
830
|
if (isWorkMessage(msg)) {
|
|
777
|
-
return <Workblock key={msg.id} workblock={msg} />
|
|
831
|
+
return <Workblock key={msg.id} workblock={msg} isLast={isLast} threadLoading={loading} />
|
|
778
832
|
}
|
|
779
833
|
|
|
780
834
|
// Skip system and tool messages (tool messages are shown in workblocks)
|
package/dist/index.js
CHANGED
|
@@ -283,15 +283,12 @@ Prompts define system instructions, model selection, and available tools for LLM
|
|
|
283
283
|
| \`toolDescription\` | \`string\` | Yes | Description shown when used as a tool |
|
|
284
284
|
| \`prompt\` | \`string \\| StructuredPrompt\` | Yes | System instructions |
|
|
285
285
|
| \`model\` | \`string\` | Yes | Model name to use (references \`agents/models/\`) |
|
|
286
|
-
| \`tools\` | \`(string \\| ToolConfig)[]\` | No | Available tools for
|
|
287
|
-
| \`handoffAgents\` | \`string[]\` | No | Agents this prompt can hand off to |
|
|
286
|
+
| \`tools\` | \`(string \\| ToolConfig)[]\` | No | Available tools (include ai_human agent names for handoffs) |
|
|
288
287
|
| \`includeChat\` | \`boolean\` | No | Include full conversation history |
|
|
289
288
|
| \`includePastTools\` | \`boolean\` | No | Include previous tool results |
|
|
290
289
|
| \`parallelToolCalls\` | \`boolean\` | No | Allow multiple concurrent tool calls |
|
|
291
290
|
| \`toolChoice\` | \`'auto' \\| 'none' \\| 'required'\` | No | Tool calling strategy |
|
|
292
291
|
| \`requiredSchema\` | \`z.ZodObject\` | No | Input validation when called as tool |
|
|
293
|
-
| \`beforeTool\` | \`string\` | No | Tool to run before LLM request |
|
|
294
|
-
| \`afterTool\` | \`string\` | No | Tool to run after LLM response |
|
|
295
292
|
| \`reasoning\` | \`ReasoningConfig\` | No | Extended thinking configuration |
|
|
296
293
|
|
|
297
294
|
## Basic Example
|
|
@@ -491,7 +488,7 @@ export default defineAgent({
|
|
|
491
488
|
});
|
|
492
489
|
\`\`\`
|
|
493
490
|
|
|
494
|
-
Other prompts can then include
|
|
491
|
+
Other prompts can then include the agent name in their \`tools\` array to enable handoffs.
|
|
495
492
|
|
|
496
493
|
## Stop Conditions (Priority Order)
|
|
497
494
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/templates/root.ts","../src/templates/models.ts","../src/templates/prompts.ts","../src/templates/agents.ts","../src/templates/tools.ts","../src/templates/hooks.ts","../src/templates/api.ts","../src/commands/scaffold.ts","../src/commands/init.ts","../src/commands/init-chat.ts","../src/index.ts"],"names":["path","fs","pkg","resolve","__dirname","fileURLToPath","prompt","readline","runCommand","spawn","detectPackageManager","selectPackageManager"],"mappings":";;;;;;;;;;;;;;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,OAAA,EAAS,CAAC,OAAA,KAAoB;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,OAAA,KAAoB;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,OAAA,KAAoB;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACxC,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,OAAA,KAAoB;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACtC,CAAA;AAAA,EACA,GAAA,EAAK,CAAC,OAAA,KAAoB;AACxB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrB;AACF,CAAA;;;AClBO,IAAM,cAAA,GAAiB,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACAvB,IAAM,gBAAA,GAAmB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAzB,IAAM,iBAAA,GAAoB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACA1B,IAAM,gBAAA,GAAmB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAzB,IAAM,eAAA,GAAkB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAxB,IAAM,eAAA,GAAkB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import chalk from 'chalk';\n\nexport const logger = {\n success: (message: string) => {\n console.log(chalk.green('✓'), message);\n },\n error: (message: string) => {\n console.log(chalk.red('✗'), message);\n },\n warning: (message: string) => {\n console.log(chalk.yellow('⚠'), message);\n },\n info: (message: string) => {\n console.log(chalk.blue('ℹ'), message);\n },\n log: (message: string) => {\n console.log(message);\n },\n};\n","export const ROOT_CLAUDE_MD = `# Standard Agents\n\nThis project uses Standard Agents - a framework for building AI agents on Cloudflare Workers.\n\n## Architecture Overview\n\nStandard Agents uses a **composition model** where four core components work together:\n\n\\`\\`\\`\nModel → Prompt → Agent → Thread\n │ │ │ │\n │ │ │ └─ Conversation instance (Durable Object)\n │ │ └─ Orchestrates conversation flow\n │ └─ System instructions + tools\n └─ LLM provider configuration\n\\`\\`\\`\n\n**Models** define which LLM to use (provider, model ID, pricing, fallbacks).\n**Prompts** define what the LLM should do (system instructions, available tools).\n**Agents** orchestrate conversations (which prompt, stop conditions, turn limits).\n**Threads** are individual conversation instances with persistent storage.\n\n## How Components Compose\n\n### Basic Flow\n1. User creates a thread with an agent\n2. Agent uses its configured prompt\n3. Prompt specifies the model and tools\n4. LLM responds, potentially calling tools\n5. Tools execute and return results\n6. Loop continues until stop condition\n\n### Sub-Prompts (Prompts as Tools)\nPrompts can call other prompts as tools. This enables:\n- **Specialized reasoning**: A main prompt delegates to expert sub-prompts\n- **Structured outputs**: Sub-prompt validates and formats data\n- **Context isolation**: Sub-prompt gets fresh context without full history\n\n\\`\\`\\`typescript\n// Main prompt can call 'data_extractor' as a tool\ndefinePrompt({\n name: 'main_assistant',\n tools: ['data_extractor'], // Another prompt exposed as tool\n // ...\n});\n\\`\\`\\`\n\n### Agent Handoffs (Agents as Tools)\nAgents can delegate to other agents entirely:\n- **Specialization**: Route to domain-specific agents\n- **Escalation**: Hand off to more capable agents\n- **Workflows**: Chain agents for multi-step processes\n\n\\`\\`\\`typescript\ndefineAgent({\n name: 'triage_agent',\n exposeAsTool: true,\n toolDescription: 'Hand off to triage for initial assessment',\n // ...\n});\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\nagents/\n├── CLAUDE.md # This file\n├── Thread.ts # Durable Object for conversation threads\n├── AgentBuilder.ts # Durable Object for metadata\n├── agents/ # Agent definitions (defineAgent)\n│ └── CLAUDE.md\n├── prompts/ # Prompt definitions (definePrompt)\n│ └── CLAUDE.md\n├── models/ # Model configurations (defineModel)\n│ └── CLAUDE.md\n├── tools/ # Custom tools (defineTool)\n│ └── CLAUDE.md\n├── hooks/ # Lifecycle hooks (defineHook)\n│ └── CLAUDE.md\n└── api/ # Thread API endpoints (defineThreadEndpoint)\n └── CLAUDE.md\n\\`\\`\\`\n\nFiles are **auto-discovered** at runtime. No manual registration needed.\n\n## FlowState\n\n\\`FlowState\\` is the central state object available in tools and hooks:\n\n\\`\\`\\`typescript\ninterface FlowState {\n thread: {\n id: string; // Thread identifier\n instance: DurableThread; // Durable Object instance\n };\n agent: AgentConfig; // Current agent configuration\n prompt: PromptConfig; // Current prompt configuration\n model: ModelConfig; // Current model configuration\n messages: Message[]; // Conversation history\n env: Env; // Cloudflare Worker environment\n rootState: FlowState; // Parent state (for sub-prompts)\n}\n\\`\\`\\`\n\nAccess in tools:\n\\`\\`\\`typescript\nexport default defineTool('...', schema, async (flow, args) => {\n const threadId = flow.thread.id;\n const messages = flow.messages;\n // ...\n});\n\\`\\`\\`\n\n## Quick Reference\n\n| Function | Purpose | Directory |\n|----------|---------|-----------|\n| \\`defineModel()\\` | Configure LLM provider | \\`agents/models/\\` |\n| \\`definePrompt()\\` | System instructions + tools | \\`agents/prompts/\\` |\n| \\`defineAgent()\\` | Conversation orchestration | \\`agents/agents/\\` |\n| \\`defineTool()\\` | Custom tool functions | \\`agents/tools/\\` |\n| \\`defineHook()\\` | Lifecycle interception | \\`agents/hooks/\\` |\n| \\`defineThreadEndpoint()\\` | Custom API routes | \\`agents/api/\\` |\n\n## Runtime Utilities\n\nImport from \\`@standardagents/builder\\`:\n\n\\`\\`\\`typescript\nimport {\n queueTool, // Queue another tool for execution\n injectMessage, // Add message without triggering execution\n getMessages, // Retrieve message history\n emitThreadEvent, // Send custom WebSocket events\n} from '@standardagents/builder';\n\\`\\`\\`\n\n## Documentation\n\nFull documentation: https://docs.standardagentbuilder.com\n\n- [Architecture Overview](https://docs.standardagentbuilder.com/introduction/architecture)\n- [Models](https://docs.standardagentbuilder.com/core-concepts/models)\n- [Prompts](https://docs.standardagentbuilder.com/core-concepts/prompts)\n- [Agents](https://docs.standardagentbuilder.com/core-concepts/agents)\n- [Tools](https://docs.standardagentbuilder.com/core-concepts/tools)\n- [Hooks](https://docs.standardagentbuilder.com/core-concepts/hooks)\n- [FlowState](https://docs.standardagentbuilder.com/core-concepts/flowstate)\n- [Thread API](https://docs.standardagentbuilder.com/core-concepts/api)\n`;\n","export const MODELS_CLAUDE_MD = `# Model Definitions\n\nModels define which LLM provider and model to use for prompts.\n\n## Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this model configuration |\n| \\`provider\\` | \\`'openai' \\\\| 'anthropic' \\\\| 'openrouter' \\\\| 'google'\\` | Yes | LLM provider |\n| \\`model\\` | \\`string\\` | Yes | Model ID sent to provider API |\n| \\`fallbacks\\` | \\`string[]\\` | No | Fallback model names to try if primary fails |\n| \\`inputPrice\\` | \\`number\\` | No | Cost per 1M input tokens (USD) |\n| \\`outputPrice\\` | \\`number\\` | No | Cost per 1M output tokens (USD) |\n| \\`cachedPrice\\` | \\`number\\` | No | Cost per 1M cached input tokens |\n| \\`includedProviders\\` | \\`string[]\\` | No | Provider prefixes for OpenRouter routing |\n\n## Example\n\n\\`\\`\\`typescript\nimport { defineModel } from '@standardagents/builder';\n\nexport default defineModel({\n name: 'default',\n provider: 'openrouter',\n model: 'google/gemini-3-flash-preview',\n fallbacks: ['fast', 'cheap-heavy'],\n});\n\\`\\`\\`\n\n## Recommended Models (OpenRouter)\n\n| Use Case | Model ID | Description |\n|----------|----------|-------------|\n| Fast/Cheap | \\`z-ai/glm-4.5-air\\` | Quick responses, low cost |\n| Mid-tier | \\`google/gemini-3-flash-preview\\` | Good balance of speed and quality |\n| Cheap Heavy | \\`z-ai/glm-4.7\\` | More capable, still affordable |\n| Heavy | \\`google/gemini-3-pro-preview\\` | Most capable, for complex tasks |\n\n**⚠️ Google Models**: When using Google models (\\`google/gemini-*\\`), you must enable \\`reasoning\\` in your prompt configuration or tool calls will fail. See the prompts CLAUDE.md for details.\n\n## Provider API Keys\n\nSet these environment variables in \\`.dev.vars\\` (local) or Cloudflare secrets (production):\n\n| Provider | Environment Variable |\n|----------|---------------------|\n| OpenAI | \\`OPENAI_API_KEY\\` |\n| Anthropic | \\`ANTHROPIC_API_KEY\\` |\n| OpenRouter | \\`OPENROUTER_API_KEY\\` |\n| Google | \\`GOOGLE_API_KEY\\` |\n\n## Fallback Strategy\n\nWhen a model fails, fallbacks are tried in order:\n1. Primary model (2 attempts)\n2. First fallback (2 attempts)\n3. Second fallback (2 attempts)\n4. ...and so on\n\nRetries occur on: network errors, rate limits (429), server errors (5xx), auth errors (401).\n\n## OpenRouter Configuration\n\nFor OpenRouter, use the full model path:\n\n\\`\\`\\`typescript\nexport default defineModel({\n name: 'heavy',\n provider: 'openrouter',\n model: 'google/gemini-3-pro-preview',\n includedProviders: ['google'], // Prefer Google's servers\n});\n\\`\\`\\`\n\n## Best Practices\n\n- **Name by use case**, not model ID (e.g., \\`fast\\`, \\`default\\`, \\`heavy\\`)\n- **Configure fallbacks** for production reliability\n- **Set pricing** for cost tracking in logs\n- **Use environment variables** for API keys, never hardcode\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/model\n`;\n","export const PROMPTS_CLAUDE_MD = `# Prompt Definitions\n\nPrompts define system instructions, model selection, and available tools for LLM interactions.\n\n## Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this prompt |\n| \\`toolDescription\\` | \\`string\\` | Yes | Description shown when used as a tool |\n| \\`prompt\\` | \\`string \\\\| StructuredPrompt\\` | Yes | System instructions |\n| \\`model\\` | \\`string\\` | Yes | Model name to use (references \\`agents/models/\\`) |\n| \\`tools\\` | \\`(string \\\\| ToolConfig)[]\\` | No | Available tools for LLM |\n| \\`handoffAgents\\` | \\`string[]\\` | No | Agents this prompt can hand off to |\n| \\`includeChat\\` | \\`boolean\\` | No | Include full conversation history |\n| \\`includePastTools\\` | \\`boolean\\` | No | Include previous tool results |\n| \\`parallelToolCalls\\` | \\`boolean\\` | No | Allow multiple concurrent tool calls |\n| \\`toolChoice\\` | \\`'auto' \\\\| 'none' \\\\| 'required'\\` | No | Tool calling strategy |\n| \\`requiredSchema\\` | \\`z.ZodObject\\` | No | Input validation when called as tool |\n| \\`beforeTool\\` | \\`string\\` | No | Tool to run before LLM request |\n| \\`afterTool\\` | \\`string\\` | No | Tool to run after LLM response |\n| \\`reasoning\\` | \\`ReasoningConfig\\` | No | Extended thinking configuration |\n\n## Basic Example\n\n\\`\\`\\`typescript\nimport { definePrompt } from '@standardagents/builder';\n\nexport default definePrompt({\n name: 'customer_support',\n toolDescription: 'Handle customer support inquiries',\n model: 'default',\n prompt: \\`You are a helpful customer support agent.\nAlways be polite and professional.\nIf you cannot help, escalate to a human.\\`,\n tools: ['search_knowledge_base', 'create_ticket'],\n includeChat: true,\n});\n\\`\\`\\`\n\n## Structured Prompts\n\nInclude other prompts for reusable instruction blocks:\n\n\\`\\`\\`typescript\nexport default definePrompt({\n name: 'main_assistant',\n toolDescription: 'Primary assistant',\n model: 'default',\n prompt: [\n { type: 'text', content: 'You are a helpful assistant.\\\\n\\\\n' },\n { type: 'include', prompt: 'common_rules' }, // Includes another prompt\n { type: 'text', content: '\\\\n\\\\nBe concise.' },\n ],\n});\n\\`\\`\\`\n\n## Tool Configuration\n\nTools can be simple names or detailed configs:\n\n\\`\\`\\`typescript\ntools: [\n 'simple_tool', // Just the tool name\n {\n name: 'complex_tool',\n includeTextResponse: true, // Include sub-prompt text in result\n includeToolCalls: false, // Exclude sub-prompt tool calls\n includeErrors: true, // Include error details\n initUserMessageProperty: 'query', // Use this arg as initial message\n },\n],\n\\`\\`\\`\n\n## Input Validation\n\nValidate inputs when prompt is called as a tool:\n\n\\`\\`\\`typescript\nimport { z } from 'zod';\n\nexport default definePrompt({\n name: 'data_extractor',\n toolDescription: 'Extract structured data from text',\n model: 'default',\n prompt: 'Extract the requested data from the input.',\n requiredSchema: z.object({\n text: z.string().describe('Text to extract from'),\n fields: z.array(z.string()).describe('Fields to extract'),\n }),\n});\n\\`\\`\\`\n\n## Extended Thinking (Reasoning)\n\nEnable for complex reasoning tasks:\n\n\\`\\`\\`typescript\nexport default definePrompt({\n name: 'code_reviewer',\n toolDescription: 'Review code for issues',\n model: 'heavy',\n prompt: 'Review the code thoroughly...',\n reasoning: {\n effort: 'high', // 'low' | 'medium' | 'high'\n maxTokens: 16000, // Max thinking tokens\n exclude: true, // Don't include thinking in response\n },\n});\n\\`\\`\\`\n\n**⚠️ Google Models Require Reasoning**: When using Google models (\\`google/gemini-*\\`) via OpenRouter, you **must** include \\`reasoning\\` configuration or tool calls will fail. At minimum:\n\n\\`\\`\\`typescript\nreasoning: {\n effort: 'low', // Can be 'low', 'medium', or 'high'\n},\n\\`\\`\\`\n\n## Best Practices\n\n- **Write clear instructions** - Structure with headers and bullet points\n- **Describe tools thoroughly** - LLMs decide based on descriptions\n- **Validate inputs with Zod** - Catch errors early\n- **Use \\`includeChat\\`** for conversational context\n- **Name by purpose**, not model (e.g., \\`support_agent\\` not \\`gpt4_prompt\\`)\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/prompt\n`;\n","export const AGENTS_CLAUDE_MD = `# Agent Definitions\n\nAgents orchestrate conversations by defining prompts, stop conditions, and turn limits.\n\n## Agent Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this agent |\n| \\`type\\` | \\`'ai_human' \\\\| 'dual_ai'\\` | No | Conversation type (default: \\`ai_human\\`) |\n| \\`sideA\\` | \\`SideConfig\\` | Yes | Configuration for side A (AI in ai_human) |\n| \\`sideB\\` | \\`SideConfig\\` | No | Configuration for side B (required for dual_ai) |\n| \\`maxSessionTurns\\` | \\`number\\` | No | Max total turns across both sides |\n| \\`exposeAsTool\\` | \\`boolean\\` | No | Allow other prompts to hand off to this agent |\n| \\`toolDescription\\` | \\`string\\` | No | Description when used as tool (required if exposeAsTool) |\n| \\`tags\\` | \\`string[]\\` | No | Tags for categorization and filtering |\n\n## Side Configuration\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`label\\` | \\`string\\` | No | Display name for this side |\n| \\`prompt\\` | \\`string\\` | Yes | Prompt name to use (references \\`agents/prompts/\\`) |\n| \\`stopOnResponse\\` | \\`boolean\\` | No | Stop turn when LLM returns text (default: true) |\n| \\`stopTool\\` | \\`string\\` | No | Tool that stops this side's turn |\n| \\`stopToolResponseProperty\\` | \\`string\\` | No | Property to extract from stop tool result |\n| \\`endConversationTool\\` | \\`string\\` | No | Tool that ends the entire conversation |\n| \\`maxTurns\\` | \\`number\\` | No | Maximum turns for this side |\n| \\`manualStopCondition\\` | \\`boolean\\` | No | Enable custom stop handling via hooks |\n\n## Basic Example (AI-Human)\n\n\\`\\`\\`typescript\nimport { defineAgent } from '@standardagents/builder';\n\nexport default defineAgent({\n name: 'support_agent',\n type: 'ai_human',\n sideA: {\n label: 'Support',\n prompt: 'customer_support',\n stopOnResponse: true,\n endConversationTool: 'close_ticket',\n maxTurns: 50,\n },\n tags: ['support', 'tier-1'],\n});\n\\`\\`\\`\n\n## Dual-AI Example\n\nTwo AI agents conversing (e.g., debate, iterative refinement):\n\n\\`\\`\\`typescript\nexport default defineAgent({\n name: 'code_review_debate',\n type: 'dual_ai',\n maxSessionTurns: 20,\n sideA: {\n label: 'Reviewer',\n prompt: 'code_reviewer',\n stopOnResponse: true,\n },\n sideB: {\n label: 'Developer',\n prompt: 'code_defender',\n stopOnResponse: true,\n },\n});\n\\`\\`\\`\n\n## Agent Handoffs\n\nExpose an agent for handoffs from other prompts:\n\n\\`\\`\\`typescript\nexport default defineAgent({\n name: 'escalation_agent',\n type: 'ai_human',\n exposeAsTool: true,\n toolDescription: 'Escalate to senior support for complex issues',\n sideA: {\n prompt: 'senior_support',\n },\n});\n\\`\\`\\`\n\nOther prompts can then include it in their \\`handoffAgents\\` array.\n\n## Stop Conditions (Priority Order)\n\n1. **endConversationTool** - Ends entire conversation (highest priority)\n2. **stopTool** - Ends current side's turn\n3. **maxTurns** - Ends side's participation when reached\n4. **stopOnResponse** - Ends turn when LLM returns text\n5. **maxSessionTurns** - Ends conversation (hard limit: 250)\n\n## Naming Convention\n\nAgent names **must** end with the \\`_agent\\` suffix (e.g., \\`support_agent\\`, \\`research_agent\\`).\nThis convention is enforced by the builder UI and makes agents easily identifiable in logs and code.\n\n## Best Practices\n\n- **Use descriptive names** (\\`customer_support_agent\\` not \\`agent1\\`)\n- **Always use the _agent suffix** - names like \\`support_agent\\`, \\`research_agent\\`\n- **Always set maxTurns** as a safety limit\n- **Match stop conditions to use case** - chat apps use stopOnResponse, workflows use stopTool\n- **Use labels** for clarity in logs and UI\n- **Organize with tags** for filtering\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/agent\n`;\n","export const TOOLS_CLAUDE_MD = `# Custom Tools\n\nTools extend agent capabilities beyond text generation. They allow LLMs to fetch data, perform calculations, execute side effects, and chain to other prompts or agents.\n\n## Function Signature\n\n\\`\\`\\`typescript\ndefineTool(\n description: string, // What the tool does (shown to LLM)\n args: z.ZodObject, // Input validation schema\n handler: (flow, args) => ToolResult, // Implementation\n returnSchema?: z.ZodObject // Optional output schema\n)\n\\`\\`\\`\n\n## Basic Example\n\n\\`\\`\\`typescript\nimport { defineTool } from '@standardagents/builder';\nimport { z } from 'zod';\n\nexport default defineTool(\n 'Search the knowledge base for articles matching a query',\n z.object({\n query: z.string().describe('Search query'),\n limit: z.number().optional().default(10).describe('Max results'),\n }),\n async (flow, args) => {\n const results = await searchKB(args.query, args.limit);\n return {\n status: 'success',\n result: JSON.stringify(results),\n };\n }\n);\n\\`\\`\\`\n\n## ToolResult Interface\n\n| Property | Type | Description |\n|----------|------|-------------|\n| \\`status\\` | \\`'success' \\\\| 'error'\\` | Whether the tool succeeded |\n| \\`result\\` | \\`string\\` | Tool output (required for success) |\n| \\`error\\` | \\`string\\` | Error message (for error status) |\n\n## FlowState Access\n\nThe \\`flow\\` parameter provides access to:\n\n\\`\\`\\`typescript\nasync (flow, args) => {\n // Thread information\n const threadId = flow.thread.id;\n const thread = flow.thread.instance;\n\n // Configuration\n const agentName = flow.agent.name;\n const modelName = flow.model.name;\n\n // Message history\n const messages = flow.messages;\n\n // Environment bindings\n const env = flow.env;\n\n // Parent state (for sub-prompts)\n const root = flow.rootState;\n}\n\\`\\`\\`\n\n## Tool Without Arguments\n\n\\`\\`\\`typescript\nexport default defineTool(\n 'Get current server time',\n async (flow) => {\n return {\n status: 'success',\n result: new Date().toISOString(),\n };\n }\n);\n\\`\\`\\`\n\n## Error Handling\n\nReturn errors gracefully instead of throwing:\n\n\\`\\`\\`typescript\nexport default defineTool(\n 'Fetch user data',\n z.object({ userId: z.string() }),\n async (flow, args) => {\n try {\n const user = await fetchUser(args.userId);\n return { status: 'success', result: JSON.stringify(user) };\n } catch (error) {\n return {\n status: 'error',\n error: \\`Failed to fetch user: \\${error.message}\\`,\n };\n }\n }\n);\n\\`\\`\\`\n\n## Queueing Additional Tools\n\nQueue another tool to run after the current one:\n\n\\`\\`\\`typescript\nimport { queueTool } from '@standardagents/builder';\n\nexport default defineTool(\n 'Create order and send confirmation',\n z.object({ items: z.array(z.string()) }),\n async (flow, args) => {\n const order = await createOrder(args.items);\n\n // Queue email tool to run next\n queueTool(flow, 'send_confirmation_email', {\n orderId: order.id,\n email: flow.thread.metadata.userEmail,\n });\n\n return { status: 'success', result: JSON.stringify(order) };\n }\n);\n\\`\\`\\`\n\n## Injecting Messages\n\nAdd messages without triggering re-execution:\n\n\\`\\`\\`typescript\nimport { injectMessage } from '@standardagents/builder';\n\nexport default defineTool(\n 'Log audit event',\n z.object({ event: z.string() }),\n async (flow, args) => {\n await injectMessage(flow, {\n role: 'system',\n content: \\`[AUDIT] \\${args.event}\\`,\n });\n return { status: 'success', result: 'Logged' };\n }\n);\n\\`\\`\\`\n\n## Best Practices\n\n- **Write clear descriptions** - LLMs decide tool usage based on descriptions\n- **Describe all parameters** with \\`.describe()\\` in Zod schemas\n- **Handle errors gracefully** - return error status, don't throw\n- **Use snake_case** for file names (\\`search_knowledge_base.ts\\`)\n- **Keep tools focused** - one task per tool\n- **Use \\`flow.rootState\\`** when queueing from sub-prompts\n\n## Supported Zod Types\n\n- Primitives: \\`string\\`, \\`number\\`, \\`boolean\\`, \\`null\\`\n- Enums: \\`z.enum(['a', 'b', 'c'])\\`\n- Arrays: \\`z.array(z.string())\\`\n- Objects: \\`z.object({ ... })\\`\n- Optional: \\`z.string().optional()\\`\n- Default: \\`z.number().default(10)\\`\n- Nullable: \\`z.string().nullable()\\`\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/tool\n`;\n","export const HOOKS_CLAUDE_MD = `# Lifecycle Hooks\n\nHooks intercept and modify agent execution at specific lifecycle points.\n\n## Available Hooks\n\n| Hook | Signature | Purpose |\n|------|-----------|---------|\n| \\`filter_messages\\` | \\`(state, rows) => Message[]\\` | Filter raw message rows before LLM context |\n| \\`prefilter_llm_history\\` | \\`(state, messages) => Message[]\\` | Modify messages after filtering, before LLM |\n| \\`before_create_message\\` | \\`(state, message) => Message\\` | Modify message before database insert |\n| \\`after_create_message\\` | \\`(state, message) => void\\` | Run logic after message created |\n| \\`before_update_message\\` | \\`(state, id, updates) => Updates\\` | Modify updates before message update |\n| \\`after_update_message\\` | \\`(state, message) => void\\` | Run logic after message updated |\n| \\`before_store_tool_result\\` | \\`(state, toolCall, result) => Result\\` | Modify tool result before storage |\n| \\`after_tool_call_success\\` | \\`(state, toolCall, result) => Result\\` | Process successful tool execution |\n| \\`after_tool_call_failure\\` | \\`(state, toolCall, result) => Result\\` | Process failed tool execution |\n\n## File Naming\n\nHook files **must** be named exactly as the hook type:\n\n\\`\\`\\`\nagents/hooks/\n├── filter_messages.ts\n├── prefilter_llm_history.ts\n├── before_create_message.ts\n├── after_create_message.ts\n├── before_update_message.ts\n├── after_update_message.ts\n├── before_store_tool_result.ts\n├── after_tool_call_success.ts\n└── after_tool_call_failure.ts\n\\`\\`\\`\n\n## Examples\n\n### Filter Messages (Limit Context)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('filter_messages', async (state, rows) => {\n // Only include last 20 messages\n return rows.slice(-20);\n});\n\\`\\`\\`\n\n### Prefilter LLM History (Modify Content)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('prefilter_llm_history', async (state, messages) => {\n // Remove sensitive data from message content\n return messages.map(msg => ({\n ...msg,\n content: msg.content?.replace(/\\\\b\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}\\\\b/g, '[REDACTED]'),\n }));\n});\n\\`\\`\\`\n\n### Before Create Message (Add Metadata)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('before_create_message', async (state, message) => {\n return {\n ...message,\n metadata: {\n ...message.metadata,\n createdAt: Date.now(),\n agentVersion: '1.0.0',\n },\n };\n});\n\\`\\`\\`\n\n### After Tool Call Success (Logging)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('after_tool_call_success', async (state, toolCall, result) => {\n console.log(\\`Tool \\${toolCall.function.name} succeeded:\\`, result);\n return result; // Return result unchanged, or modify it\n});\n\\`\\`\\`\n\n### After Tool Call Failure (Recovery)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('after_tool_call_failure', async (state, toolCall, result) => {\n // Override error with fallback result\n if (toolCall.function.name === 'fetch_weather') {\n return {\n status: 'success',\n result: JSON.stringify({ temp: 'unavailable', fallback: true }),\n };\n }\n return result; // Return original error\n});\n\\`\\`\\`\n\n## Hook Categories\n\n**Transformation hooks** (return modified data):\n- \\`filter_messages\\`\n- \\`prefilter_llm_history\\`\n- \\`before_create_message\\`\n- \\`before_update_message\\`\n- \\`before_store_tool_result\\`\n- \\`after_tool_call_success\\`\n- \\`after_tool_call_failure\\`\n\n**Event hooks** (side effects only):\n- \\`after_create_message\\`\n- \\`after_update_message\\`\n\n## Best Practices\n\n- **Keep hooks fast** - target <100ms execution\n- **Wrap in try-catch** - hooks continue on error\n- **Validate input data** before processing\n- **Document purpose** with clear comments\n- **Use for cross-cutting concerns** - logging, redaction, enrichment\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/hook\n`;\n","export const API_CLAUDE_MD = `# Thread-Specific API Endpoints\n\nDefine custom API endpoints that operate on specific threads with access to the thread's Durable Object instance and SQLite storage.\n\n## File-Based Routing\n\n| File Pattern | HTTP Method | Route |\n|--------------|-------------|-------|\n| \\`name.ts\\` | GET | \\`/api/threads/:id/name\\` |\n| \\`name.get.ts\\` | GET | \\`/api/threads/:id/name\\` |\n| \\`name.post.ts\\` | POST | \\`/api/threads/:id/name\\` |\n| \\`name.put.ts\\` | PUT | \\`/api/threads/:id/name\\` |\n| \\`name.delete.ts\\` | DELETE | \\`/api/threads/:id/name\\` |\n| \\`nested/route.ts\\` | GET | \\`/api/threads/:id/nested/route\\` |\n\n## Basic Example\n\n\\`\\`\\`typescript\n// agents/api/status.get.ts -> GET /api/threads/:id/status\nimport { defineThreadEndpoint } from '@standardagents/builder';\n\nexport default defineThreadEndpoint(async (thread, request, env) => {\n const messages = await thread.getMessages();\n return new Response(JSON.stringify({\n messageCount: messages.length,\n status: 'active',\n }), {\n headers: { 'Content-Type': 'application/json' },\n });\n});\n\\`\\`\\`\n\n## Handler Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| \\`thread\\` | \\`DurableThread\\` | The thread's Durable Object instance |\n| \\`request\\` | \\`Request\\` | The incoming HTTP request |\n| \\`env\\` | \\`Env\\` | Cloudflare Worker environment bindings |\n\n## Thread Methods\n\nAccess thread data through the instance:\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n // Message operations\n const messages = await thread.getMessages({ limit: 100, offset: 0 });\n const count = await thread.getMessageCount();\n\n // Thread metadata\n const metadata = thread.getMetadata();\n\n // Execution control\n await thread.stop();\n\n // Custom SQL queries\n const result = thread.ctx.storage.sql.exec(\\`\n SELECT * FROM messages WHERE role = 'user'\n \\`);\n});\n\\`\\`\\`\n\n## POST with Request Body\n\n\\`\\`\\`typescript\n// agents/api/export.post.ts -> POST /api/threads/:id/export\nimport { defineThreadEndpoint } from '@standardagents/builder';\n\nexport default defineThreadEndpoint(async (thread, request, env) => {\n const body = await request.json();\n const { format = 'json' } = body;\n\n const messages = await thread.getMessages();\n\n if (format === 'csv') {\n const csv = messages.map(m => \\`\\${m.role},\\${m.content}\\`).join('\\\\n');\n return new Response(csv, {\n headers: { 'Content-Type': 'text/csv' },\n });\n }\n\n return new Response(JSON.stringify(messages), {\n headers: { 'Content-Type': 'application/json' },\n });\n});\n\\`\\`\\`\n\n## Nested Routes\n\nCreate directories for nested routes:\n\n\\`\\`\\`\nagents/api/\n├── status.get.ts -> GET /api/threads/:id/status\n├── export.post.ts -> POST /api/threads/:id/export\n└── messages/\n ├── count.ts -> GET /api/threads/:id/messages/count\n └── search.post.ts -> POST /api/threads/:id/messages/search\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n try {\n const data = await riskyOperation();\n return new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(JSON.stringify({\n error: error.message,\n }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n});\n\\`\\`\\`\n\n## Using Environment Variables\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n // Access secrets and bindings\n const apiKey = env.EXTERNAL_API_KEY;\n const kv = env.MY_KV_NAMESPACE;\n\n const data = await fetchExternalAPI(apiKey);\n await kv.put(\\`thread:\\${thread.id}\\`, JSON.stringify(data));\n\n return new Response('OK');\n});\n\\`\\`\\`\n\n## Best Practices\n\n- **Keep handlers fast** - endpoints are in the request path\n- **Paginate large queries** - use limit/offset for messages\n- **Validate input data** - check request body before processing\n- **Use descriptive file names** - \\`export.post.ts\\` not \\`ep1.ts\\`\n- **Return proper status codes** - 200, 400, 404, 500\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/core-concepts/api\n`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { parse, modify, applyEdits } from 'jsonc-parser';\nimport { loadFile, writeFile, generateCode, parseModule, builders } from 'magicast';\nimport { addVitePlugin } from 'magicast/helpers';\nimport { logger } from '../utils/logger.js';\nimport {\n ROOT_CLAUDE_MD,\n MODELS_CLAUDE_MD,\n PROMPTS_CLAUDE_MD,\n AGENTS_CLAUDE_MD,\n TOOLS_CLAUDE_MD,\n HOOKS_CLAUDE_MD,\n API_CLAUDE_MD,\n} from '../templates/index.js';\n\ninterface ScaffoldOptions {\n force?: boolean;\n}\n\n// Template for wrangler.jsonc\nconst WRANGLER_TEMPLATE = (name: string) => `{\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"${name}\",\n \"main\": \"worker/index.ts\",\n \"compatibility_date\": \"2025-01-01\",\n \"compatibility_flags\": [\"nodejs_compat\"],\n \"observability\": {\n \"enabled\": true\n },\n \"assets\": {\n \"directory\": \"dist\",\n \"not_found_handling\": \"single-page-application\",\n \"binding\": \"ASSETS\",\n \"run_worker_first\": [\"/**\"]\n },\n \"durable_objects\": {\n \"bindings\": [\n {\n \"name\": \"AGENT_BUILDER_THREAD\",\n \"class_name\": \"DurableThread\"\n },\n {\n \"name\": \"AGENT_BUILDER\",\n \"class_name\": \"DurableAgentBuilder\"\n }\n ]\n },\n \"migrations\": [\n {\n \"tag\": \"v1\",\n \"new_sqlite_classes\": [\"DurableThread\"]\n },\n {\n \"tag\": \"v2\",\n \"new_sqlite_classes\": [\"DurableAgentBuilder\"]\n }\n ]\n}\n`;\n\n// Templates for Durable Object files\nconst THREAD_TS = `import { DurableThread } from 'virtual:@standardagents/builder'\n\nexport default class Thread extends DurableThread {}\n`;\n\nconst AGENT_BUILDER_TS = `import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n\nexport default class AgentBuilder extends DurableAgentBuilder {}\n`;\n\n// Worker entry point template\nconst WORKER_INDEX = `import { router } from \"virtual:@standardagents/builder\"\nimport DurableThread from '../agents/Thread';\nimport DurableAgentBuilder from '../agents/AgentBuilder';\n\nexport default {\n async fetch(request, env) {\n const res = await router(request, env)\n return res ?? new Response(null, { status: 404 })\n },\n} satisfies ExportedHandler<Env>\n\nexport { DurableThread, DurableAgentBuilder }\n`;\n\n// Utility functions\nfunction getProjectName(cwd: string): string {\n const packageJsonPath = path.join(cwd, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.name) {\n return pkg.name.replace(/^@[^/]+\\//, ''); // Remove scope if present\n }\n } catch {\n // Ignore parse errors\n }\n }\n return path.basename(cwd);\n}\n\nfunction findViteConfig(cwd: string): string | null {\n const candidates = ['vite.config.ts', 'vite.config.js', 'vite.config.mts', 'vite.config.mjs'];\n for (const candidate of candidates) {\n const configPath = path.join(cwd, candidate);\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\nfunction findWranglerConfig(cwd: string): string | null {\n const candidates = ['wrangler.jsonc', 'wrangler.json'];\n for (const candidate of candidates) {\n const configPath = path.join(cwd, candidate);\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\nasync function modifyViteConfig(configPath: string, force: boolean): Promise<boolean> {\n try {\n const mod = await loadFile(configPath);\n\n // Check if plugins already include our plugins\n const code = fs.readFileSync(configPath, 'utf-8');\n const hasCloudflare = code.includes('@cloudflare/vite-plugin') || code.includes('cloudflare()');\n const hasAgentBuilder = code.includes('@standardagents/builder') || code.includes('agentbuilder()');\n\n if (hasCloudflare && hasAgentBuilder && !force) {\n logger.info('Vite config already includes Standard Agents plugins');\n return true;\n }\n\n // Add cloudflare plugin if not present\n if (!hasCloudflare || force) {\n addVitePlugin(mod, {\n from: '@cloudflare/vite-plugin',\n imported: 'cloudflare',\n constructor: 'cloudflare',\n });\n logger.success('Added cloudflare plugin to vite.config');\n }\n\n // Add agentbuilder plugin if not present\n if (!hasAgentBuilder || force) {\n addVitePlugin(mod, {\n from: '@standardagents/builder',\n imported: 'agentbuilder',\n constructor: 'agentbuilder',\n options: { mountPoint: '/' },\n });\n logger.success('Added agentbuilder plugin to vite.config');\n }\n\n await writeFile(mod, configPath);\n return true;\n } catch (error) {\n logger.warning(`Could not automatically modify vite.config: ${error}`);\n logger.log('');\n logger.log('Please manually add the following to your vite.config.ts:');\n logger.log('');\n logger.log(` import { cloudflare } from '@cloudflare/vite-plugin'`);\n logger.log(` import { agentbuilder } from '@standardagents/builder'`);\n logger.log('');\n logger.log(` plugins: [cloudflare(), agentbuilder({ mountPoint: '/' })]`);\n logger.log('');\n return false;\n }\n}\n\nfunction createOrUpdateWranglerConfig(cwd: string, projectName: string, force: boolean): boolean {\n const existingConfig = findWranglerConfig(cwd);\n\n if (existingConfig && !force) {\n // Update existing config\n try {\n const text = fs.readFileSync(existingConfig, 'utf-8');\n const config = parse(text);\n\n // Check if already configured\n const hasBindings = config.durable_objects?.bindings?.some(\n (b: any) => b.name === 'AGENT_BUILDER_THREAD' || b.name === 'AGENT_BUILDER'\n );\n\n if (hasBindings) {\n logger.info('wrangler.jsonc already configured for Standard Agents');\n return true;\n }\n\n // Add bindings to existing config\n let result = text;\n\n // Add durable_objects if not present\n if (!config.durable_objects) {\n const edits = modify(result, ['durable_objects'], {\n bindings: [\n { name: 'AGENT_BUILDER_THREAD', class_name: 'DurableThread' },\n { name: 'AGENT_BUILDER', class_name: 'DurableAgentBuilder' }\n ]\n }, {});\n result = applyEdits(result, edits);\n } else {\n // Add to existing bindings\n const bindings = config.durable_objects.bindings || [];\n bindings.push(\n { name: 'AGENT_BUILDER_THREAD', class_name: 'DurableThread' },\n { name: 'AGENT_BUILDER', class_name: 'DurableAgentBuilder' }\n );\n const edits = modify(result, ['durable_objects', 'bindings'], bindings, {});\n result = applyEdits(result, edits);\n }\n\n // Add migrations if not present\n if (!config.migrations) {\n const edits = modify(result, ['migrations'], [\n { tag: 'v1', new_sqlite_classes: ['DurableThread'] },\n { tag: 'v2', new_sqlite_classes: ['DurableAgentBuilder'] }\n ], {});\n result = applyEdits(result, edits);\n }\n\n // Update main entry point if needed\n if (!config.main || !config.main.includes('worker')) {\n const edits = modify(result, ['main'], 'worker/index.ts', {});\n result = applyEdits(result, edits);\n }\n\n // Add assets configuration if not present\n if (!config.assets) {\n const edits = modify(result, ['assets'], {\n directory: 'dist',\n not_found_handling: 'single-page-application',\n binding: 'ASSETS',\n run_worker_first: ['/**']\n }, {});\n result = applyEdits(result, edits);\n }\n\n fs.writeFileSync(existingConfig, result, 'utf-8');\n logger.success('Updated wrangler.jsonc with Standard Agents configuration');\n return true;\n } catch (error) {\n logger.warning(`Could not update wrangler config: ${error}`);\n return false;\n }\n }\n\n // Create new wrangler.jsonc\n const wranglerPath = path.join(cwd, 'wrangler.jsonc');\n const sanitizedName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n fs.writeFileSync(wranglerPath, WRANGLER_TEMPLATE(sanitizedName), 'utf-8');\n logger.success('Created wrangler.jsonc');\n return true;\n}\n\nfunction getWorkerEntryPoint(cwd: string): string {\n // Check wrangler config for main entry\n const wranglerConfig = findWranglerConfig(cwd);\n if (wranglerConfig) {\n try {\n const text = fs.readFileSync(wranglerConfig, 'utf-8');\n const config = parse(text);\n if (config.main) {\n return path.join(cwd, config.main);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Default to worker/index.ts\n return path.join(cwd, 'worker', 'index.ts');\n}\n\nasync function createOrUpdateWorkerEntry(cwd: string, force: boolean): Promise<boolean> {\n const entryPath = getWorkerEntryPoint(cwd);\n const entryDir = path.dirname(entryPath);\n\n // Create worker directory if needed\n if (!fs.existsSync(entryDir)) {\n fs.mkdirSync(entryDir, { recursive: true });\n logger.success(`Created ${path.relative(cwd, entryDir)} directory`);\n }\n\n // If file doesn't exist, create it\n if (!fs.existsSync(entryPath)) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Created ${path.relative(cwd, entryPath)}`);\n return true;\n }\n\n // File exists - try to modify it\n const content = fs.readFileSync(entryPath, 'utf-8');\n\n // Check if already configured\n const hasRouter = content.includes('virtual:@standardagents/builder') && content.includes('router');\n const hasDurableExports = content.includes('DurableThread') && content.includes('DurableAgentBuilder');\n\n if (hasRouter && hasDurableExports && !force) {\n logger.info(`${path.relative(cwd, entryPath)} already configured`);\n return true;\n }\n\n try {\n const mod = await loadFile(entryPath);\n\n // Add imports\n if (!content.includes('virtual:@standardagents/builder') || force) {\n mod.imports.$add({\n from: 'virtual:@standardagents/builder',\n imported: 'router',\n local: 'router',\n });\n }\n\n if (!content.includes(\"'../agents/Thread'\") || force) {\n mod.imports.$add({\n from: '../agents/Thread',\n imported: 'default',\n local: 'DurableThread',\n });\n }\n\n if (!content.includes(\"'../agents/AgentBuilder'\") || force) {\n mod.imports.$add({\n from: '../agents/AgentBuilder',\n imported: 'default',\n local: 'DurableAgentBuilder',\n });\n }\n\n // Check if there's a default export with fetch\n const { code } = generateCode(mod);\n\n // If we can't easily add the router, just overwrite\n if (force || !hasRouter) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Updated ${path.relative(cwd, entryPath)} with Standard Agents router`);\n }\n\n return true;\n } catch (error) {\n // Fall back to template\n if (force) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Created ${path.relative(cwd, entryPath)}`);\n return true;\n }\n\n logger.warning(`Could not automatically modify ${path.relative(cwd, entryPath)}`);\n logger.log('');\n logger.log('Please ensure your worker entry point includes:');\n logger.log('');\n logger.log(` import { router } from \"virtual:@standardagents/builder\"`);\n logger.log(` import DurableThread from '../agents/Thread';`);\n logger.log(` import DurableAgentBuilder from '../agents/AgentBuilder';`);\n logger.log('');\n logger.log(' // In your fetch handler:');\n logger.log(' const res = router(request, env)');\n logger.log(' if (res) return res');\n logger.log('');\n logger.log(' // Export Durable Objects:');\n logger.log(' export { DurableThread, DurableAgentBuilder }');\n logger.log('');\n return false;\n }\n}\n\nfunction createDurableObjects(cwd: string): void {\n const agentsDir = path.join(cwd, 'agents');\n\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n // Create Thread.ts\n const threadPath = path.join(agentsDir, 'Thread.ts');\n if (!fs.existsSync(threadPath)) {\n fs.writeFileSync(threadPath, THREAD_TS, 'utf-8');\n logger.success('Created agents/Thread.ts');\n } else {\n logger.info('agents/Thread.ts already exists');\n }\n\n // Create AgentBuilder.ts\n const agentBuilderPath = path.join(agentsDir, 'AgentBuilder.ts');\n if (!fs.existsSync(agentBuilderPath)) {\n fs.writeFileSync(agentBuilderPath, AGENT_BUILDER_TS, 'utf-8');\n logger.success('Created agents/AgentBuilder.ts');\n } else {\n logger.info('agents/AgentBuilder.ts already exists');\n }\n}\n\nfunction createDirectoriesAndDocs(cwd: string): void {\n const agentsDir = path.join(cwd, 'agents');\n\n // Create project root CLAUDE.md (for AI assistants to understand the project)\n const rootDocPath = path.join(cwd, 'CLAUDE.md');\n if (!fs.existsSync(rootDocPath)) {\n fs.writeFileSync(rootDocPath, ROOT_CLAUDE_MD, 'utf-8');\n logger.success('Created CLAUDE.md');\n }\n\n // Create subdirectories with their CLAUDE.md files\n const directories = [\n { path: 'agents/agents', doc: AGENTS_CLAUDE_MD },\n { path: 'agents/prompts', doc: PROMPTS_CLAUDE_MD },\n { path: 'agents/models', doc: MODELS_CLAUDE_MD },\n { path: 'agents/tools', doc: TOOLS_CLAUDE_MD },\n { path: 'agents/hooks', doc: HOOKS_CLAUDE_MD },\n { path: 'agents/api', doc: API_CLAUDE_MD },\n ];\n\n for (const dir of directories) {\n const dirPath = path.join(cwd, dir.path);\n const docPath = path.join(dirPath, 'CLAUDE.md');\n\n // Create directory\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logger.success(`Created ${dir.path}`);\n }\n\n // Create CLAUDE.md\n if (!fs.existsSync(docPath)) {\n fs.writeFileSync(docPath, dir.doc, 'utf-8');\n logger.success(`Created ${dir.path}/CLAUDE.md`);\n }\n }\n}\n\nfunction updateTsConfig(cwd: string): void {\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n\n if (!fs.existsSync(tsconfigPath)) {\n logger.info('No tsconfig.json found, skipping TypeScript configuration');\n return;\n }\n\n try {\n const text = fs.readFileSync(tsconfigPath, 'utf-8');\n const config = parse(text);\n let result = text;\n\n // Add types to compilerOptions\n const types = config.compilerOptions?.types || [];\n const newTypes = [\n './worker-configuration.d.ts',\n './.agents/types.d.ts',\n './.agents/virtual-module.d.ts'\n ].filter(t => !types.includes(t));\n\n if (newTypes.length > 0) {\n const allTypes = [...types, ...newTypes];\n const edits = modify(result, ['compilerOptions', 'types'], allTypes, {});\n result = applyEdits(result, edits);\n }\n\n // Add worker and agents to include\n const include = config.include || [];\n const newIncludes = ['worker', 'agents'].filter(i => !include.includes(i));\n\n if (newIncludes.length > 0) {\n const allIncludes = [...include, ...newIncludes];\n const edits = modify(result, ['include'], allIncludes, {});\n result = applyEdits(result, edits);\n }\n\n if (newTypes.length > 0 || newIncludes.length > 0) {\n fs.writeFileSync(tsconfigPath, result, 'utf-8');\n logger.success('Updated tsconfig.json with Standard Agents types');\n } else {\n logger.info('tsconfig.json already configured');\n }\n } catch (error) {\n logger.warning('Could not update tsconfig.json, you may need to add types manually');\n }\n}\n\nfunction cleanupViteDefaults(cwd: string): void {\n // Remove default Vite files that we don't need\n const filesToRemove = [\n 'src/main.ts',\n 'src/style.css',\n 'src/counter.ts',\n 'src/typescript.svg',\n 'src/vite-env.d.ts',\n 'index.html',\n 'public/vite.svg',\n ];\n\n const dirsToRemove = ['src', 'public'];\n\n for (const file of filesToRemove) {\n const filePath = path.join(cwd, file);\n if (fs.existsSync(filePath)) {\n try {\n fs.unlinkSync(filePath);\n } catch {\n // Ignore errors\n }\n }\n }\n\n // Remove empty directories\n for (const dir of dirsToRemove) {\n const dirPath = path.join(cwd, dir);\n if (fs.existsSync(dirPath)) {\n try {\n const files = fs.readdirSync(dirPath);\n if (files.length === 0) {\n fs.rmdirSync(dirPath);\n }\n } catch {\n // Ignore errors\n }\n }\n }\n}\n\nexport async function scaffold(options: ScaffoldOptions = {}) {\n const cwd = process.cwd();\n const projectName = getProjectName(cwd);\n const force = options.force || false;\n\n logger.info('Scaffolding Standard Agents...');\n logger.log('');\n\n // 1. Find and modify vite.config\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n await modifyViteConfig(viteConfigPath, force);\n } else {\n logger.warning('No vite.config found. Please create one with cloudflare and agentbuilder plugins.');\n }\n\n // 2. Create or update wrangler.jsonc\n createOrUpdateWranglerConfig(cwd, projectName, force);\n\n // 3. Create or update worker entry point\n await createOrUpdateWorkerEntry(cwd, force);\n\n // 4. Create Durable Object files\n createDurableObjects(cwd);\n\n // 5. Create agent directories with documentation\n createDirectoriesAndDocs(cwd);\n\n // 6. Update tsconfig.json\n updateTsConfig(cwd);\n\n // 7. Clean up default Vite files (only if force is true, meaning fresh project)\n if (force) {\n cleanupViteDefaults(cwd);\n }\n\n logger.log('');\n logger.success('Standard Agents scaffolding complete!');\n logger.log('');\n logger.log('Your project structure:');\n logger.log('');\n logger.log(' CLAUDE.md # Architecture documentation');\n logger.log(' agents/');\n logger.log(' ├── Thread.ts # Durable Object for threads');\n logger.log(' ├── AgentBuilder.ts # Durable Object for agent state');\n logger.log(' ├── agents/ # Agent definitions');\n logger.log(' ├── prompts/ # Prompt definitions');\n logger.log(' ├── models/ # Model configurations');\n logger.log(' ├── tools/ # Custom tools');\n logger.log(' ├── hooks/ # Lifecycle hooks');\n logger.log(' └── api/ # Thread API endpoints');\n logger.log(' worker/');\n logger.log(' └── index.ts # Cloudflare Worker entry point');\n logger.log('');\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport crypto from 'node:crypto';\nimport readline from 'node:readline';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../utils/logger.js';\nimport { scaffold } from './scaffold.js';\n\ninterface InitOptions {\n yes?: boolean;\n template?: string;\n}\n\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptPassword(question: string): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(question);\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let password = '';\n\n const onData = (char: string) => {\n const c = char.toString();\n\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u0004': // Ctrl+D\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\n');\n resolve(password);\n break;\n case '\\u0003': // Ctrl+C\n stdout.write('\\n');\n process.exit(1);\n break;\n case '\\u007F': // Backspace\n case '\\b':\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.clearLine(0);\n stdout.cursorTo(0);\n stdout.write(question + '*'.repeat(password.length));\n }\n break;\n default:\n password += c;\n stdout.write('*');\n break;\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Use shell: false to properly handle arguments with spaces\n // Node's spawn will handle argument escaping automatically\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: false,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', reject);\n });\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens\n .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n}\n\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check environment variable first (most reliable when running via npx/pnpm exec)\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n }\n\n // Check for lockfiles\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm';\n if (fs.existsSync('yarn.lock')) return 'yarn';\n if (fs.existsSync('bun.lockb')) return 'bun';\n if (fs.existsSync('package-lock.json')) return 'npm';\n\n return 'npm';\n}\n\n/**\n * Get the @standardagents/builder version to use based on the CLI's version.\n * If CLI is running a prerelease (e.g., 0.11.0-next.1), use that tag.\n * Otherwise, use the exact CLI version.\n */\nfunction getBuilderPackageVersion(): string {\n try {\n // Read CLI's own package.json\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.resolve(__dirname, '../../package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const version = pkg.version as string;\n\n // Check for prerelease tags (e.g., 0.11.0-next.1, 0.11.0-beta.2)\n const prereleaseMatch = version.match(/-([a-z]+)\\./i);\n if (prereleaseMatch) {\n // Use the tag name (next, beta, alpha, etc.)\n return `@${prereleaseMatch[1]}`;\n }\n\n // For stable releases, use caret version\n return `@^${version}`;\n } catch {\n // Fallback to latest if we can't determine version\n return '';\n }\n}\n\nasync function selectPackageManager(detected: 'npm' | 'pnpm' | 'yarn' | 'bun'): Promise<'npm' | 'pnpm' | 'yarn' | 'bun'> {\n const options = ['npm', 'pnpm', 'yarn', 'bun'] as const;\n const detectedIndex = options.indexOf(detected);\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = detectedIndex;\n\n const renderOptions = () => {\n // Move cursor up to overwrite previous render (except first time)\n stdout.write('\\x1B[?25l'); // Hide cursor\n\n // Clear and redraw\n stdout.write(`\\x1B[${options.length + 1}A`); // Move up\n stdout.write('\\x1B[0J'); // Clear from cursor to end\n\n stdout.write('Select a package manager (use arrows, enter to confirm):\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n };\n\n // Initial render\n stdout.write('Select a package manager (use arrows, enter to confirm):\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h'); // Show cursor\n };\n\n const onData = (key: string) => {\n // Handle arrow keys (escape sequences)\n if (key === '\\x1B[A' || key === 'k') { // Up arrow or k\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') { // Down arrow or j\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') { // Enter\n cleanup();\n resolve(options[selectedIndex]);\n } else if (key === '\\x03') { // Ctrl+C\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nexport async function init(projectNameArg?: string, options: InitOptions = {}) {\n const cwd = process.cwd();\n const detectedPm = detectPackageManager();\n const template = options.template || 'vanilla-ts';\n\n logger.log('');\n logger.info('Creating a new Standard Agents project...');\n logger.log('');\n\n // Select package manager\n let pm: 'npm' | 'pnpm' | 'yarn' | 'bun';\n if (options.yes) {\n pm = detectedPm;\n } else {\n pm = await selectPackageManager(detectedPm);\n logger.log('');\n }\n\n // Get project name\n let projectName = projectNameArg;\n\n if (!projectName && !options.yes) {\n projectName = await prompt('Project name: ');\n }\n\n if (!projectName) {\n logger.error('Project name is required');\n process.exit(1);\n }\n\n const projectPath = path.join(cwd, projectName);\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n logger.error(`Directory \"${projectName}\" already exists`);\n process.exit(1);\n }\n\n // Step 1: Run create vite\n logger.log('');\n logger.info(`Step 1: Creating Vite project with ${template} template...`);\n logger.log('');\n\n try {\n // Determine the correct create command based on package manager\n // All package managers should use create-vite@latest to ensure the latest version\n // Use --no-interactive to skip prompts (like \"Install with npm and start now?\")\n let createCmd: string;\n let createArgs: string[];\n\n switch (pm) {\n case 'pnpm':\n createCmd = 'pnpm';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n case 'yarn':\n createCmd = 'yarn';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n case 'bun':\n createCmd = 'bun';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n default:\n createCmd = 'npm';\n createArgs = ['create', 'vite@latest', projectName, '--', '--template', template, '--no-interactive'];\n }\n\n await runCommand(createCmd, createArgs, cwd);\n } catch (error) {\n logger.error('Failed to create Vite project');\n process.exit(1);\n }\n\n // Create vite.config.ts if it doesn't exist (some templates may not include one)\n const viteConfigPath = path.join(projectPath, 'vite.config.ts');\n if (!fs.existsSync(viteConfigPath)) {\n const viteConfigContent = `import { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [],\n})\n`;\n fs.writeFileSync(viteConfigPath, viteConfigContent, 'utf-8');\n logger.success('Created vite.config.ts');\n }\n\n // Update package.json name to kebab-case (handles spaces and special characters)\n const packageJsonPath = path.join(projectPath, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const kebabName = toKebabCase(projectName);\n if (packageJson.name !== kebabName) {\n packageJson.name = kebabName;\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n }\n\n // Step 2: Install Standard Agents dependencies\n logger.log('');\n logger.info('Step 2: Installing Standard Agents dependencies...');\n logger.log('');\n\n try {\n const installCmd = pm === 'npm' ? 'install' : 'add';\n const devFlag = pm === 'npm' ? '--save-dev' : '-D';\n const builderVersion = getBuilderPackageVersion();\n\n await runCommand(pm, [\n installCmd, devFlag,\n '@cloudflare/vite-plugin',\n `@standardagents/builder${builderVersion}`,\n 'wrangler',\n 'zod'\n ], projectPath);\n } catch (error) {\n logger.error('Failed to install dependencies');\n process.exit(1);\n }\n\n // Step 3: Run scaffold in the new project directory\n logger.log('');\n logger.info('Step 3: Configuring Standard Agents...');\n logger.log('');\n\n // Change to project directory for scaffold\n process.chdir(projectPath);\n\n await scaffold({ force: true });\n\n // Step 4: Configure environment variables\n logger.log('');\n logger.info('Step 4: Configuring environment variables...');\n logger.log('');\n\n // Generate encryption key\n const encryptionKey = crypto.randomBytes(32).toString('hex');\n\n // Ask for API keys and admin password\n let openrouterKey = '';\n let openaiKey = '';\n let adminPassword = '';\n\n if (!options.yes) {\n logger.log('API keys are optional but required to use AI models.');\n logger.log('You can add them later by editing .dev.vars');\n logger.log('');\n\n openrouterKey = await prompt('OpenRouter API key (optional, press Enter to skip): ');\n openaiKey = await prompt('OpenAI API key (optional, press Enter to skip): ');\n\n logger.log('');\n logger.log('Set a temporary admin password for development access.');\n logger.log('Press Enter to use the default password \"admin\".');\n logger.log('');\n\n while (true) {\n adminPassword = await promptPassword('Temporary admin password: ');\n\n if (!adminPassword) {\n adminPassword = 'admin';\n break;\n }\n\n const confirmPassword = await promptPassword('Confirm password: ');\n\n if (adminPassword === confirmPassword) {\n break;\n } else {\n logger.warning('Passwords do not match. Please try again.');\n logger.log('');\n adminPassword = '';\n }\n }\n }\n\n // Default admin password if not provided (for --yes flag)\n if (!adminPassword) {\n adminPassword = 'admin';\n }\n\n // Create .dev.vars file\n const devVarsLines: string[] = [\n '# Standard Agents Environment Variables',\n '# This file contains secrets for local development only',\n '# Do not commit this file to version control',\n '',\n '# Encryption key for secure data (auto-generated)',\n `ENCRYPTION_KEY=${encryptionKey}`,\n '',\n '# Temporary admin password for development access',\n `SUPER_ADMIN_PASSWORD=${adminPassword}`,\n '',\n '# AI Provider API Keys',\n '# Uncomment and add your keys as needed',\n ];\n\n if (openrouterKey) {\n devVarsLines.push(`OPENROUTER_API_KEY=${openrouterKey}`);\n } else {\n devVarsLines.push('# OPENROUTER_API_KEY=your-openrouter-key');\n }\n\n if (openaiKey) {\n devVarsLines.push(`OPENAI_API_KEY=${openaiKey}`);\n } else {\n devVarsLines.push('# OPENAI_API_KEY=your-openai-key');\n }\n\n devVarsLines.push('');\n\n const devVarsPath = path.join(projectPath, '.dev.vars');\n fs.writeFileSync(devVarsPath, devVarsLines.join('\\n'), 'utf-8');\n logger.success('Created .dev.vars with encryption key');\n\n // Add .dev.vars to .gitignore if it exists\n const gitignorePath = path.join(projectPath, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');\n if (!gitignoreContent.includes('.dev.vars')) {\n fs.appendFileSync(gitignorePath, '\\n# Local environment variables\\n.dev.vars\\n');\n logger.success('Added .dev.vars to .gitignore');\n }\n }\n\n // Step 5: Generate Cloudflare types\n logger.log('');\n logger.info('Step 5: Generating Cloudflare types...');\n logger.log('');\n\n try {\n await runCommand('npx', ['wrangler', 'types'], projectPath);\n } catch (error) {\n logger.warning('Could not generate types automatically. Run \"npx wrangler types\" manually.');\n }\n\n // Done!\n logger.log('');\n logger.success('Project created successfully!');\n logger.log('');\n logger.log('Next steps:');\n logger.log('');\n logger.log(` cd ${projectName}`);\n logger.log(` ${pm === 'npm' ? 'npm run' : pm} dev`);\n logger.log('');\n logger.log('For more information, visit: https://standardagents.ai/docs');\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport readline from 'node:readline';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../utils/logger.js';\n\ninterface InitChatOptions {\n yes?: boolean;\n framework?: 'vite' | 'nextjs';\n}\n\ntype Framework = 'vite' | 'nextjs';\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\n/**\n * Get the @standardagents/react version to use based on the CLI's version.\n * If CLI is running a prerelease (e.g., 0.11.0-next.1), use that tag.\n * Otherwise, use the exact CLI version.\n */\nfunction getReactPackageVersion(): string {\n try {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js -> ../package.json\n const pkgPath = path.resolve(__dirname, '../package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const version = pkg.version as string;\n\n const prereleaseMatch = version.match(/-([a-z]+)\\./i);\n if (prereleaseMatch) {\n return prereleaseMatch[1];\n }\n\n return `^${version}`;\n } catch {\n return 'latest';\n }\n}\n\n/**\n * Get the path to the chat source directory bundled with the CLI\n */\nfunction getChatSourceDir(): string {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js -> ../chat\n return path.resolve(__dirname, '../chat');\n}\n\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptPassword(question: string): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(question);\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let password = '';\n\n const redraw = () => {\n stdout.clearLine(0);\n stdout.cursorTo(0);\n stdout.write(question + '*'.repeat(password.length));\n };\n\n const onData = (data: string) => {\n const str = data.toString();\n\n for (let i = 0; i < str.length; i++) {\n const c = str[i];\n\n if (c === '\\x1B') {\n if (str[i + 1] === '[') {\n i += 2;\n continue;\n }\n continue;\n }\n\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u0004':\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\n');\n resolve(password);\n return;\n case '\\u0003':\n stdout.write('\\n');\n process.exit(1);\n break;\n case '\\u007F':\n case '\\b':\n if (password.length > 0) {\n password = password.slice(0, -1);\n redraw();\n }\n break;\n default:\n if (c.charCodeAt(0) >= 32) {\n password += c;\n stdout.write('*');\n }\n break;\n }\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: false,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', reject);\n });\n}\n\nfunction detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n }\n\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm';\n if (fs.existsSync('yarn.lock')) return 'yarn';\n if (fs.existsSync('bun.lockb')) return 'bun';\n if (fs.existsSync('package-lock.json')) return 'npm';\n\n return 'npm';\n}\n\nasync function selectPackageManager(detected: PackageManager): Promise<PackageManager> {\n const options: PackageManager[] = ['npm', 'pnpm', 'yarn', 'bun'];\n const detectedIndex = options.indexOf(detected);\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = detectedIndex;\n\n const renderOptions = () => {\n stdout.write('\\x1B[?25l');\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[0J');\n\n stdout.write('Select a package manager:\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n };\n\n stdout.write('Select a package manager:\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h');\n };\n\n const onData = (key: string) => {\n if (key === '\\x1B[A' || key === 'k') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') {\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') {\n cleanup();\n resolve(options[selectedIndex]);\n } else if (key === '\\x03') {\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nasync function selectFramework(): Promise<Framework> {\n const options: { value: Framework; label: string }[] = [\n { value: 'vite', label: 'Vite (React + TypeScript)' },\n { value: 'nextjs', label: 'Next.js (App Router)' },\n ];\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = 0;\n\n const renderOptions = () => {\n stdout.write('\\x1B[?25l');\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[0J');\n\n stdout.write('Select a framework:\\n');\n options.forEach((opt, i) => {\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt.label}\\x1B[0m\\n`);\n });\n };\n\n stdout.write('Select a framework:\\n');\n options.forEach((opt, i) => {\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt.label}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h');\n };\n\n const onData = (key: string) => {\n if (key === '\\x1B[A' || key === 'k') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') {\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') {\n cleanup();\n resolve(options[selectedIndex].value);\n } else if (key === '\\x03') {\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isPortOpen(port: number): Promise<boolean> {\n const tryConnect = (host: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(200);\n\n socket.on('connect', () => {\n socket.destroy();\n resolve(true);\n });\n\n socket.on('timeout', () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on('error', () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.connect(port, host);\n });\n };\n\n if (await tryConnect('127.0.0.1')) return true;\n if (await tryConnect('::1')) return true;\n return false;\n}\n\nasync function isAgentbuilderInstance(url: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n\n const response = await fetch(`${url}/api/agents`, {\n signal: controller.signal,\n headers: { 'Accept': 'application/json' },\n });\n\n clearTimeout(timeout);\n\n if (response.status === 401) {\n return true;\n }\n\n if (response.ok) {\n const data = await response.json();\n return Array.isArray(data.agents);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function detectAgentbuilderInstance(): Promise<string | null> {\n const portsToScan = [\n 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180,\n 3000, 3001, 3002, 3003,\n 8080, 8000, 4000,\n ];\n\n logger.log('\\x1B[90mScanning for running agentbuilder instance...\\x1B[0m');\n\n const openPorts: number[] = [];\n\n await Promise.all(\n portsToScan.map(async (port) => {\n if (await isPortOpen(port)) {\n openPorts.push(port);\n }\n })\n );\n\n for (const port of openPorts.sort((a, b) => a - b)) {\n const url = `http://localhost:${port}`;\n if (await isAgentbuilderInstance(url)) {\n return url;\n }\n }\n\n return null;\n}\n\n/**\n * Copy a directory recursively, skipping certain files/folders\n */\nfunction copyDir(src: string, dest: string, skip: string[] = []) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n if (skip.includes(entry.name)) continue;\n\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath, skip);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n\n/**\n * Update package.json with correct SDK version and project name\n */\nfunction updatePackageJson(filePath: string, projectName: string, reactVersion: string) {\n const pkg = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n\n // Update name\n pkg.name = projectName;\n\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n\n // Remove private flag for user projects\n delete pkg.private;\n\n // Remove workspace-specific scripts\n delete pkg.scripts?.['dev:next'];\n delete pkg.scripts?.['build:next'];\n\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Update package.json for Next.js project\n */\nfunction updateNextPackageJson(filePath: string, projectName: string, reactVersion: string) {\n const pkg = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n\n // Update name\n pkg.name = projectName;\n\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n\n // Remove private flag for user projects\n delete pkg.private;\n\n // Update scripts for Next.js only\n pkg.scripts = {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n };\n\n // Remove vite-specific deps\n delete pkg.devDependencies?.['@tailwindcss/vite'];\n delete pkg.devDependencies?.['@vitejs/plugin-react'];\n delete pkg.devDependencies?.['vite'];\n\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\nexport async function initChat(projectNameArg?: string, options: InitChatOptions = {}) {\n const cwd = process.cwd();\n const chatSourceDir = getChatSourceDir();\n\n // Check if chat source exists\n if (!fs.existsSync(chatSourceDir)) {\n logger.error('Chat source files not found. This CLI installation may be corrupted.');\n process.exit(1);\n }\n\n logger.log('');\n logger.info('Scaffolding a frontend chat application...');\n logger.log('');\n\n // Get project name\n let projectName = projectNameArg;\n\n if (!projectName && !options.yes) {\n projectName = await prompt('Project name: ');\n }\n\n if (!projectName) {\n logger.error('Project name is required');\n process.exit(1);\n }\n\n const projectPath = path.join(cwd, projectName);\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n logger.error(`Directory \"${projectName}\" already exists`);\n process.exit(1);\n }\n\n // Step 1: Select framework\n let framework: Framework;\n if (options.framework) {\n framework = options.framework;\n } else if (options.yes) {\n framework = 'vite';\n } else {\n framework = await selectFramework();\n logger.log('');\n }\n\n // Step 2: Get Agentbuilder URL\n let serverUrl: string;\n if (options.yes) {\n serverUrl = 'http://localhost:5173';\n } else {\n const detectedUrl = await detectAgentbuilderInstance();\n\n if (detectedUrl) {\n logger.success(`Found agentbuilder at ${detectedUrl}`);\n const urlInput = await prompt(`Agentbuilder dev server URL [${detectedUrl}]: `);\n serverUrl = urlInput || detectedUrl;\n } else {\n logger.log('\\x1B[90mNo running agentbuilder instance found\\x1B[0m');\n const urlInput = await prompt('Agentbuilder dev server URL [http://localhost:5173]: ');\n serverUrl = urlInput || 'http://localhost:5173';\n }\n\n if (!isValidUrl(serverUrl)) {\n logger.error('Invalid URL format');\n process.exit(1);\n }\n }\n\n // Select package manager\n const detectedPm = detectPackageManager();\n let pm: PackageManager;\n if (options.yes) {\n pm = detectedPm;\n } else {\n pm = await selectPackageManager(detectedPm);\n logger.log('');\n }\n\n logger.log('');\n logger.info(`Creating ${framework === 'vite' ? 'Vite' : 'Next.js'} project...`);\n logger.log('');\n\n // Create project directory\n fs.mkdirSync(projectPath, { recursive: true });\n\n // Get React package version\n const reactVersion = getReactPackageVersion();\n\n // Copy source files based on framework\n if (framework === 'vite') {\n await scaffoldVite(projectPath, chatSourceDir, projectName, serverUrl, reactVersion);\n } else {\n await scaffoldNextjs(projectPath, chatSourceDir, projectName, serverUrl, reactVersion);\n }\n\n // Install dependencies\n logger.log('');\n logger.info('Installing dependencies...');\n logger.log('');\n\n try {\n await runCommand(pm, pm === 'npm' ? ['install'] : ['install'], projectPath);\n } catch (error) {\n logger.error('Failed to install dependencies');\n process.exit(1);\n }\n\n // Success message\n logger.log('');\n logger.success('Chat UI scaffolded successfully!');\n logger.log('');\n\n // Start dev server\n logger.info('Starting development server...');\n logger.log('');\n\n const devArgs = pm === 'npm' ? ['run', 'dev'] : ['dev'];\n const devProcess = spawn(pm, devArgs, {\n cwd: projectPath,\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: false,\n });\n\n let browserOpened = false;\n const openBrowser = (url: string) => {\n if (browserOpened) return;\n browserOpened = true;\n const openCmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n spawn(openCmd, [url], { stdio: 'ignore', detached: true }).unref();\n };\n\n devProcess.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stdout.write(data);\n\n const urlMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+\\/?)/);\n if (urlMatch && !browserOpened) {\n openBrowser(urlMatch[1]);\n }\n });\n\n devProcess.stderr?.on('data', (data: Buffer) => {\n process.stderr.write(data);\n });\n\n devProcess.on('error', (error) => {\n logger.error(`Failed to start dev server: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function scaffoldVite(\n projectPath: string,\n chatSourceDir: string,\n projectName: string,\n serverUrl: string,\n reactVersion: string\n) {\n // Copy shared source files\n copyDir(path.join(chatSourceDir, 'src'), path.join(projectPath, 'src'), []);\n logger.success('Copied src/');\n\n // Copy vite-specific files to root\n const viteDir = path.join(chatSourceDir, 'vite');\n\n // Copy and update index.html to point to src/main.tsx\n let indexHtml = fs.readFileSync(path.join(viteDir, 'index.html'), 'utf-8');\n indexHtml = indexHtml.replace('src=\"/main.tsx\"', 'src=\"/src/main.tsx\"');\n fs.writeFileSync(path.join(projectPath, 'index.html'), indexHtml, 'utf-8');\n logger.success('Created index.html');\n\n fs.copyFileSync(path.join(viteDir, 'main.tsx'), path.join(projectPath, 'src', 'main.tsx'));\n logger.success('Created src/main.tsx');\n\n // Read and adapt vite.config.ts (remove root and adjust paths)\n let viteConfig = fs.readFileSync(path.join(viteDir, 'vite.config.ts'), 'utf-8');\n // Simplify config for standalone project\n viteConfig = `import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport tailwindcss from '@tailwindcss/vite'\n\nexport default defineConfig({\n plugins: [\n react(),\n tailwindcss(),\n ],\n})\n`;\n fs.writeFileSync(path.join(projectPath, 'vite.config.ts'), viteConfig, 'utf-8');\n logger.success('Created vite.config.ts');\n\n // Copy and update tsconfig\n fs.copyFileSync(path.join(chatSourceDir, 'tsconfig.json'), path.join(projectPath, 'tsconfig.json'));\n // Update tsconfig to remove vite-specific include\n const tsconfig = JSON.parse(fs.readFileSync(path.join(projectPath, 'tsconfig.json'), 'utf-8'));\n tsconfig.include = ['src'];\n delete tsconfig.compilerOptions?.paths;\n fs.writeFileSync(path.join(projectPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n', 'utf-8');\n logger.success('Created tsconfig.json');\n\n // Copy and update package.json\n fs.copyFileSync(path.join(chatSourceDir, 'package.json'), path.join(projectPath, 'package.json'));\n // Read, modify, and write package.json\n const pkg = JSON.parse(fs.readFileSync(path.join(projectPath, 'package.json'), 'utf-8'));\n pkg.name = projectName;\n pkg.scripts = {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n };\n delete pkg.private;\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n // Remove next.js deps\n delete pkg.dependencies?.['next'];\n delete pkg.devDependencies?.['@tailwindcss/postcss'];\n delete pkg.devDependencies?.['postcss'];\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.success('Created package.json');\n\n // Create .env\n const envContent = `# Agentbuilder connection\nVITE_AGENTBUILDER_URL=${serverUrl}\n`;\n fs.writeFileSync(path.join(projectPath, '.env'), envContent, 'utf-8');\n logger.success('Created .env');\n\n // Create .gitignore\n fs.writeFileSync(path.join(projectPath, '.gitignore'), `node_modules\ndist\n.env\n`, 'utf-8');\n logger.success('Created .gitignore');\n\n // Update main.tsx paths (it expects ../src/ but now they're in same dir)\n let mainTsx = fs.readFileSync(path.join(projectPath, 'src', 'main.tsx'), 'utf-8');\n mainTsx = mainTsx\n .replace(/from '\\.\\.\\/src\\//g, \"from './\")\n .replace(/import '\\.\\.\\/src\\//g, \"import './\");\n fs.writeFileSync(path.join(projectPath, 'src', 'main.tsx'), mainTsx, 'utf-8');\n\n // Copy favicon\n if (fs.existsSync(path.join(viteDir, 'favicon.svg'))) {\n fs.copyFileSync(path.join(viteDir, 'favicon.svg'), path.join(projectPath, 'favicon.svg'));\n logger.success('Created favicon.svg');\n }\n}\n\nasync function scaffoldNextjs(\n projectPath: string,\n chatSourceDir: string,\n projectName: string,\n serverUrl: string,\n reactVersion: string\n) {\n // Copy shared source files to src/\n copyDir(path.join(chatSourceDir, 'src'), path.join(projectPath, 'src'), []);\n logger.success('Copied src/');\n\n // Copy next-specific files\n const nextDir = path.join(chatSourceDir, 'next');\n\n // Copy app directory\n copyDir(path.join(nextDir, 'app'), path.join(projectPath, 'app'), []);\n logger.success('Copied app/');\n\n // Copy next.config.ts\n fs.copyFileSync(path.join(nextDir, 'next.config.ts'), path.join(projectPath, 'next.config.ts'));\n logger.success('Created next.config.ts');\n\n // Copy postcss.config.mjs\n fs.copyFileSync(path.join(nextDir, 'postcss.config.mjs'), path.join(projectPath, 'postcss.config.mjs'));\n logger.success('Created postcss.config.mjs');\n\n // Create tsconfig.json for Next.js\n const tsconfig = {\n compilerOptions: {\n target: \"ES2017\",\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"esnext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"preserve\",\n incremental: true,\n plugins: [{ name: \"next\" }],\n paths: {\n \"@/*\": [\"./src/*\"]\n }\n },\n include: [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n exclude: [\"node_modules\"]\n };\n fs.writeFileSync(path.join(projectPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n', 'utf-8');\n logger.success('Created tsconfig.json');\n\n // Create package.json for Next.js\n const pkg = JSON.parse(fs.readFileSync(path.join(chatSourceDir, 'package.json'), 'utf-8'));\n pkg.name = projectName;\n pkg.scripts = {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n };\n delete pkg.private;\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n // Remove vite-specific deps\n delete pkg.devDependencies?.['@tailwindcss/vite'];\n delete pkg.devDependencies?.['@vitejs/plugin-react'];\n delete pkg.devDependencies?.['vite'];\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.success('Created package.json');\n\n // Create .env.local\n const envContent = `# Agentbuilder connection\nNEXT_PUBLIC_AGENTBUILDER_URL=${serverUrl}\n`;\n fs.writeFileSync(path.join(projectPath, '.env.local'), envContent, 'utf-8');\n logger.success('Created .env.local');\n\n // Create .gitignore\n fs.writeFileSync(path.join(projectPath, '.gitignore'), `node_modules\n.next\nout\n.env.local\n`, 'utf-8');\n logger.success('Created .gitignore');\n\n // Update layout.tsx paths\n let layoutTsx = fs.readFileSync(path.join(projectPath, 'app', 'layout.tsx'), 'utf-8');\n layoutTsx = layoutTsx.replace(/from '\\.\\.\\/\\.\\.\\/src\\//g, \"from '../src/\");\n fs.writeFileSync(path.join(projectPath, 'app', 'layout.tsx'), layoutTsx, 'utf-8');\n\n // Update page.tsx paths\n let pageTsx = fs.readFileSync(path.join(projectPath, 'app', 'page.tsx'), 'utf-8');\n pageTsx = pageTsx.replace(/from '\\.\\.\\/\\.\\.\\/src\\//g, \"from '../src/\");\n fs.writeFileSync(path.join(projectPath, 'app', 'page.tsx'), pageTsx, 'utf-8');\n}\n","import { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { dirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\nimport { init } from './commands/init.js';\nimport { scaffold } from './commands/scaffold.js';\nimport { initChat } from './commands/init-chat.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('agents')\n .description('CLI tool for Standard Agents / AgentBuilder')\n .version(pkg.version);\n\nprogram\n .command('init [project-name]')\n .description('Create a new Standard Agents project (runs create vite, then scaffold)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--template <template>', 'Vite template to use', 'vanilla-ts')\n .action(init);\n\nprogram\n .command('scaffold')\n .description('Add Standard Agents to an existing Vite project')\n .option('--force', 'Overwrite existing configuration')\n .action(scaffold);\n\nprogram\n .command('init-chat [project-name]')\n .description('Scaffold a frontend chat application')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--framework <framework>', 'Framework to use (vite or nextjs)')\n .action(initChat);\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/templates/root.ts","../src/templates/models.ts","../src/templates/prompts.ts","../src/templates/agents.ts","../src/templates/tools.ts","../src/templates/hooks.ts","../src/templates/api.ts","../src/commands/scaffold.ts","../src/commands/init.ts","../src/commands/init-chat.ts","../src/index.ts"],"names":["path","fs","pkg","resolve","__dirname","fileURLToPath","prompt","readline","runCommand","spawn","detectPackageManager","selectPackageManager"],"mappings":";;;;;;;;;;;;;;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,OAAA,EAAS,CAAC,OAAA,KAAoB;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,OAAA,KAAoB;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,OAAA,KAAoB;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACxC,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,OAAA,KAAoB;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACtC,CAAA;AAAA,EACA,GAAA,EAAK,CAAC,OAAA,KAAoB;AACxB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrB;AACF,CAAA;;;AClBO,IAAM,cAAA,GAAiB,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACAvB,IAAM,gBAAA,GAAmB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAzB,IAAM,iBAAA,GAAoB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACA1B,IAAM,gBAAA,GAAmB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAzB,IAAM,eAAA,GAAkB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;;;ACAxB,IAAM,eAAA,GAAkB,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA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","file":"index.js","sourcesContent":["import chalk from 'chalk';\n\nexport const logger = {\n success: (message: string) => {\n console.log(chalk.green('✓'), message);\n },\n error: (message: string) => {\n console.log(chalk.red('✗'), message);\n },\n warning: (message: string) => {\n console.log(chalk.yellow('⚠'), message);\n },\n info: (message: string) => {\n console.log(chalk.blue('ℹ'), message);\n },\n log: (message: string) => {\n console.log(message);\n },\n};\n","export const ROOT_CLAUDE_MD = `# Standard Agents\n\nThis project uses Standard Agents - a framework for building AI agents on Cloudflare Workers.\n\n## Architecture Overview\n\nStandard Agents uses a **composition model** where four core components work together:\n\n\\`\\`\\`\nModel → Prompt → Agent → Thread\n │ │ │ │\n │ │ │ └─ Conversation instance (Durable Object)\n │ │ └─ Orchestrates conversation flow\n │ └─ System instructions + tools\n └─ LLM provider configuration\n\\`\\`\\`\n\n**Models** define which LLM to use (provider, model ID, pricing, fallbacks).\n**Prompts** define what the LLM should do (system instructions, available tools).\n**Agents** orchestrate conversations (which prompt, stop conditions, turn limits).\n**Threads** are individual conversation instances with persistent storage.\n\n## How Components Compose\n\n### Basic Flow\n1. User creates a thread with an agent\n2. Agent uses its configured prompt\n3. Prompt specifies the model and tools\n4. LLM responds, potentially calling tools\n5. Tools execute and return results\n6. Loop continues until stop condition\n\n### Sub-Prompts (Prompts as Tools)\nPrompts can call other prompts as tools. This enables:\n- **Specialized reasoning**: A main prompt delegates to expert sub-prompts\n- **Structured outputs**: Sub-prompt validates and formats data\n- **Context isolation**: Sub-prompt gets fresh context without full history\n\n\\`\\`\\`typescript\n// Main prompt can call 'data_extractor' as a tool\ndefinePrompt({\n name: 'main_assistant',\n tools: ['data_extractor'], // Another prompt exposed as tool\n // ...\n});\n\\`\\`\\`\n\n### Agent Handoffs (Agents as Tools)\nAgents can delegate to other agents entirely:\n- **Specialization**: Route to domain-specific agents\n- **Escalation**: Hand off to more capable agents\n- **Workflows**: Chain agents for multi-step processes\n\n\\`\\`\\`typescript\ndefineAgent({\n name: 'triage_agent',\n exposeAsTool: true,\n toolDescription: 'Hand off to triage for initial assessment',\n // ...\n});\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\nagents/\n├── CLAUDE.md # This file\n├── Thread.ts # Durable Object for conversation threads\n├── AgentBuilder.ts # Durable Object for metadata\n├── agents/ # Agent definitions (defineAgent)\n│ └── CLAUDE.md\n├── prompts/ # Prompt definitions (definePrompt)\n│ └── CLAUDE.md\n├── models/ # Model configurations (defineModel)\n│ └── CLAUDE.md\n├── tools/ # Custom tools (defineTool)\n│ └── CLAUDE.md\n├── hooks/ # Lifecycle hooks (defineHook)\n│ └── CLAUDE.md\n└── api/ # Thread API endpoints (defineThreadEndpoint)\n └── CLAUDE.md\n\\`\\`\\`\n\nFiles are **auto-discovered** at runtime. No manual registration needed.\n\n## FlowState\n\n\\`FlowState\\` is the central state object available in tools and hooks:\n\n\\`\\`\\`typescript\ninterface FlowState {\n thread: {\n id: string; // Thread identifier\n instance: DurableThread; // Durable Object instance\n };\n agent: AgentConfig; // Current agent configuration\n prompt: PromptConfig; // Current prompt configuration\n model: ModelConfig; // Current model configuration\n messages: Message[]; // Conversation history\n env: Env; // Cloudflare Worker environment\n rootState: FlowState; // Parent state (for sub-prompts)\n}\n\\`\\`\\`\n\nAccess in tools:\n\\`\\`\\`typescript\nexport default defineTool('...', schema, async (flow, args) => {\n const threadId = flow.thread.id;\n const messages = flow.messages;\n // ...\n});\n\\`\\`\\`\n\n## Quick Reference\n\n| Function | Purpose | Directory |\n|----------|---------|-----------|\n| \\`defineModel()\\` | Configure LLM provider | \\`agents/models/\\` |\n| \\`definePrompt()\\` | System instructions + tools | \\`agents/prompts/\\` |\n| \\`defineAgent()\\` | Conversation orchestration | \\`agents/agents/\\` |\n| \\`defineTool()\\` | Custom tool functions | \\`agents/tools/\\` |\n| \\`defineHook()\\` | Lifecycle interception | \\`agents/hooks/\\` |\n| \\`defineThreadEndpoint()\\` | Custom API routes | \\`agents/api/\\` |\n\n## Runtime Utilities\n\nImport from \\`@standardagents/builder\\`:\n\n\\`\\`\\`typescript\nimport {\n queueTool, // Queue another tool for execution\n injectMessage, // Add message without triggering execution\n getMessages, // Retrieve message history\n emitThreadEvent, // Send custom WebSocket events\n} from '@standardagents/builder';\n\\`\\`\\`\n\n## Documentation\n\nFull documentation: https://docs.standardagentbuilder.com\n\n- [Architecture Overview](https://docs.standardagentbuilder.com/introduction/architecture)\n- [Models](https://docs.standardagentbuilder.com/core-concepts/models)\n- [Prompts](https://docs.standardagentbuilder.com/core-concepts/prompts)\n- [Agents](https://docs.standardagentbuilder.com/core-concepts/agents)\n- [Tools](https://docs.standardagentbuilder.com/core-concepts/tools)\n- [Hooks](https://docs.standardagentbuilder.com/core-concepts/hooks)\n- [FlowState](https://docs.standardagentbuilder.com/core-concepts/flowstate)\n- [Thread API](https://docs.standardagentbuilder.com/core-concepts/api)\n`;\n","export const MODELS_CLAUDE_MD = `# Model Definitions\n\nModels define which LLM provider and model to use for prompts.\n\n## Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this model configuration |\n| \\`provider\\` | \\`'openai' \\\\| 'anthropic' \\\\| 'openrouter' \\\\| 'google'\\` | Yes | LLM provider |\n| \\`model\\` | \\`string\\` | Yes | Model ID sent to provider API |\n| \\`fallbacks\\` | \\`string[]\\` | No | Fallback model names to try if primary fails |\n| \\`inputPrice\\` | \\`number\\` | No | Cost per 1M input tokens (USD) |\n| \\`outputPrice\\` | \\`number\\` | No | Cost per 1M output tokens (USD) |\n| \\`cachedPrice\\` | \\`number\\` | No | Cost per 1M cached input tokens |\n| \\`includedProviders\\` | \\`string[]\\` | No | Provider prefixes for OpenRouter routing |\n\n## Example\n\n\\`\\`\\`typescript\nimport { defineModel } from '@standardagents/builder';\n\nexport default defineModel({\n name: 'default',\n provider: 'openrouter',\n model: 'google/gemini-3-flash-preview',\n fallbacks: ['fast', 'cheap-heavy'],\n});\n\\`\\`\\`\n\n## Recommended Models (OpenRouter)\n\n| Use Case | Model ID | Description |\n|----------|----------|-------------|\n| Fast/Cheap | \\`z-ai/glm-4.5-air\\` | Quick responses, low cost |\n| Mid-tier | \\`google/gemini-3-flash-preview\\` | Good balance of speed and quality |\n| Cheap Heavy | \\`z-ai/glm-4.7\\` | More capable, still affordable |\n| Heavy | \\`google/gemini-3-pro-preview\\` | Most capable, for complex tasks |\n\n**⚠️ Google Models**: When using Google models (\\`google/gemini-*\\`), you must enable \\`reasoning\\` in your prompt configuration or tool calls will fail. See the prompts CLAUDE.md for details.\n\n## Provider API Keys\n\nSet these environment variables in \\`.dev.vars\\` (local) or Cloudflare secrets (production):\n\n| Provider | Environment Variable |\n|----------|---------------------|\n| OpenAI | \\`OPENAI_API_KEY\\` |\n| Anthropic | \\`ANTHROPIC_API_KEY\\` |\n| OpenRouter | \\`OPENROUTER_API_KEY\\` |\n| Google | \\`GOOGLE_API_KEY\\` |\n\n## Fallback Strategy\n\nWhen a model fails, fallbacks are tried in order:\n1. Primary model (2 attempts)\n2. First fallback (2 attempts)\n3. Second fallback (2 attempts)\n4. ...and so on\n\nRetries occur on: network errors, rate limits (429), server errors (5xx), auth errors (401).\n\n## OpenRouter Configuration\n\nFor OpenRouter, use the full model path:\n\n\\`\\`\\`typescript\nexport default defineModel({\n name: 'heavy',\n provider: 'openrouter',\n model: 'google/gemini-3-pro-preview',\n includedProviders: ['google'], // Prefer Google's servers\n});\n\\`\\`\\`\n\n## Best Practices\n\n- **Name by use case**, not model ID (e.g., \\`fast\\`, \\`default\\`, \\`heavy\\`)\n- **Configure fallbacks** for production reliability\n- **Set pricing** for cost tracking in logs\n- **Use environment variables** for API keys, never hardcode\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/model\n`;\n","export const PROMPTS_CLAUDE_MD = `# Prompt Definitions\n\nPrompts define system instructions, model selection, and available tools for LLM interactions.\n\n## Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this prompt |\n| \\`toolDescription\\` | \\`string\\` | Yes | Description shown when used as a tool |\n| \\`prompt\\` | \\`string \\\\| StructuredPrompt\\` | Yes | System instructions |\n| \\`model\\` | \\`string\\` | Yes | Model name to use (references \\`agents/models/\\`) |\n| \\`tools\\` | \\`(string \\\\| ToolConfig)[]\\` | No | Available tools (include ai_human agent names for handoffs) |\n| \\`includeChat\\` | \\`boolean\\` | No | Include full conversation history |\n| \\`includePastTools\\` | \\`boolean\\` | No | Include previous tool results |\n| \\`parallelToolCalls\\` | \\`boolean\\` | No | Allow multiple concurrent tool calls |\n| \\`toolChoice\\` | \\`'auto' \\\\| 'none' \\\\| 'required'\\` | No | Tool calling strategy |\n| \\`requiredSchema\\` | \\`z.ZodObject\\` | No | Input validation when called as tool |\n| \\`reasoning\\` | \\`ReasoningConfig\\` | No | Extended thinking configuration |\n\n## Basic Example\n\n\\`\\`\\`typescript\nimport { definePrompt } from '@standardagents/builder';\n\nexport default definePrompt({\n name: 'customer_support',\n toolDescription: 'Handle customer support inquiries',\n model: 'default',\n prompt: \\`You are a helpful customer support agent.\nAlways be polite and professional.\nIf you cannot help, escalate to a human.\\`,\n tools: ['search_knowledge_base', 'create_ticket'],\n includeChat: true,\n});\n\\`\\`\\`\n\n## Structured Prompts\n\nInclude other prompts for reusable instruction blocks:\n\n\\`\\`\\`typescript\nexport default definePrompt({\n name: 'main_assistant',\n toolDescription: 'Primary assistant',\n model: 'default',\n prompt: [\n { type: 'text', content: 'You are a helpful assistant.\\\\n\\\\n' },\n { type: 'include', prompt: 'common_rules' }, // Includes another prompt\n { type: 'text', content: '\\\\n\\\\nBe concise.' },\n ],\n});\n\\`\\`\\`\n\n## Tool Configuration\n\nTools can be simple names or detailed configs:\n\n\\`\\`\\`typescript\ntools: [\n 'simple_tool', // Just the tool name\n {\n name: 'complex_tool',\n includeTextResponse: true, // Include sub-prompt text in result\n includeToolCalls: false, // Exclude sub-prompt tool calls\n includeErrors: true, // Include error details\n initUserMessageProperty: 'query', // Use this arg as initial message\n },\n],\n\\`\\`\\`\n\n## Input Validation\n\nValidate inputs when prompt is called as a tool:\n\n\\`\\`\\`typescript\nimport { z } from 'zod';\n\nexport default definePrompt({\n name: 'data_extractor',\n toolDescription: 'Extract structured data from text',\n model: 'default',\n prompt: 'Extract the requested data from the input.',\n requiredSchema: z.object({\n text: z.string().describe('Text to extract from'),\n fields: z.array(z.string()).describe('Fields to extract'),\n }),\n});\n\\`\\`\\`\n\n## Extended Thinking (Reasoning)\n\nEnable for complex reasoning tasks:\n\n\\`\\`\\`typescript\nexport default definePrompt({\n name: 'code_reviewer',\n toolDescription: 'Review code for issues',\n model: 'heavy',\n prompt: 'Review the code thoroughly...',\n reasoning: {\n effort: 'high', // 'low' | 'medium' | 'high'\n maxTokens: 16000, // Max thinking tokens\n exclude: true, // Don't include thinking in response\n },\n});\n\\`\\`\\`\n\n**⚠️ Google Models Require Reasoning**: When using Google models (\\`google/gemini-*\\`) via OpenRouter, you **must** include \\`reasoning\\` configuration or tool calls will fail. At minimum:\n\n\\`\\`\\`typescript\nreasoning: {\n effort: 'low', // Can be 'low', 'medium', or 'high'\n},\n\\`\\`\\`\n\n## Best Practices\n\n- **Write clear instructions** - Structure with headers and bullet points\n- **Describe tools thoroughly** - LLMs decide based on descriptions\n- **Validate inputs with Zod** - Catch errors early\n- **Use \\`includeChat\\`** for conversational context\n- **Name by purpose**, not model (e.g., \\`support_agent\\` not \\`gpt4_prompt\\`)\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/prompt\n`;\n","export const AGENTS_CLAUDE_MD = `# Agent Definitions\n\nAgents orchestrate conversations by defining prompts, stop conditions, and turn limits.\n\n## Agent Properties\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`name\\` | \\`string\\` | Yes | Unique identifier for this agent |\n| \\`type\\` | \\`'ai_human' \\\\| 'dual_ai'\\` | No | Conversation type (default: \\`ai_human\\`) |\n| \\`sideA\\` | \\`SideConfig\\` | Yes | Configuration for side A (AI in ai_human) |\n| \\`sideB\\` | \\`SideConfig\\` | No | Configuration for side B (required for dual_ai) |\n| \\`maxSessionTurns\\` | \\`number\\` | No | Max total turns across both sides |\n| \\`exposeAsTool\\` | \\`boolean\\` | No | Allow other prompts to hand off to this agent |\n| \\`toolDescription\\` | \\`string\\` | No | Description when used as tool (required if exposeAsTool) |\n| \\`tags\\` | \\`string[]\\` | No | Tags for categorization and filtering |\n\n## Side Configuration\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| \\`label\\` | \\`string\\` | No | Display name for this side |\n| \\`prompt\\` | \\`string\\` | Yes | Prompt name to use (references \\`agents/prompts/\\`) |\n| \\`stopOnResponse\\` | \\`boolean\\` | No | Stop turn when LLM returns text (default: true) |\n| \\`stopTool\\` | \\`string\\` | No | Tool that stops this side's turn |\n| \\`stopToolResponseProperty\\` | \\`string\\` | No | Property to extract from stop tool result |\n| \\`endConversationTool\\` | \\`string\\` | No | Tool that ends the entire conversation |\n| \\`maxTurns\\` | \\`number\\` | No | Maximum turns for this side |\n| \\`manualStopCondition\\` | \\`boolean\\` | No | Enable custom stop handling via hooks |\n\n## Basic Example (AI-Human)\n\n\\`\\`\\`typescript\nimport { defineAgent } from '@standardagents/builder';\n\nexport default defineAgent({\n name: 'support_agent',\n type: 'ai_human',\n sideA: {\n label: 'Support',\n prompt: 'customer_support',\n stopOnResponse: true,\n endConversationTool: 'close_ticket',\n maxTurns: 50,\n },\n tags: ['support', 'tier-1'],\n});\n\\`\\`\\`\n\n## Dual-AI Example\n\nTwo AI agents conversing (e.g., debate, iterative refinement):\n\n\\`\\`\\`typescript\nexport default defineAgent({\n name: 'code_review_debate',\n type: 'dual_ai',\n maxSessionTurns: 20,\n sideA: {\n label: 'Reviewer',\n prompt: 'code_reviewer',\n stopOnResponse: true,\n },\n sideB: {\n label: 'Developer',\n prompt: 'code_defender',\n stopOnResponse: true,\n },\n});\n\\`\\`\\`\n\n## Agent Handoffs\n\nExpose an agent for handoffs from other prompts:\n\n\\`\\`\\`typescript\nexport default defineAgent({\n name: 'escalation_agent',\n type: 'ai_human',\n exposeAsTool: true,\n toolDescription: 'Escalate to senior support for complex issues',\n sideA: {\n prompt: 'senior_support',\n },\n});\n\\`\\`\\`\n\nOther prompts can then include the agent name in their \\`tools\\` array to enable handoffs.\n\n## Stop Conditions (Priority Order)\n\n1. **endConversationTool** - Ends entire conversation (highest priority)\n2. **stopTool** - Ends current side's turn\n3. **maxTurns** - Ends side's participation when reached\n4. **stopOnResponse** - Ends turn when LLM returns text\n5. **maxSessionTurns** - Ends conversation (hard limit: 250)\n\n## Naming Convention\n\nAgent names **must** end with the \\`_agent\\` suffix (e.g., \\`support_agent\\`, \\`research_agent\\`).\nThis convention is enforced by the builder UI and makes agents easily identifiable in logs and code.\n\n## Best Practices\n\n- **Use descriptive names** (\\`customer_support_agent\\` not \\`agent1\\`)\n- **Always use the _agent suffix** - names like \\`support_agent\\`, \\`research_agent\\`\n- **Always set maxTurns** as a safety limit\n- **Match stop conditions to use case** - chat apps use stopOnResponse, workflows use stopTool\n- **Use labels** for clarity in logs and UI\n- **Organize with tags** for filtering\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/agent\n`;\n","export const TOOLS_CLAUDE_MD = `# Custom Tools\n\nTools extend agent capabilities beyond text generation. They allow LLMs to fetch data, perform calculations, execute side effects, and chain to other prompts or agents.\n\n## Function Signature\n\n\\`\\`\\`typescript\ndefineTool(\n description: string, // What the tool does (shown to LLM)\n args: z.ZodObject, // Input validation schema\n handler: (flow, args) => ToolResult, // Implementation\n returnSchema?: z.ZodObject // Optional output schema\n)\n\\`\\`\\`\n\n## Basic Example\n\n\\`\\`\\`typescript\nimport { defineTool } from '@standardagents/builder';\nimport { z } from 'zod';\n\nexport default defineTool(\n 'Search the knowledge base for articles matching a query',\n z.object({\n query: z.string().describe('Search query'),\n limit: z.number().optional().default(10).describe('Max results'),\n }),\n async (flow, args) => {\n const results = await searchKB(args.query, args.limit);\n return {\n status: 'success',\n result: JSON.stringify(results),\n };\n }\n);\n\\`\\`\\`\n\n## ToolResult Interface\n\n| Property | Type | Description |\n|----------|------|-------------|\n| \\`status\\` | \\`'success' \\\\| 'error'\\` | Whether the tool succeeded |\n| \\`result\\` | \\`string\\` | Tool output (required for success) |\n| \\`error\\` | \\`string\\` | Error message (for error status) |\n\n## FlowState Access\n\nThe \\`flow\\` parameter provides access to:\n\n\\`\\`\\`typescript\nasync (flow, args) => {\n // Thread information\n const threadId = flow.thread.id;\n const thread = flow.thread.instance;\n\n // Configuration\n const agentName = flow.agent.name;\n const modelName = flow.model.name;\n\n // Message history\n const messages = flow.messages;\n\n // Environment bindings\n const env = flow.env;\n\n // Parent state (for sub-prompts)\n const root = flow.rootState;\n}\n\\`\\`\\`\n\n## Tool Without Arguments\n\n\\`\\`\\`typescript\nexport default defineTool(\n 'Get current server time',\n async (flow) => {\n return {\n status: 'success',\n result: new Date().toISOString(),\n };\n }\n);\n\\`\\`\\`\n\n## Error Handling\n\nReturn errors gracefully instead of throwing:\n\n\\`\\`\\`typescript\nexport default defineTool(\n 'Fetch user data',\n z.object({ userId: z.string() }),\n async (flow, args) => {\n try {\n const user = await fetchUser(args.userId);\n return { status: 'success', result: JSON.stringify(user) };\n } catch (error) {\n return {\n status: 'error',\n error: \\`Failed to fetch user: \\${error.message}\\`,\n };\n }\n }\n);\n\\`\\`\\`\n\n## Queueing Additional Tools\n\nQueue another tool to run after the current one:\n\n\\`\\`\\`typescript\nimport { queueTool } from '@standardagents/builder';\n\nexport default defineTool(\n 'Create order and send confirmation',\n z.object({ items: z.array(z.string()) }),\n async (flow, args) => {\n const order = await createOrder(args.items);\n\n // Queue email tool to run next\n queueTool(flow, 'send_confirmation_email', {\n orderId: order.id,\n email: flow.thread.metadata.userEmail,\n });\n\n return { status: 'success', result: JSON.stringify(order) };\n }\n);\n\\`\\`\\`\n\n## Injecting Messages\n\nAdd messages without triggering re-execution:\n\n\\`\\`\\`typescript\nimport { injectMessage } from '@standardagents/builder';\n\nexport default defineTool(\n 'Log audit event',\n z.object({ event: z.string() }),\n async (flow, args) => {\n await injectMessage(flow, {\n role: 'system',\n content: \\`[AUDIT] \\${args.event}\\`,\n });\n return { status: 'success', result: 'Logged' };\n }\n);\n\\`\\`\\`\n\n## Best Practices\n\n- **Write clear descriptions** - LLMs decide tool usage based on descriptions\n- **Describe all parameters** with \\`.describe()\\` in Zod schemas\n- **Handle errors gracefully** - return error status, don't throw\n- **Use snake_case** for file names (\\`search_knowledge_base.ts\\`)\n- **Keep tools focused** - one task per tool\n- **Use \\`flow.rootState\\`** when queueing from sub-prompts\n\n## Supported Zod Types\n\n- Primitives: \\`string\\`, \\`number\\`, \\`boolean\\`, \\`null\\`\n- Enums: \\`z.enum(['a', 'b', 'c'])\\`\n- Arrays: \\`z.array(z.string())\\`\n- Objects: \\`z.object({ ... })\\`\n- Optional: \\`z.string().optional()\\`\n- Default: \\`z.number().default(10)\\`\n- Nullable: \\`z.string().nullable()\\`\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/tool\n`;\n","export const HOOKS_CLAUDE_MD = `# Lifecycle Hooks\n\nHooks intercept and modify agent execution at specific lifecycle points.\n\n## Available Hooks\n\n| Hook | Signature | Purpose |\n|------|-----------|---------|\n| \\`filter_messages\\` | \\`(state, rows) => Message[]\\` | Filter raw message rows before LLM context |\n| \\`prefilter_llm_history\\` | \\`(state, messages) => Message[]\\` | Modify messages after filtering, before LLM |\n| \\`before_create_message\\` | \\`(state, message) => Message\\` | Modify message before database insert |\n| \\`after_create_message\\` | \\`(state, message) => void\\` | Run logic after message created |\n| \\`before_update_message\\` | \\`(state, id, updates) => Updates\\` | Modify updates before message update |\n| \\`after_update_message\\` | \\`(state, message) => void\\` | Run logic after message updated |\n| \\`before_store_tool_result\\` | \\`(state, toolCall, result) => Result\\` | Modify tool result before storage |\n| \\`after_tool_call_success\\` | \\`(state, toolCall, result) => Result\\` | Process successful tool execution |\n| \\`after_tool_call_failure\\` | \\`(state, toolCall, result) => Result\\` | Process failed tool execution |\n\n## File Naming\n\nHook files **must** be named exactly as the hook type:\n\n\\`\\`\\`\nagents/hooks/\n├── filter_messages.ts\n├── prefilter_llm_history.ts\n├── before_create_message.ts\n├── after_create_message.ts\n├── before_update_message.ts\n├── after_update_message.ts\n├── before_store_tool_result.ts\n├── after_tool_call_success.ts\n└── after_tool_call_failure.ts\n\\`\\`\\`\n\n## Examples\n\n### Filter Messages (Limit Context)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('filter_messages', async (state, rows) => {\n // Only include last 20 messages\n return rows.slice(-20);\n});\n\\`\\`\\`\n\n### Prefilter LLM History (Modify Content)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('prefilter_llm_history', async (state, messages) => {\n // Remove sensitive data from message content\n return messages.map(msg => ({\n ...msg,\n content: msg.content?.replace(/\\\\b\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}\\\\b/g, '[REDACTED]'),\n }));\n});\n\\`\\`\\`\n\n### Before Create Message (Add Metadata)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('before_create_message', async (state, message) => {\n return {\n ...message,\n metadata: {\n ...message.metadata,\n createdAt: Date.now(),\n agentVersion: '1.0.0',\n },\n };\n});\n\\`\\`\\`\n\n### After Tool Call Success (Logging)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('after_tool_call_success', async (state, toolCall, result) => {\n console.log(\\`Tool \\${toolCall.function.name} succeeded:\\`, result);\n return result; // Return result unchanged, or modify it\n});\n\\`\\`\\`\n\n### After Tool Call Failure (Recovery)\n\n\\`\\`\\`typescript\nimport { defineHook } from '@standardagents/builder';\n\nexport default defineHook('after_tool_call_failure', async (state, toolCall, result) => {\n // Override error with fallback result\n if (toolCall.function.name === 'fetch_weather') {\n return {\n status: 'success',\n result: JSON.stringify({ temp: 'unavailable', fallback: true }),\n };\n }\n return result; // Return original error\n});\n\\`\\`\\`\n\n## Hook Categories\n\n**Transformation hooks** (return modified data):\n- \\`filter_messages\\`\n- \\`prefilter_llm_history\\`\n- \\`before_create_message\\`\n- \\`before_update_message\\`\n- \\`before_store_tool_result\\`\n- \\`after_tool_call_success\\`\n- \\`after_tool_call_failure\\`\n\n**Event hooks** (side effects only):\n- \\`after_create_message\\`\n- \\`after_update_message\\`\n\n## Best Practices\n\n- **Keep hooks fast** - target <100ms execution\n- **Wrap in try-catch** - hooks continue on error\n- **Validate input data** before processing\n- **Document purpose** with clear comments\n- **Use for cross-cutting concerns** - logging, redaction, enrichment\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/api-reference/define/hook\n`;\n","export const API_CLAUDE_MD = `# Thread-Specific API Endpoints\n\nDefine custom API endpoints that operate on specific threads with access to the thread's Durable Object instance and SQLite storage.\n\n## File-Based Routing\n\n| File Pattern | HTTP Method | Route |\n|--------------|-------------|-------|\n| \\`name.ts\\` | GET | \\`/api/threads/:id/name\\` |\n| \\`name.get.ts\\` | GET | \\`/api/threads/:id/name\\` |\n| \\`name.post.ts\\` | POST | \\`/api/threads/:id/name\\` |\n| \\`name.put.ts\\` | PUT | \\`/api/threads/:id/name\\` |\n| \\`name.delete.ts\\` | DELETE | \\`/api/threads/:id/name\\` |\n| \\`nested/route.ts\\` | GET | \\`/api/threads/:id/nested/route\\` |\n\n## Basic Example\n\n\\`\\`\\`typescript\n// agents/api/status.get.ts -> GET /api/threads/:id/status\nimport { defineThreadEndpoint } from '@standardagents/builder';\n\nexport default defineThreadEndpoint(async (thread, request, env) => {\n const messages = await thread.getMessages();\n return new Response(JSON.stringify({\n messageCount: messages.length,\n status: 'active',\n }), {\n headers: { 'Content-Type': 'application/json' },\n });\n});\n\\`\\`\\`\n\n## Handler Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| \\`thread\\` | \\`DurableThread\\` | The thread's Durable Object instance |\n| \\`request\\` | \\`Request\\` | The incoming HTTP request |\n| \\`env\\` | \\`Env\\` | Cloudflare Worker environment bindings |\n\n## Thread Methods\n\nAccess thread data through the instance:\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n // Message operations\n const messages = await thread.getMessages({ limit: 100, offset: 0 });\n const count = await thread.getMessageCount();\n\n // Thread metadata\n const metadata = thread.getMetadata();\n\n // Execution control\n await thread.stop();\n\n // Custom SQL queries\n const result = thread.ctx.storage.sql.exec(\\`\n SELECT * FROM messages WHERE role = 'user'\n \\`);\n});\n\\`\\`\\`\n\n## POST with Request Body\n\n\\`\\`\\`typescript\n// agents/api/export.post.ts -> POST /api/threads/:id/export\nimport { defineThreadEndpoint } from '@standardagents/builder';\n\nexport default defineThreadEndpoint(async (thread, request, env) => {\n const body = await request.json();\n const { format = 'json' } = body;\n\n const messages = await thread.getMessages();\n\n if (format === 'csv') {\n const csv = messages.map(m => \\`\\${m.role},\\${m.content}\\`).join('\\\\n');\n return new Response(csv, {\n headers: { 'Content-Type': 'text/csv' },\n });\n }\n\n return new Response(JSON.stringify(messages), {\n headers: { 'Content-Type': 'application/json' },\n });\n});\n\\`\\`\\`\n\n## Nested Routes\n\nCreate directories for nested routes:\n\n\\`\\`\\`\nagents/api/\n├── status.get.ts -> GET /api/threads/:id/status\n├── export.post.ts -> POST /api/threads/:id/export\n└── messages/\n ├── count.ts -> GET /api/threads/:id/messages/count\n └── search.post.ts -> POST /api/threads/:id/messages/search\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n try {\n const data = await riskyOperation();\n return new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(JSON.stringify({\n error: error.message,\n }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n});\n\\`\\`\\`\n\n## Using Environment Variables\n\n\\`\\`\\`typescript\nexport default defineThreadEndpoint(async (thread, request, env) => {\n // Access secrets and bindings\n const apiKey = env.EXTERNAL_API_KEY;\n const kv = env.MY_KV_NAMESPACE;\n\n const data = await fetchExternalAPI(apiKey);\n await kv.put(\\`thread:\\${thread.id}\\`, JSON.stringify(data));\n\n return new Response('OK');\n});\n\\`\\`\\`\n\n## Best Practices\n\n- **Keep handlers fast** - endpoints are in the request path\n- **Paginate large queries** - use limit/offset for messages\n- **Validate input data** - check request body before processing\n- **Use descriptive file names** - \\`export.post.ts\\` not \\`ep1.ts\\`\n- **Return proper status codes** - 200, 400, 404, 500\n\n## Documentation\n\nFull reference: https://docs.standardagentbuilder.com/core-concepts/api\n`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { parse, modify, applyEdits } from 'jsonc-parser';\nimport { loadFile, writeFile, generateCode, parseModule, builders } from 'magicast';\nimport { addVitePlugin } from 'magicast/helpers';\nimport { logger } from '../utils/logger.js';\nimport {\n ROOT_CLAUDE_MD,\n MODELS_CLAUDE_MD,\n PROMPTS_CLAUDE_MD,\n AGENTS_CLAUDE_MD,\n TOOLS_CLAUDE_MD,\n HOOKS_CLAUDE_MD,\n API_CLAUDE_MD,\n} from '../templates/index.js';\n\ninterface ScaffoldOptions {\n force?: boolean;\n}\n\n// Template for wrangler.jsonc\nconst WRANGLER_TEMPLATE = (name: string) => `{\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"${name}\",\n \"main\": \"worker/index.ts\",\n \"compatibility_date\": \"2025-01-01\",\n \"compatibility_flags\": [\"nodejs_compat\"],\n \"observability\": {\n \"enabled\": true\n },\n \"assets\": {\n \"directory\": \"dist\",\n \"not_found_handling\": \"single-page-application\",\n \"binding\": \"ASSETS\",\n \"run_worker_first\": [\"/**\"]\n },\n \"durable_objects\": {\n \"bindings\": [\n {\n \"name\": \"AGENT_BUILDER_THREAD\",\n \"class_name\": \"DurableThread\"\n },\n {\n \"name\": \"AGENT_BUILDER\",\n \"class_name\": \"DurableAgentBuilder\"\n }\n ]\n },\n \"migrations\": [\n {\n \"tag\": \"v1\",\n \"new_sqlite_classes\": [\"DurableThread\"]\n },\n {\n \"tag\": \"v2\",\n \"new_sqlite_classes\": [\"DurableAgentBuilder\"]\n }\n ]\n}\n`;\n\n// Templates for Durable Object files\nconst THREAD_TS = `import { DurableThread } from 'virtual:@standardagents/builder'\n\nexport default class Thread extends DurableThread {}\n`;\n\nconst AGENT_BUILDER_TS = `import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n\nexport default class AgentBuilder extends DurableAgentBuilder {}\n`;\n\n// Worker entry point template\nconst WORKER_INDEX = `import { router } from \"virtual:@standardagents/builder\"\nimport DurableThread from '../agents/Thread';\nimport DurableAgentBuilder from '../agents/AgentBuilder';\n\nexport default {\n async fetch(request, env) {\n const res = await router(request, env)\n return res ?? new Response(null, { status: 404 })\n },\n} satisfies ExportedHandler<Env>\n\nexport { DurableThread, DurableAgentBuilder }\n`;\n\n// Utility functions\nfunction getProjectName(cwd: string): string {\n const packageJsonPath = path.join(cwd, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.name) {\n return pkg.name.replace(/^@[^/]+\\//, ''); // Remove scope if present\n }\n } catch {\n // Ignore parse errors\n }\n }\n return path.basename(cwd);\n}\n\nfunction findViteConfig(cwd: string): string | null {\n const candidates = ['vite.config.ts', 'vite.config.js', 'vite.config.mts', 'vite.config.mjs'];\n for (const candidate of candidates) {\n const configPath = path.join(cwd, candidate);\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\nfunction findWranglerConfig(cwd: string): string | null {\n const candidates = ['wrangler.jsonc', 'wrangler.json'];\n for (const candidate of candidates) {\n const configPath = path.join(cwd, candidate);\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\nasync function modifyViteConfig(configPath: string, force: boolean): Promise<boolean> {\n try {\n const mod = await loadFile(configPath);\n\n // Check if plugins already include our plugins\n const code = fs.readFileSync(configPath, 'utf-8');\n const hasCloudflare = code.includes('@cloudflare/vite-plugin') || code.includes('cloudflare()');\n const hasAgentBuilder = code.includes('@standardagents/builder') || code.includes('agentbuilder()');\n\n if (hasCloudflare && hasAgentBuilder && !force) {\n logger.info('Vite config already includes Standard Agents plugins');\n return true;\n }\n\n // Add cloudflare plugin if not present\n if (!hasCloudflare || force) {\n addVitePlugin(mod, {\n from: '@cloudflare/vite-plugin',\n imported: 'cloudflare',\n constructor: 'cloudflare',\n });\n logger.success('Added cloudflare plugin to vite.config');\n }\n\n // Add agentbuilder plugin if not present\n if (!hasAgentBuilder || force) {\n addVitePlugin(mod, {\n from: '@standardagents/builder',\n imported: 'agentbuilder',\n constructor: 'agentbuilder',\n options: { mountPoint: '/' },\n });\n logger.success('Added agentbuilder plugin to vite.config');\n }\n\n await writeFile(mod, configPath);\n return true;\n } catch (error) {\n logger.warning(`Could not automatically modify vite.config: ${error}`);\n logger.log('');\n logger.log('Please manually add the following to your vite.config.ts:');\n logger.log('');\n logger.log(` import { cloudflare } from '@cloudflare/vite-plugin'`);\n logger.log(` import { agentbuilder } from '@standardagents/builder'`);\n logger.log('');\n logger.log(` plugins: [cloudflare(), agentbuilder({ mountPoint: '/' })]`);\n logger.log('');\n return false;\n }\n}\n\nfunction createOrUpdateWranglerConfig(cwd: string, projectName: string, force: boolean): boolean {\n const existingConfig = findWranglerConfig(cwd);\n\n if (existingConfig && !force) {\n // Update existing config\n try {\n const text = fs.readFileSync(existingConfig, 'utf-8');\n const config = parse(text);\n\n // Check if already configured\n const hasBindings = config.durable_objects?.bindings?.some(\n (b: any) => b.name === 'AGENT_BUILDER_THREAD' || b.name === 'AGENT_BUILDER'\n );\n\n if (hasBindings) {\n logger.info('wrangler.jsonc already configured for Standard Agents');\n return true;\n }\n\n // Add bindings to existing config\n let result = text;\n\n // Add durable_objects if not present\n if (!config.durable_objects) {\n const edits = modify(result, ['durable_objects'], {\n bindings: [\n { name: 'AGENT_BUILDER_THREAD', class_name: 'DurableThread' },\n { name: 'AGENT_BUILDER', class_name: 'DurableAgentBuilder' }\n ]\n }, {});\n result = applyEdits(result, edits);\n } else {\n // Add to existing bindings\n const bindings = config.durable_objects.bindings || [];\n bindings.push(\n { name: 'AGENT_BUILDER_THREAD', class_name: 'DurableThread' },\n { name: 'AGENT_BUILDER', class_name: 'DurableAgentBuilder' }\n );\n const edits = modify(result, ['durable_objects', 'bindings'], bindings, {});\n result = applyEdits(result, edits);\n }\n\n // Add migrations if not present\n if (!config.migrations) {\n const edits = modify(result, ['migrations'], [\n { tag: 'v1', new_sqlite_classes: ['DurableThread'] },\n { tag: 'v2', new_sqlite_classes: ['DurableAgentBuilder'] }\n ], {});\n result = applyEdits(result, edits);\n }\n\n // Update main entry point if needed\n if (!config.main || !config.main.includes('worker')) {\n const edits = modify(result, ['main'], 'worker/index.ts', {});\n result = applyEdits(result, edits);\n }\n\n // Add assets configuration if not present\n if (!config.assets) {\n const edits = modify(result, ['assets'], {\n directory: 'dist',\n not_found_handling: 'single-page-application',\n binding: 'ASSETS',\n run_worker_first: ['/**']\n }, {});\n result = applyEdits(result, edits);\n }\n\n fs.writeFileSync(existingConfig, result, 'utf-8');\n logger.success('Updated wrangler.jsonc with Standard Agents configuration');\n return true;\n } catch (error) {\n logger.warning(`Could not update wrangler config: ${error}`);\n return false;\n }\n }\n\n // Create new wrangler.jsonc\n const wranglerPath = path.join(cwd, 'wrangler.jsonc');\n const sanitizedName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n fs.writeFileSync(wranglerPath, WRANGLER_TEMPLATE(sanitizedName), 'utf-8');\n logger.success('Created wrangler.jsonc');\n return true;\n}\n\nfunction getWorkerEntryPoint(cwd: string): string {\n // Check wrangler config for main entry\n const wranglerConfig = findWranglerConfig(cwd);\n if (wranglerConfig) {\n try {\n const text = fs.readFileSync(wranglerConfig, 'utf-8');\n const config = parse(text);\n if (config.main) {\n return path.join(cwd, config.main);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Default to worker/index.ts\n return path.join(cwd, 'worker', 'index.ts');\n}\n\nasync function createOrUpdateWorkerEntry(cwd: string, force: boolean): Promise<boolean> {\n const entryPath = getWorkerEntryPoint(cwd);\n const entryDir = path.dirname(entryPath);\n\n // Create worker directory if needed\n if (!fs.existsSync(entryDir)) {\n fs.mkdirSync(entryDir, { recursive: true });\n logger.success(`Created ${path.relative(cwd, entryDir)} directory`);\n }\n\n // If file doesn't exist, create it\n if (!fs.existsSync(entryPath)) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Created ${path.relative(cwd, entryPath)}`);\n return true;\n }\n\n // File exists - try to modify it\n const content = fs.readFileSync(entryPath, 'utf-8');\n\n // Check if already configured\n const hasRouter = content.includes('virtual:@standardagents/builder') && content.includes('router');\n const hasDurableExports = content.includes('DurableThread') && content.includes('DurableAgentBuilder');\n\n if (hasRouter && hasDurableExports && !force) {\n logger.info(`${path.relative(cwd, entryPath)} already configured`);\n return true;\n }\n\n try {\n const mod = await loadFile(entryPath);\n\n // Add imports\n if (!content.includes('virtual:@standardagents/builder') || force) {\n mod.imports.$add({\n from: 'virtual:@standardagents/builder',\n imported: 'router',\n local: 'router',\n });\n }\n\n if (!content.includes(\"'../agents/Thread'\") || force) {\n mod.imports.$add({\n from: '../agents/Thread',\n imported: 'default',\n local: 'DurableThread',\n });\n }\n\n if (!content.includes(\"'../agents/AgentBuilder'\") || force) {\n mod.imports.$add({\n from: '../agents/AgentBuilder',\n imported: 'default',\n local: 'DurableAgentBuilder',\n });\n }\n\n // Check if there's a default export with fetch\n const { code } = generateCode(mod);\n\n // If we can't easily add the router, just overwrite\n if (force || !hasRouter) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Updated ${path.relative(cwd, entryPath)} with Standard Agents router`);\n }\n\n return true;\n } catch (error) {\n // Fall back to template\n if (force) {\n fs.writeFileSync(entryPath, WORKER_INDEX, 'utf-8');\n logger.success(`Created ${path.relative(cwd, entryPath)}`);\n return true;\n }\n\n logger.warning(`Could not automatically modify ${path.relative(cwd, entryPath)}`);\n logger.log('');\n logger.log('Please ensure your worker entry point includes:');\n logger.log('');\n logger.log(` import { router } from \"virtual:@standardagents/builder\"`);\n logger.log(` import DurableThread from '../agents/Thread';`);\n logger.log(` import DurableAgentBuilder from '../agents/AgentBuilder';`);\n logger.log('');\n logger.log(' // In your fetch handler:');\n logger.log(' const res = router(request, env)');\n logger.log(' if (res) return res');\n logger.log('');\n logger.log(' // Export Durable Objects:');\n logger.log(' export { DurableThread, DurableAgentBuilder }');\n logger.log('');\n return false;\n }\n}\n\nfunction createDurableObjects(cwd: string): void {\n const agentsDir = path.join(cwd, 'agents');\n\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n // Create Thread.ts\n const threadPath = path.join(agentsDir, 'Thread.ts');\n if (!fs.existsSync(threadPath)) {\n fs.writeFileSync(threadPath, THREAD_TS, 'utf-8');\n logger.success('Created agents/Thread.ts');\n } else {\n logger.info('agents/Thread.ts already exists');\n }\n\n // Create AgentBuilder.ts\n const agentBuilderPath = path.join(agentsDir, 'AgentBuilder.ts');\n if (!fs.existsSync(agentBuilderPath)) {\n fs.writeFileSync(agentBuilderPath, AGENT_BUILDER_TS, 'utf-8');\n logger.success('Created agents/AgentBuilder.ts');\n } else {\n logger.info('agents/AgentBuilder.ts already exists');\n }\n}\n\nfunction createDirectoriesAndDocs(cwd: string): void {\n const agentsDir = path.join(cwd, 'agents');\n\n // Create project root CLAUDE.md (for AI assistants to understand the project)\n const rootDocPath = path.join(cwd, 'CLAUDE.md');\n if (!fs.existsSync(rootDocPath)) {\n fs.writeFileSync(rootDocPath, ROOT_CLAUDE_MD, 'utf-8');\n logger.success('Created CLAUDE.md');\n }\n\n // Create subdirectories with their CLAUDE.md files\n const directories = [\n { path: 'agents/agents', doc: AGENTS_CLAUDE_MD },\n { path: 'agents/prompts', doc: PROMPTS_CLAUDE_MD },\n { path: 'agents/models', doc: MODELS_CLAUDE_MD },\n { path: 'agents/tools', doc: TOOLS_CLAUDE_MD },\n { path: 'agents/hooks', doc: HOOKS_CLAUDE_MD },\n { path: 'agents/api', doc: API_CLAUDE_MD },\n ];\n\n for (const dir of directories) {\n const dirPath = path.join(cwd, dir.path);\n const docPath = path.join(dirPath, 'CLAUDE.md');\n\n // Create directory\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logger.success(`Created ${dir.path}`);\n }\n\n // Create CLAUDE.md\n if (!fs.existsSync(docPath)) {\n fs.writeFileSync(docPath, dir.doc, 'utf-8');\n logger.success(`Created ${dir.path}/CLAUDE.md`);\n }\n }\n}\n\nfunction updateTsConfig(cwd: string): void {\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n\n if (!fs.existsSync(tsconfigPath)) {\n logger.info('No tsconfig.json found, skipping TypeScript configuration');\n return;\n }\n\n try {\n const text = fs.readFileSync(tsconfigPath, 'utf-8');\n const config = parse(text);\n let result = text;\n\n // Add types to compilerOptions\n const types = config.compilerOptions?.types || [];\n const newTypes = [\n './worker-configuration.d.ts',\n './.agents/types.d.ts',\n './.agents/virtual-module.d.ts'\n ].filter(t => !types.includes(t));\n\n if (newTypes.length > 0) {\n const allTypes = [...types, ...newTypes];\n const edits = modify(result, ['compilerOptions', 'types'], allTypes, {});\n result = applyEdits(result, edits);\n }\n\n // Add worker and agents to include\n const include = config.include || [];\n const newIncludes = ['worker', 'agents'].filter(i => !include.includes(i));\n\n if (newIncludes.length > 0) {\n const allIncludes = [...include, ...newIncludes];\n const edits = modify(result, ['include'], allIncludes, {});\n result = applyEdits(result, edits);\n }\n\n if (newTypes.length > 0 || newIncludes.length > 0) {\n fs.writeFileSync(tsconfigPath, result, 'utf-8');\n logger.success('Updated tsconfig.json with Standard Agents types');\n } else {\n logger.info('tsconfig.json already configured');\n }\n } catch (error) {\n logger.warning('Could not update tsconfig.json, you may need to add types manually');\n }\n}\n\nfunction cleanupViteDefaults(cwd: string): void {\n // Remove default Vite files that we don't need\n const filesToRemove = [\n 'src/main.ts',\n 'src/style.css',\n 'src/counter.ts',\n 'src/typescript.svg',\n 'src/vite-env.d.ts',\n 'index.html',\n 'public/vite.svg',\n ];\n\n const dirsToRemove = ['src', 'public'];\n\n for (const file of filesToRemove) {\n const filePath = path.join(cwd, file);\n if (fs.existsSync(filePath)) {\n try {\n fs.unlinkSync(filePath);\n } catch {\n // Ignore errors\n }\n }\n }\n\n // Remove empty directories\n for (const dir of dirsToRemove) {\n const dirPath = path.join(cwd, dir);\n if (fs.existsSync(dirPath)) {\n try {\n const files = fs.readdirSync(dirPath);\n if (files.length === 0) {\n fs.rmdirSync(dirPath);\n }\n } catch {\n // Ignore errors\n }\n }\n }\n}\n\nexport async function scaffold(options: ScaffoldOptions = {}) {\n const cwd = process.cwd();\n const projectName = getProjectName(cwd);\n const force = options.force || false;\n\n logger.info('Scaffolding Standard Agents...');\n logger.log('');\n\n // 1. Find and modify vite.config\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n await modifyViteConfig(viteConfigPath, force);\n } else {\n logger.warning('No vite.config found. Please create one with cloudflare and agentbuilder plugins.');\n }\n\n // 2. Create or update wrangler.jsonc\n createOrUpdateWranglerConfig(cwd, projectName, force);\n\n // 3. Create or update worker entry point\n await createOrUpdateWorkerEntry(cwd, force);\n\n // 4. Create Durable Object files\n createDurableObjects(cwd);\n\n // 5. Create agent directories with documentation\n createDirectoriesAndDocs(cwd);\n\n // 6. Update tsconfig.json\n updateTsConfig(cwd);\n\n // 7. Clean up default Vite files (only if force is true, meaning fresh project)\n if (force) {\n cleanupViteDefaults(cwd);\n }\n\n logger.log('');\n logger.success('Standard Agents scaffolding complete!');\n logger.log('');\n logger.log('Your project structure:');\n logger.log('');\n logger.log(' CLAUDE.md # Architecture documentation');\n logger.log(' agents/');\n logger.log(' ├── Thread.ts # Durable Object for threads');\n logger.log(' ├── AgentBuilder.ts # Durable Object for agent state');\n logger.log(' ├── agents/ # Agent definitions');\n logger.log(' ├── prompts/ # Prompt definitions');\n logger.log(' ├── models/ # Model configurations');\n logger.log(' ├── tools/ # Custom tools');\n logger.log(' ├── hooks/ # Lifecycle hooks');\n logger.log(' └── api/ # Thread API endpoints');\n logger.log(' worker/');\n logger.log(' └── index.ts # Cloudflare Worker entry point');\n logger.log('');\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport crypto from 'node:crypto';\nimport readline from 'node:readline';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../utils/logger.js';\nimport { scaffold } from './scaffold.js';\n\ninterface InitOptions {\n yes?: boolean;\n template?: string;\n}\n\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptPassword(question: string): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(question);\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let password = '';\n\n const onData = (char: string) => {\n const c = char.toString();\n\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u0004': // Ctrl+D\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\n');\n resolve(password);\n break;\n case '\\u0003': // Ctrl+C\n stdout.write('\\n');\n process.exit(1);\n break;\n case '\\u007F': // Backspace\n case '\\b':\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.clearLine(0);\n stdout.cursorTo(0);\n stdout.write(question + '*'.repeat(password.length));\n }\n break;\n default:\n password += c;\n stdout.write('*');\n break;\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Use shell: false to properly handle arguments with spaces\n // Node's spawn will handle argument escaping automatically\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: false,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', reject);\n });\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens\n .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n}\n\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check environment variable first (most reliable when running via npx/pnpm exec)\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n }\n\n // Check for lockfiles\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm';\n if (fs.existsSync('yarn.lock')) return 'yarn';\n if (fs.existsSync('bun.lockb')) return 'bun';\n if (fs.existsSync('package-lock.json')) return 'npm';\n\n return 'npm';\n}\n\n/**\n * Get the @standardagents/builder version to use based on the CLI's version.\n * If CLI is running a prerelease (e.g., 0.11.0-next.1), use that tag.\n * Otherwise, use the exact CLI version.\n */\nfunction getBuilderPackageVersion(): string {\n try {\n // Read CLI's own package.json\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.resolve(__dirname, '../../package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const version = pkg.version as string;\n\n // Check for prerelease tags (e.g., 0.11.0-next.1, 0.11.0-beta.2)\n const prereleaseMatch = version.match(/-([a-z]+)\\./i);\n if (prereleaseMatch) {\n // Use the tag name (next, beta, alpha, etc.)\n return `@${prereleaseMatch[1]}`;\n }\n\n // For stable releases, use caret version\n return `@^${version}`;\n } catch {\n // Fallback to latest if we can't determine version\n return '';\n }\n}\n\nasync function selectPackageManager(detected: 'npm' | 'pnpm' | 'yarn' | 'bun'): Promise<'npm' | 'pnpm' | 'yarn' | 'bun'> {\n const options = ['npm', 'pnpm', 'yarn', 'bun'] as const;\n const detectedIndex = options.indexOf(detected);\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = detectedIndex;\n\n const renderOptions = () => {\n // Move cursor up to overwrite previous render (except first time)\n stdout.write('\\x1B[?25l'); // Hide cursor\n\n // Clear and redraw\n stdout.write(`\\x1B[${options.length + 1}A`); // Move up\n stdout.write('\\x1B[0J'); // Clear from cursor to end\n\n stdout.write('Select a package manager (use arrows, enter to confirm):\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n };\n\n // Initial render\n stdout.write('Select a package manager (use arrows, enter to confirm):\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h'); // Show cursor\n };\n\n const onData = (key: string) => {\n // Handle arrow keys (escape sequences)\n if (key === '\\x1B[A' || key === 'k') { // Up arrow or k\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') { // Down arrow or j\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') { // Enter\n cleanup();\n resolve(options[selectedIndex]);\n } else if (key === '\\x03') { // Ctrl+C\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nexport async function init(projectNameArg?: string, options: InitOptions = {}) {\n const cwd = process.cwd();\n const detectedPm = detectPackageManager();\n const template = options.template || 'vanilla-ts';\n\n logger.log('');\n logger.info('Creating a new Standard Agents project...');\n logger.log('');\n\n // Select package manager\n let pm: 'npm' | 'pnpm' | 'yarn' | 'bun';\n if (options.yes) {\n pm = detectedPm;\n } else {\n pm = await selectPackageManager(detectedPm);\n logger.log('');\n }\n\n // Get project name\n let projectName = projectNameArg;\n\n if (!projectName && !options.yes) {\n projectName = await prompt('Project name: ');\n }\n\n if (!projectName) {\n logger.error('Project name is required');\n process.exit(1);\n }\n\n const projectPath = path.join(cwd, projectName);\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n logger.error(`Directory \"${projectName}\" already exists`);\n process.exit(1);\n }\n\n // Step 1: Run create vite\n logger.log('');\n logger.info(`Step 1: Creating Vite project with ${template} template...`);\n logger.log('');\n\n try {\n // Determine the correct create command based on package manager\n // All package managers should use create-vite@latest to ensure the latest version\n // Use --no-interactive to skip prompts (like \"Install with npm and start now?\")\n let createCmd: string;\n let createArgs: string[];\n\n switch (pm) {\n case 'pnpm':\n createCmd = 'pnpm';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n case 'yarn':\n createCmd = 'yarn';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n case 'bun':\n createCmd = 'bun';\n createArgs = ['create', 'vite@latest', projectName, '--template', template, '--no-interactive'];\n break;\n default:\n createCmd = 'npm';\n createArgs = ['create', 'vite@latest', projectName, '--', '--template', template, '--no-interactive'];\n }\n\n await runCommand(createCmd, createArgs, cwd);\n } catch (error) {\n logger.error('Failed to create Vite project');\n process.exit(1);\n }\n\n // Create vite.config.ts if it doesn't exist (some templates may not include one)\n const viteConfigPath = path.join(projectPath, 'vite.config.ts');\n if (!fs.existsSync(viteConfigPath)) {\n const viteConfigContent = `import { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [],\n})\n`;\n fs.writeFileSync(viteConfigPath, viteConfigContent, 'utf-8');\n logger.success('Created vite.config.ts');\n }\n\n // Update package.json name to kebab-case (handles spaces and special characters)\n const packageJsonPath = path.join(projectPath, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const kebabName = toKebabCase(projectName);\n if (packageJson.name !== kebabName) {\n packageJson.name = kebabName;\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n }\n\n // Step 2: Install Standard Agents dependencies\n logger.log('');\n logger.info('Step 2: Installing Standard Agents dependencies...');\n logger.log('');\n\n try {\n const installCmd = pm === 'npm' ? 'install' : 'add';\n const devFlag = pm === 'npm' ? '--save-dev' : '-D';\n const builderVersion = getBuilderPackageVersion();\n\n await runCommand(pm, [\n installCmd, devFlag,\n '@cloudflare/vite-plugin',\n `@standardagents/builder${builderVersion}`,\n 'wrangler',\n 'zod'\n ], projectPath);\n } catch (error) {\n logger.error('Failed to install dependencies');\n process.exit(1);\n }\n\n // Step 3: Run scaffold in the new project directory\n logger.log('');\n logger.info('Step 3: Configuring Standard Agents...');\n logger.log('');\n\n // Change to project directory for scaffold\n process.chdir(projectPath);\n\n await scaffold({ force: true });\n\n // Step 4: Configure environment variables\n logger.log('');\n logger.info('Step 4: Configuring environment variables...');\n logger.log('');\n\n // Generate encryption key\n const encryptionKey = crypto.randomBytes(32).toString('hex');\n\n // Ask for API keys and admin password\n let openrouterKey = '';\n let openaiKey = '';\n let adminPassword = '';\n\n if (!options.yes) {\n logger.log('API keys are optional but required to use AI models.');\n logger.log('You can add them later by editing .dev.vars');\n logger.log('');\n\n openrouterKey = await prompt('OpenRouter API key (optional, press Enter to skip): ');\n openaiKey = await prompt('OpenAI API key (optional, press Enter to skip): ');\n\n logger.log('');\n logger.log('Set a temporary admin password for development access.');\n logger.log('Press Enter to use the default password \"admin\".');\n logger.log('');\n\n while (true) {\n adminPassword = await promptPassword('Temporary admin password: ');\n\n if (!adminPassword) {\n adminPassword = 'admin';\n break;\n }\n\n const confirmPassword = await promptPassword('Confirm password: ');\n\n if (adminPassword === confirmPassword) {\n break;\n } else {\n logger.warning('Passwords do not match. Please try again.');\n logger.log('');\n adminPassword = '';\n }\n }\n }\n\n // Default admin password if not provided (for --yes flag)\n if (!adminPassword) {\n adminPassword = 'admin';\n }\n\n // Create .dev.vars file\n const devVarsLines: string[] = [\n '# Standard Agents Environment Variables',\n '# This file contains secrets for local development only',\n '# Do not commit this file to version control',\n '',\n '# Encryption key for secure data (auto-generated)',\n `ENCRYPTION_KEY=${encryptionKey}`,\n '',\n '# Temporary admin password for development access',\n `SUPER_ADMIN_PASSWORD=${adminPassword}`,\n '',\n '# AI Provider API Keys',\n '# Uncomment and add your keys as needed',\n ];\n\n if (openrouterKey) {\n devVarsLines.push(`OPENROUTER_API_KEY=${openrouterKey}`);\n } else {\n devVarsLines.push('# OPENROUTER_API_KEY=your-openrouter-key');\n }\n\n if (openaiKey) {\n devVarsLines.push(`OPENAI_API_KEY=${openaiKey}`);\n } else {\n devVarsLines.push('# OPENAI_API_KEY=your-openai-key');\n }\n\n devVarsLines.push('');\n\n const devVarsPath = path.join(projectPath, '.dev.vars');\n fs.writeFileSync(devVarsPath, devVarsLines.join('\\n'), 'utf-8');\n logger.success('Created .dev.vars with encryption key');\n\n // Add .dev.vars to .gitignore if it exists\n const gitignorePath = path.join(projectPath, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');\n if (!gitignoreContent.includes('.dev.vars')) {\n fs.appendFileSync(gitignorePath, '\\n# Local environment variables\\n.dev.vars\\n');\n logger.success('Added .dev.vars to .gitignore');\n }\n }\n\n // Step 5: Generate Cloudflare types\n logger.log('');\n logger.info('Step 5: Generating Cloudflare types...');\n logger.log('');\n\n try {\n await runCommand('npx', ['wrangler', 'types'], projectPath);\n } catch (error) {\n logger.warning('Could not generate types automatically. Run \"npx wrangler types\" manually.');\n }\n\n // Done!\n logger.log('');\n logger.success('Project created successfully!');\n logger.log('');\n logger.log('Next steps:');\n logger.log('');\n logger.log(` cd ${projectName}`);\n logger.log(` ${pm === 'npm' ? 'npm run' : pm} dev`);\n logger.log('');\n logger.log('For more information, visit: https://standardagents.ai/docs');\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport readline from 'node:readline';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../utils/logger.js';\n\ninterface InitChatOptions {\n yes?: boolean;\n framework?: 'vite' | 'nextjs';\n}\n\ntype Framework = 'vite' | 'nextjs';\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\n/**\n * Get the @standardagents/react version to use based on the CLI's version.\n * If CLI is running a prerelease (e.g., 0.11.0-next.1), use that tag.\n * Otherwise, use the exact CLI version.\n */\nfunction getReactPackageVersion(): string {\n try {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js -> ../package.json\n const pkgPath = path.resolve(__dirname, '../package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const version = pkg.version as string;\n\n const prereleaseMatch = version.match(/-([a-z]+)\\./i);\n if (prereleaseMatch) {\n return prereleaseMatch[1];\n }\n\n return `^${version}`;\n } catch {\n return 'latest';\n }\n}\n\n/**\n * Get the path to the chat source directory bundled with the CLI\n */\nfunction getChatSourceDir(): string {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js -> ../chat\n return path.resolve(__dirname, '../chat');\n}\n\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptPassword(question: string): Promise<string> {\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(question);\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let password = '';\n\n const redraw = () => {\n stdout.clearLine(0);\n stdout.cursorTo(0);\n stdout.write(question + '*'.repeat(password.length));\n };\n\n const onData = (data: string) => {\n const str = data.toString();\n\n for (let i = 0; i < str.length; i++) {\n const c = str[i];\n\n if (c === '\\x1B') {\n if (str[i + 1] === '[') {\n i += 2;\n continue;\n }\n continue;\n }\n\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u0004':\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\n');\n resolve(password);\n return;\n case '\\u0003':\n stdout.write('\\n');\n process.exit(1);\n break;\n case '\\u007F':\n case '\\b':\n if (password.length > 0) {\n password = password.slice(0, -1);\n redraw();\n }\n break;\n default:\n if (c.charCodeAt(0) >= 32) {\n password += c;\n stdout.write('*');\n }\n break;\n }\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: false,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', reject);\n });\n}\n\nfunction detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n }\n\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm';\n if (fs.existsSync('yarn.lock')) return 'yarn';\n if (fs.existsSync('bun.lockb')) return 'bun';\n if (fs.existsSync('package-lock.json')) return 'npm';\n\n return 'npm';\n}\n\nasync function selectPackageManager(detected: PackageManager): Promise<PackageManager> {\n const options: PackageManager[] = ['npm', 'pnpm', 'yarn', 'bun'];\n const detectedIndex = options.indexOf(detected);\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = detectedIndex;\n\n const renderOptions = () => {\n stdout.write('\\x1B[?25l');\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[0J');\n\n stdout.write('Select a package manager:\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n };\n\n stdout.write('Select a package manager:\\n');\n options.forEach((opt, i) => {\n const marker = i === detectedIndex ? ' (detected)' : '';\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt}${marker}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h');\n };\n\n const onData = (key: string) => {\n if (key === '\\x1B[A' || key === 'k') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') {\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') {\n cleanup();\n resolve(options[selectedIndex]);\n } else if (key === '\\x03') {\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nasync function selectFramework(): Promise<Framework> {\n const options: { value: Framework; label: string }[] = [\n { value: 'vite', label: 'Vite (React + TypeScript)' },\n { value: 'nextjs', label: 'Next.js (App Router)' },\n ];\n\n return new Promise((resolve) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n let selectedIndex = 0;\n\n const renderOptions = () => {\n stdout.write('\\x1B[?25l');\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[0J');\n\n stdout.write('Select a framework:\\n');\n options.forEach((opt, i) => {\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt.label}\\x1B[0m\\n`);\n });\n };\n\n stdout.write('Select a framework:\\n');\n options.forEach((opt, i) => {\n const prefix = i === selectedIndex ? '\\x1B[36m❯\\x1B[0m' : ' ';\n const highlight = i === selectedIndex ? '\\x1B[36m' : '\\x1B[90m';\n stdout.write(`${prefix} ${highlight}${opt.label}\\x1B[0m\\n`);\n });\n\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = () => {\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n stdout.write('\\x1B[?25h');\n };\n\n const onData = (key: string) => {\n if (key === '\\x1B[A' || key === 'k') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n renderOptions();\n } else if (key === '\\x1B[B' || key === 'j') {\n selectedIndex = (selectedIndex + 1) % options.length;\n renderOptions();\n } else if (key === '\\r' || key === '\\n') {\n cleanup();\n resolve(options[selectedIndex].value);\n } else if (key === '\\x03') {\n cleanup();\n stdout.write('\\n');\n process.exit(1);\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isPortOpen(port: number): Promise<boolean> {\n const tryConnect = (host: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(200);\n\n socket.on('connect', () => {\n socket.destroy();\n resolve(true);\n });\n\n socket.on('timeout', () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on('error', () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.connect(port, host);\n });\n };\n\n if (await tryConnect('127.0.0.1')) return true;\n if (await tryConnect('::1')) return true;\n return false;\n}\n\nasync function isAgentbuilderInstance(url: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n\n const response = await fetch(`${url}/api/agents`, {\n signal: controller.signal,\n headers: { 'Accept': 'application/json' },\n });\n\n clearTimeout(timeout);\n\n if (response.status === 401) {\n return true;\n }\n\n if (response.ok) {\n const data = await response.json();\n return Array.isArray(data.agents);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function detectAgentbuilderInstance(): Promise<string | null> {\n const portsToScan = [\n 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180,\n 3000, 3001, 3002, 3003,\n 8080, 8000, 4000,\n ];\n\n logger.log('\\x1B[90mScanning for running agentbuilder instance...\\x1B[0m');\n\n const openPorts: number[] = [];\n\n await Promise.all(\n portsToScan.map(async (port) => {\n if (await isPortOpen(port)) {\n openPorts.push(port);\n }\n })\n );\n\n for (const port of openPorts.sort((a, b) => a - b)) {\n const url = `http://localhost:${port}`;\n if (await isAgentbuilderInstance(url)) {\n return url;\n }\n }\n\n return null;\n}\n\n/**\n * Copy a directory recursively, skipping certain files/folders\n */\nfunction copyDir(src: string, dest: string, skip: string[] = []) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n if (skip.includes(entry.name)) continue;\n\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath, skip);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n\n/**\n * Update package.json with correct SDK version and project name\n */\nfunction updatePackageJson(filePath: string, projectName: string, reactVersion: string) {\n const pkg = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n\n // Update name\n pkg.name = projectName;\n\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n\n // Remove private flag for user projects\n delete pkg.private;\n\n // Remove workspace-specific scripts\n delete pkg.scripts?.['dev:next'];\n delete pkg.scripts?.['build:next'];\n\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Update package.json for Next.js project\n */\nfunction updateNextPackageJson(filePath: string, projectName: string, reactVersion: string) {\n const pkg = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n\n // Update name\n pkg.name = projectName;\n\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n\n // Remove private flag for user projects\n delete pkg.private;\n\n // Update scripts for Next.js only\n pkg.scripts = {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n };\n\n // Remove vite-specific deps\n delete pkg.devDependencies?.['@tailwindcss/vite'];\n delete pkg.devDependencies?.['@vitejs/plugin-react'];\n delete pkg.devDependencies?.['vite'];\n\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\nexport async function initChat(projectNameArg?: string, options: InitChatOptions = {}) {\n const cwd = process.cwd();\n const chatSourceDir = getChatSourceDir();\n\n // Check if chat source exists\n if (!fs.existsSync(chatSourceDir)) {\n logger.error('Chat source files not found. This CLI installation may be corrupted.');\n process.exit(1);\n }\n\n logger.log('');\n logger.info('Scaffolding a frontend chat application...');\n logger.log('');\n\n // Get project name\n let projectName = projectNameArg;\n\n if (!projectName && !options.yes) {\n projectName = await prompt('Project name: ');\n }\n\n if (!projectName) {\n logger.error('Project name is required');\n process.exit(1);\n }\n\n const projectPath = path.join(cwd, projectName);\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n logger.error(`Directory \"${projectName}\" already exists`);\n process.exit(1);\n }\n\n // Step 1: Select framework\n let framework: Framework;\n if (options.framework) {\n framework = options.framework;\n } else if (options.yes) {\n framework = 'vite';\n } else {\n framework = await selectFramework();\n logger.log('');\n }\n\n // Step 2: Get Agentbuilder URL\n let serverUrl: string;\n if (options.yes) {\n serverUrl = 'http://localhost:5173';\n } else {\n const detectedUrl = await detectAgentbuilderInstance();\n\n if (detectedUrl) {\n logger.success(`Found agentbuilder at ${detectedUrl}`);\n const urlInput = await prompt(`Agentbuilder dev server URL [${detectedUrl}]: `);\n serverUrl = urlInput || detectedUrl;\n } else {\n logger.log('\\x1B[90mNo running agentbuilder instance found\\x1B[0m');\n const urlInput = await prompt('Agentbuilder dev server URL [http://localhost:5173]: ');\n serverUrl = urlInput || 'http://localhost:5173';\n }\n\n if (!isValidUrl(serverUrl)) {\n logger.error('Invalid URL format');\n process.exit(1);\n }\n }\n\n // Select package manager\n const detectedPm = detectPackageManager();\n let pm: PackageManager;\n if (options.yes) {\n pm = detectedPm;\n } else {\n pm = await selectPackageManager(detectedPm);\n logger.log('');\n }\n\n logger.log('');\n logger.info(`Creating ${framework === 'vite' ? 'Vite' : 'Next.js'} project...`);\n logger.log('');\n\n // Create project directory\n fs.mkdirSync(projectPath, { recursive: true });\n\n // Get React package version\n const reactVersion = getReactPackageVersion();\n\n // Copy source files based on framework\n if (framework === 'vite') {\n await scaffoldVite(projectPath, chatSourceDir, projectName, serverUrl, reactVersion);\n } else {\n await scaffoldNextjs(projectPath, chatSourceDir, projectName, serverUrl, reactVersion);\n }\n\n // Install dependencies\n logger.log('');\n logger.info('Installing dependencies...');\n logger.log('');\n\n try {\n await runCommand(pm, pm === 'npm' ? ['install'] : ['install'], projectPath);\n } catch (error) {\n logger.error('Failed to install dependencies');\n process.exit(1);\n }\n\n // Success message\n logger.log('');\n logger.success('Chat UI scaffolded successfully!');\n logger.log('');\n\n // Start dev server\n logger.info('Starting development server...');\n logger.log('');\n\n const devArgs = pm === 'npm' ? ['run', 'dev'] : ['dev'];\n const devProcess = spawn(pm, devArgs, {\n cwd: projectPath,\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: false,\n });\n\n let browserOpened = false;\n const openBrowser = (url: string) => {\n if (browserOpened) return;\n browserOpened = true;\n const openCmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n spawn(openCmd, [url], { stdio: 'ignore', detached: true }).unref();\n };\n\n devProcess.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stdout.write(data);\n\n const urlMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+\\/?)/);\n if (urlMatch && !browserOpened) {\n openBrowser(urlMatch[1]);\n }\n });\n\n devProcess.stderr?.on('data', (data: Buffer) => {\n process.stderr.write(data);\n });\n\n devProcess.on('error', (error) => {\n logger.error(`Failed to start dev server: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function scaffoldVite(\n projectPath: string,\n chatSourceDir: string,\n projectName: string,\n serverUrl: string,\n reactVersion: string\n) {\n // Copy shared source files\n copyDir(path.join(chatSourceDir, 'src'), path.join(projectPath, 'src'), []);\n logger.success('Copied src/');\n\n // Copy vite-specific files to root\n const viteDir = path.join(chatSourceDir, 'vite');\n\n // Copy and update index.html to point to src/main.tsx\n let indexHtml = fs.readFileSync(path.join(viteDir, 'index.html'), 'utf-8');\n indexHtml = indexHtml.replace('src=\"/main.tsx\"', 'src=\"/src/main.tsx\"');\n fs.writeFileSync(path.join(projectPath, 'index.html'), indexHtml, 'utf-8');\n logger.success('Created index.html');\n\n fs.copyFileSync(path.join(viteDir, 'main.tsx'), path.join(projectPath, 'src', 'main.tsx'));\n logger.success('Created src/main.tsx');\n\n // Read and adapt vite.config.ts (remove root and adjust paths)\n let viteConfig = fs.readFileSync(path.join(viteDir, 'vite.config.ts'), 'utf-8');\n // Simplify config for standalone project\n viteConfig = `import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport tailwindcss from '@tailwindcss/vite'\n\nexport default defineConfig({\n plugins: [\n react(),\n tailwindcss(),\n ],\n})\n`;\n fs.writeFileSync(path.join(projectPath, 'vite.config.ts'), viteConfig, 'utf-8');\n logger.success('Created vite.config.ts');\n\n // Copy and update tsconfig\n fs.copyFileSync(path.join(chatSourceDir, 'tsconfig.json'), path.join(projectPath, 'tsconfig.json'));\n // Update tsconfig to remove vite-specific include\n const tsconfig = JSON.parse(fs.readFileSync(path.join(projectPath, 'tsconfig.json'), 'utf-8'));\n tsconfig.include = ['src'];\n delete tsconfig.compilerOptions?.paths;\n fs.writeFileSync(path.join(projectPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n', 'utf-8');\n logger.success('Created tsconfig.json');\n\n // Copy and update package.json\n fs.copyFileSync(path.join(chatSourceDir, 'package.json'), path.join(projectPath, 'package.json'));\n // Read, modify, and write package.json\n const pkg = JSON.parse(fs.readFileSync(path.join(projectPath, 'package.json'), 'utf-8'));\n pkg.name = projectName;\n pkg.scripts = {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n };\n delete pkg.private;\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n // Remove next.js deps\n delete pkg.dependencies?.['next'];\n delete pkg.devDependencies?.['@tailwindcss/postcss'];\n delete pkg.devDependencies?.['postcss'];\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.success('Created package.json');\n\n // Create .env\n const envContent = `# Agentbuilder connection\nVITE_AGENTBUILDER_URL=${serverUrl}\n`;\n fs.writeFileSync(path.join(projectPath, '.env'), envContent, 'utf-8');\n logger.success('Created .env');\n\n // Create .gitignore\n fs.writeFileSync(path.join(projectPath, '.gitignore'), `node_modules\ndist\n.env\n`, 'utf-8');\n logger.success('Created .gitignore');\n\n // Update main.tsx paths (it expects ../src/ but now they're in same dir)\n let mainTsx = fs.readFileSync(path.join(projectPath, 'src', 'main.tsx'), 'utf-8');\n mainTsx = mainTsx\n .replace(/from '\\.\\.\\/src\\//g, \"from './\")\n .replace(/import '\\.\\.\\/src\\//g, \"import './\");\n fs.writeFileSync(path.join(projectPath, 'src', 'main.tsx'), mainTsx, 'utf-8');\n\n // Copy favicon\n if (fs.existsSync(path.join(viteDir, 'favicon.svg'))) {\n fs.copyFileSync(path.join(viteDir, 'favicon.svg'), path.join(projectPath, 'favicon.svg'));\n logger.success('Created favicon.svg');\n }\n}\n\nasync function scaffoldNextjs(\n projectPath: string,\n chatSourceDir: string,\n projectName: string,\n serverUrl: string,\n reactVersion: string\n) {\n // Copy shared source files to src/\n copyDir(path.join(chatSourceDir, 'src'), path.join(projectPath, 'src'), []);\n logger.success('Copied src/');\n\n // Copy next-specific files\n const nextDir = path.join(chatSourceDir, 'next');\n\n // Copy app directory\n copyDir(path.join(nextDir, 'app'), path.join(projectPath, 'app'), []);\n logger.success('Copied app/');\n\n // Copy next.config.ts\n fs.copyFileSync(path.join(nextDir, 'next.config.ts'), path.join(projectPath, 'next.config.ts'));\n logger.success('Created next.config.ts');\n\n // Copy postcss.config.mjs\n fs.copyFileSync(path.join(nextDir, 'postcss.config.mjs'), path.join(projectPath, 'postcss.config.mjs'));\n logger.success('Created postcss.config.mjs');\n\n // Create tsconfig.json for Next.js\n const tsconfig = {\n compilerOptions: {\n target: \"ES2017\",\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"esnext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"preserve\",\n incremental: true,\n plugins: [{ name: \"next\" }],\n paths: {\n \"@/*\": [\"./src/*\"]\n }\n },\n include: [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n exclude: [\"node_modules\"]\n };\n fs.writeFileSync(path.join(projectPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n', 'utf-8');\n logger.success('Created tsconfig.json');\n\n // Create package.json for Next.js\n const pkg = JSON.parse(fs.readFileSync(path.join(chatSourceDir, 'package.json'), 'utf-8'));\n pkg.name = projectName;\n pkg.scripts = {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n };\n delete pkg.private;\n // Update @standardagents/react version\n if (pkg.dependencies?.['@standardagents/react']) {\n pkg.dependencies['@standardagents/react'] = reactVersion;\n }\n // Remove vite-specific deps\n delete pkg.devDependencies?.['@tailwindcss/vite'];\n delete pkg.devDependencies?.['@vitejs/plugin-react'];\n delete pkg.devDependencies?.['vite'];\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n logger.success('Created package.json');\n\n // Create .env.local\n const envContent = `# Agentbuilder connection\nNEXT_PUBLIC_AGENTBUILDER_URL=${serverUrl}\n`;\n fs.writeFileSync(path.join(projectPath, '.env.local'), envContent, 'utf-8');\n logger.success('Created .env.local');\n\n // Create .gitignore\n fs.writeFileSync(path.join(projectPath, '.gitignore'), `node_modules\n.next\nout\n.env.local\n`, 'utf-8');\n logger.success('Created .gitignore');\n\n // Update layout.tsx paths\n let layoutTsx = fs.readFileSync(path.join(projectPath, 'app', 'layout.tsx'), 'utf-8');\n layoutTsx = layoutTsx.replace(/from '\\.\\.\\/\\.\\.\\/src\\//g, \"from '../src/\");\n fs.writeFileSync(path.join(projectPath, 'app', 'layout.tsx'), layoutTsx, 'utf-8');\n\n // Update page.tsx paths\n let pageTsx = fs.readFileSync(path.join(projectPath, 'app', 'page.tsx'), 'utf-8');\n pageTsx = pageTsx.replace(/from '\\.\\.\\/\\.\\.\\/src\\//g, \"from '../src/\");\n fs.writeFileSync(path.join(projectPath, 'app', 'page.tsx'), pageTsx, 'utf-8');\n}\n","import { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { dirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\nimport { init } from './commands/init.js';\nimport { scaffold } from './commands/scaffold.js';\nimport { initChat } from './commands/init-chat.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('agents')\n .description('CLI tool for Standard Agents / AgentBuilder')\n .version(pkg.version);\n\nprogram\n .command('init [project-name]')\n .description('Create a new Standard Agents project (runs create vite, then scaffold)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--template <template>', 'Vite template to use', 'vanilla-ts')\n .action(init);\n\nprogram\n .command('scaffold')\n .description('Add Standard Agents to an existing Vite project')\n .option('--force', 'Overwrite existing configuration')\n .action(scaffold);\n\nprogram\n .command('init-chat [project-name]')\n .description('Scaffold a frontend chat application')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--framework <framework>', 'Framework to use (vite or nextjs)')\n .action(initChat);\n\nprogram.parse();\n"]}
|