@agent-native/core 0.18.1 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -11
- package/dist/a2a/caller-auth.d.ts +1 -0
- package/dist/a2a/caller-auth.d.ts.map +1 -1
- package/dist/a2a/caller-auth.js +1 -1
- package/dist/a2a/caller-auth.js.map +1 -1
- package/dist/a2a/client.d.ts +7 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +3 -0
- package/dist/a2a/client.js.map +1 -1
- package/dist/agent/production-agent.d.ts +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +34 -2
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +47 -256
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/connect.d.ts +94 -0
- package/dist/cli/connect.d.ts.map +1 -0
- package/dist/cli/connect.js +443 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-config-writers.d.ts +71 -0
- package/dist/cli/mcp-config-writers.d.ts.map +1 -0
- package/dist/cli/mcp-config-writers.js +210 -0
- package/dist/cli/mcp-config-writers.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +4 -4
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +3 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +22 -66
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +4 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts +6 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +5 -4
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +6 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +20 -10
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts +18 -0
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -0
- package/dist/client/conversation/AgentConversation.js +94 -0
- package/dist/client/conversation/AgentConversation.js.map +1 -0
- package/dist/client/conversation/AgentConversation.spec.d.ts +2 -0
- package/dist/client/conversation/AgentConversation.spec.d.ts.map +1 -0
- package/dist/client/conversation/AgentConversation.spec.js +69 -0
- package/dist/client/conversation/AgentConversation.spec.js.map +1 -0
- package/dist/client/conversation/index.d.ts +4 -0
- package/dist/client/conversation/index.d.ts.map +1 -0
- package/dist/client/conversation/index.js +3 -0
- package/dist/client/conversation/index.js.map +1 -0
- package/dist/client/conversation/types.d.ts +54 -0
- package/dist/client/conversation/types.d.ts.map +1 -0
- package/dist/client/conversation/types.js +2 -0
- package/dist/client/conversation/types.js.map +1 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +15 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.js +66 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -0
- package/dist/client/dynamic-suggestions.d.ts +43 -0
- package/dist/client/dynamic-suggestions.d.ts.map +1 -0
- package/dist/client/dynamic-suggestions.js +344 -0
- package/dist/client/dynamic-suggestions.js.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +2 -2
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +4 -28
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +2 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/code-agents/index.d.ts +1 -0
- package/dist/code-agents/index.d.ts.map +1 -1
- package/dist/code-agents/index.js +1 -0
- package/dist/code-agents/index.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.d.ts +50 -0
- package/dist/code-agents/transcript-normalizer.d.ts.map +1 -0
- package/dist/code-agents/transcript-normalizer.js +356 -0
- package/dist/code-agents/transcript-normalizer.js.map +1 -0
- package/dist/coding-tools/index.d.ts +31 -0
- package/dist/coding-tools/index.d.ts.map +1 -0
- package/dist/coding-tools/index.js +411 -0
- package/dist/coding-tools/index.js.map +1 -0
- package/dist/extensions/schema.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +30 -0
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/builtin-tools.d.ts.map +1 -1
- package/dist/mcp/builtin-tools.js +85 -26
- package/dist/mcp/builtin-tools.js.map +1 -1
- package/dist/mcp/connect-route.d.ts +43 -0
- package/dist/mcp/connect-route.d.ts.map +1 -0
- package/dist/mcp/connect-route.js +744 -0
- package/dist/mcp/connect-route.js.map +1 -0
- package/dist/mcp/connect-store.d.ts +132 -0
- package/dist/mcp/connect-store.d.ts.map +1 -0
- package/dist/mcp/connect-store.js +434 -0
- package/dist/mcp/connect-store.js.map +1 -0
- package/dist/mcp/org-directory.d.ts +83 -0
- package/dist/mcp/org-directory.d.ts.map +1 -0
- package/dist/mcp/org-directory.js +201 -0
- package/dist/mcp/org-directory.js.map +1 -0
- package/dist/mcp/server.d.ts +38 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +208 -77
- package/dist/mcp/server.js.map +1 -1
- package/dist/scripts/dev/index.d.ts +6 -4
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +28 -13
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +32 -32
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.js +2 -2
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/agents-bundle.d.ts +3 -3
- package/dist/server/agents-bundle.js +5 -5
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/auth.d.ts +17 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +149 -33
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +43 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +25 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +12 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +42 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/identity-sso-store.d.ts +86 -0
- package/dist/server/identity-sso-store.d.ts.map +1 -0
- package/dist/server/identity-sso-store.js +243 -0
- package/dist/server/identity-sso-store.js.map +1 -0
- package/dist/server/identity-sso.d.ts +78 -0
- package/dist/server/identity-sso.d.ts.map +1 -0
- package/dist/server/identity-sso.js +425 -0
- package/dist/server/identity-sso.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +2 -1
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/sentry.d.ts.map +1 -1
- package/dist/server/sentry.js +17 -2
- package/dist/server/sentry.js.map +1 -1
- package/dist/sharing/schema.d.ts +1 -1
- package/docs/content/client.md +15 -0
- package/docs/content/code-agents-ui.md +25 -4
- package/docs/content/cross-app-sso.md +118 -0
- package/docs/content/drop-in-agent.md +3 -1
- package/docs/content/external-agents.md +130 -51
- package/docs/content/frames.md +1 -1
- package/docs/content/migration-workbench.md +6 -1
- package/package.json +2 -1
|
@@ -428,9 +428,9 @@ You are a focused sub-agent with a specific task. You have been given a curated
|
|
|
428
428
|
|
|
429
429
|
**Start immediately with your task. Do NOT:**
|
|
430
430
|
- Run \`db-schema\` to explore the database structure
|
|
431
|
-
- Run \`
|
|
431
|
+
- Run \`bash\` just to search/list files
|
|
432
432
|
- Try to \`curl\` or access external URLs to find the app
|
|
433
|
-
- Use \`
|
|
433
|
+
- Use \`bash\` for exploration — only for running \`pnpm action\` commands when no direct action exists
|
|
434
434
|
|
|
435
435
|
**Your available actions (${actionNames}) work directly. Use them.**
|
|
436
436
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-teams.js","sourceRoot":"","sources":["../../src/server/agent-teams.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Teams — sub-agent orchestration for agent-native.\n *\n * The main agent chat acts as an orchestrator. It spawns sub-agents\n * for individual tasks, which run in their own threads. Sub-agents\n * appear as rich preview cards (chips) inline in the main chat.\n *\n * This module provides the server-side infrastructure:\n * - Creating sub-agent threads and running them in background\n * - Tracking task status and results\n * - Emitting SSE events for live preview cards\n * - Bidirectional messaging between main agent and sub-agents\n *\n * Task state is persisted in application_state (SQL) so it survives\n * serverless cold starts and works across multiple processes.\n */\n\nimport type { AgentChatEvent } from \"../agent/types.js\";\nimport type {\n ActionEntry,\n AgentLoopFinalResponseGuard,\n} from \"../agent/production-agent.js\";\nimport { actionsToEngineTools } from \"../agent/production-agent.js\";\nimport type { AgentEngine, EngineMessage } from \"../agent/engine/types.js\";\nimport { createAnthropicEngine } from \"../agent/engine/anthropic-engine.js\";\nimport { createThread } from \"../chat-threads/store.js\";\nimport {\n abortRun,\n getRun,\n startRun,\n subscribeToRun,\n} from \"../agent/run-manager.js\";\nimport { getRunEventsSince } from \"../agent/run-store.js\";\nimport { runAgentLoop } from \"../agent/production-agent.js\";\nimport { buildAssistantMessage } from \"../agent/thread-data-builder.js\";\nimport type { RunEvent } from \"../agent/types.js\";\nimport type {\n BackgroundAgentRun,\n BackgroundAgentRunStatus,\n BackgroundAgentTranscriptEvent,\n} from \"../code-agents/background-run.js\";\nimport type {\n BackgroundAgentController,\n BackgroundAgentControlInput,\n BackgroundAgentControlResult,\n BackgroundAgentFollowUpInput,\n ListBackgroundAgentRunsOptions,\n} from \"../code-agents/index.js\";\nimport {\n readAppState,\n writeAppState,\n listAppState,\n deleteAppState,\n} from \"../application-state/script-helpers.js\";\nimport { getRequestUserEmail } from \"./request-context.js\";\n\nexport interface AgentTask {\n taskId: string;\n threadId: string;\n description: string;\n status: \"running\" | \"completed\" | \"errored\";\n preview: string;\n summary: string;\n currentStep: string;\n createdAt: number;\n}\n\nexport type AgentTeamBackgroundRun = Omit<\n BackgroundAgentRun,\n | \"kind\"\n | \"source\"\n | \"sourceRecord\"\n | \"status\"\n | \"cwd\"\n | \"goalId\"\n | \"transcriptPath\"\n | \"artifactRoot\"\n> & {\n kind: \"agent-team\";\n source: \"hosted-agent-team\";\n sourceRecord: {\n type: \"agent-team-task\";\n id: string;\n threadId: string;\n };\n status: BackgroundAgentRunStatus;\n cwd?: string;\n goalId: \"agent-team\";\n transcriptPath?: string;\n artifactRoot?: string;\n};\n\nexport type AgentTeamBackgroundTranscriptEvent = Omit<\n BackgroundAgentTranscriptEvent,\n \"kind\" | \"source\" | \"sourceRecord\"\n> & {\n kind: \"user\" | \"system\" | \"note\" | \"artifact\" | \"status\";\n source: \"hosted-agent-team\";\n sourceRecord: {\n type: \"agent-team-run-event\";\n id: string;\n seq: number;\n };\n};\n\nexport interface SendToAgentTeamBackgroundRunResult {\n ok: boolean;\n error?: string;\n messageId?: string;\n queuedCount?: number;\n}\n\nexport interface ControlAgentTeamBackgroundRunResult {\n ok: boolean;\n error?: string;\n}\n\nexport function createAgentTeamBackgroundAgentController(): BackgroundAgentController {\n return {\n async list(options?: ListBackgroundAgentRunsOptions) {\n if (options?.goalId && options.goalId !== \"agent-team\") return [];\n return listAgentTeamBackgroundRuns();\n },\n get: getAgentTeamBackgroundRun,\n transcript: listAgentTeamBackgroundTranscriptEvents,\n sendFollowUp: sendAgentTeamBackgroundAgentFollowUp,\n control: controlAgentTeamBackgroundAgentRun,\n };\n}\n\nexport const agentTeamBackgroundAgentController =\n createAgentTeamBackgroundAgentController();\n\n/** Key prefix for task records: agent-task:{taskId} */\nconst TASK_PREFIX = \"agent-task:\";\n\n/** Key prefix for thread→task reverse lookup: agent-task-thread:{threadId} */\nconst THREAD_PREFIX = \"agent-task-thread:\";\n\n/** Key prefix for queued orchestrator→sub-agent messages. */\nconst TASK_MESSAGE_PREFIX = \"task-message:\";\n\nexport interface QueuedTaskMessage {\n id: string;\n from: \"orchestrator\";\n message: string;\n timestamp: number;\n}\n\nfunction taskMessageQueuePrefix(taskId: string): string {\n return `${TASK_MESSAGE_PREFIX}${taskId}:`;\n}\n\nfunction generateTaskMessageId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizeQueuedTaskMessage(\n value: Record<string, unknown>,\n fallbackId: string,\n): QueuedTaskMessage | null {\n if (typeof value.message !== \"string\" || value.message.trim().length === 0) {\n return null;\n }\n const timestamp =\n typeof value.timestamp === \"number\" && Number.isFinite(value.timestamp)\n ? value.timestamp\n : Date.now();\n return {\n id: typeof value.id === \"string\" ? value.id : fallbackId,\n from: \"orchestrator\",\n message: value.message,\n timestamp,\n };\n}\n\nfunction formatQueuedTaskMessages(messages: QueuedTaskMessage[]): string {\n const label =\n messages.length === 1\n ? \"Orchestrator message received while you were working\"\n : \"Orchestrator messages received while you were working\";\n const body = messages\n .map((message) => {\n const sentAt = new Date(message.timestamp).toISOString();\n return `[${sentAt}] ${message.message}`;\n })\n .join(\"\\n\\n\");\n return `${label}:\\n\\n${body}\\n\\nAdjust your next steps to account for this update.`;\n}\n\nconst taskMessageDrainLocks = new Map<string, Promise<unknown>>();\n\nasync function withTaskMessageDrainLock<T>(\n taskId: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = taskMessageDrainLocks.get(taskId) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n taskMessageDrainLocks.set(taskId, current);\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (taskMessageDrainLocks.get(taskId) === current) {\n taskMessageDrainLocks.delete(taskId);\n }\n }\n}\n\nasync function listQueuedTaskMessages(\n taskId: string,\n): Promise<Array<{ key: string; message: QueuedTaskMessage }>> {\n const queuePrefix = taskMessageQueuePrefix(taskId);\n const entries = await listAppState(queuePrefix);\n const messages = entries\n .map((entry) => {\n const id = entry.key.slice(queuePrefix.length);\n const message = normalizeQueuedTaskMessage(entry.value, id);\n return message ? { key: entry.key, message } : null;\n })\n .filter(\n (\n entry,\n ): entry is {\n key: string;\n message: QueuedTaskMessage;\n } => Boolean(entry),\n );\n\n // Backward compatibility for messages queued by the old implementation.\n const legacyKey = `${TASK_MESSAGE_PREFIX}${taskId}`;\n const legacy = await readAppState(legacyKey);\n const legacyMessage = legacy\n ? normalizeQueuedTaskMessage(legacy, \"legacy\")\n : null;\n if (legacyMessage) {\n messages.push({ key: legacyKey, message: legacyMessage });\n }\n\n return messages.sort((a, b) => {\n const byTimestamp = a.message.timestamp - b.message.timestamp;\n return byTimestamp || a.message.id.localeCompare(b.message.id);\n });\n}\n\nasync function drainQueuedTaskMessages(\n taskId: string,\n): Promise<QueuedTaskMessage[]> {\n return withTaskMessageDrainLock(taskId, async () => {\n const entries = await listQueuedTaskMessages(taskId);\n if (entries.length === 0) return [];\n for (const entry of entries) {\n await deleteAppState(entry.key);\n }\n return entries.map((entry) => entry.message);\n });\n}\n\nasync function appendQueuedTaskMessage(\n taskId: string,\n message: string,\n): Promise<{ messageId: string; queuedCount: number }> {\n const messageId = generateTaskMessageId();\n await writeAppState(`${taskMessageQueuePrefix(taskId)}${messageId}`, {\n id: messageId,\n from: \"orchestrator\",\n message,\n timestamp: Date.now(),\n });\n const queuedCount = (await listQueuedTaskMessages(taskId)).length;\n return { messageId, queuedCount };\n}\n\nfunction createMessageAwareActions(\n taskId: string,\n actions: Record<string, ActionEntry>,\n): Record<string, ActionEntry> {\n return Object.fromEntries(\n Object.entries(actions).map(([name, entry]) => [\n name,\n {\n ...entry,\n run: async (args, context) => {\n const result = await entry.run(args, context);\n const queuedMessages = await drainQueuedTaskMessages(taskId);\n if (queuedMessages.length === 0) return result;\n\n // Tool results are already the next safe model-visible boundary:\n // the loop records all tool output, then asks the model to continue.\n // Attaching queued updates here avoids mutating message history while\n // an assistant tool-call turn is still being resolved.\n const formatted = formatQueuedTaskMessages(queuedMessages);\n const resultText =\n typeof result === \"string\"\n ? result\n : JSON.stringify(result, null, 2);\n return `${resultText}\\n\\n${formatted}`;\n },\n },\n ]),\n );\n}\n\nfunction createTaskMessageFinalGuard(\n taskId: string,\n): AgentLoopFinalResponseGuard {\n return async () => {\n const queuedMessages = await drainQueuedTaskMessages(taskId);\n if (queuedMessages.length === 0) return null;\n\n // This is queued delivery, not a live interrupt: if the sub-agent is\n // already producing a final answer, the guard asks the loop for one more\n // continuation that includes the orchestrator update as a fresh user turn.\n return {\n retryMessage: formatQueuedTaskMessages(queuedMessages),\n fallbackMessage:\n \"I received an orchestrator update while finishing, but could not continue from it. Please check the task status and send the update again if needed.\",\n };\n };\n}\n\nasync function saveTask(task: AgentTask): Promise<void> {\n await writeAppState(`${TASK_PREFIX}${task.taskId}`, task as any);\n await writeAppState(`${THREAD_PREFIX}${task.threadId}`, {\n taskId: task.taskId,\n });\n}\n\nasync function loadTask(taskId: string): Promise<AgentTask | null> {\n const data = await readAppState(`${TASK_PREFIX}${taskId}`);\n return data ? (data as unknown as AgentTask) : null;\n}\n\nasync function loadTaskByThread(threadId: string): Promise<AgentTask | null> {\n const ref = await readAppState(`${THREAD_PREFIX}${threadId}`);\n if (!ref || !ref.taskId) return null;\n return loadTask(ref.taskId as string);\n}\n\nfunction generateTaskId(): string {\n return `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction taskRunId(taskId: string): string {\n return `run-task-${taskId}`;\n}\n\nfunction taskIdFromBackgroundRunId(runId: string): string {\n return runId.startsWith(\"run-task-\")\n ? runId.slice(\"run-task-\".length)\n : runId;\n}\n\nfunction mapTaskStatusToBackgroundStatus(\n status: AgentTask[\"status\"],\n): BackgroundAgentRunStatus {\n return status;\n}\n\nfunction taskTimestampToIso(timestamp: number): string {\n const date = new Date(timestamp);\n return Number.isFinite(date.getTime())\n ? date.toISOString()\n : new Date(0).toISOString();\n}\n\nfunction latestTaskText(task: AgentTask): string | undefined {\n return task.summary || task.preview || task.currentStep || undefined;\n}\n\nexport function toAgentTaskBackgroundRun(\n task: AgentTask,\n): AgentTeamBackgroundRun {\n const createdAt = taskTimestampToIso(task.createdAt);\n return {\n schemaVersion: 1,\n id: taskRunId(task.taskId),\n kind: \"agent-team\",\n source: \"hosted-agent-team\",\n sourceLabel: \"Agent Teams\",\n sourceRecord: {\n type: \"agent-team-task\",\n id: task.taskId,\n threadId: task.threadId,\n },\n title: task.description,\n subtitle: task.currentStep || undefined,\n status: mapTaskStatusToBackgroundStatus(task.status),\n phase: task.currentStep || task.status,\n createdAt,\n updatedAt: createdAt,\n goalId: \"agent-team\",\n needsInput: false,\n needsApproval: false,\n details: [\n { label: \"Task\", value: task.taskId },\n { label: \"Thread\", value: task.threadId },\n ],\n surfaceUrl: `agent-native://threads/${task.threadId}`,\n metadata: {\n taskId: task.taskId,\n threadId: task.threadId,\n description: task.description,\n preview: task.preview,\n summary: task.summary,\n currentStep: task.currentStep,\n latestText: latestTaskText(task),\n },\n };\n}\n\nfunction summarizeAgentChatEvent(event: RunEvent): {\n kind: AgentTeamBackgroundTranscriptEvent[\"kind\"];\n message: string;\n metadata?: Record<string, unknown>;\n} | null {\n const payload = event.event;\n switch (payload.type) {\n case \"text\":\n return { kind: \"note\", message: payload.text };\n case \"activity\":\n return {\n kind: \"status\",\n message: payload.label,\n metadata: payload.tool ? { tool: payload.tool } : undefined,\n };\n case \"tool_start\":\n return {\n kind: \"status\",\n message: `Running ${payload.tool}`,\n metadata: { tool: payload.tool, input: payload.input },\n };\n case \"tool_done\":\n return {\n kind: \"artifact\",\n message: payload.result,\n metadata: { tool: payload.tool },\n };\n case \"agent_task\":\n return {\n kind: \"status\",\n message: `${payload.description} (${payload.status})`,\n metadata: {\n taskId: payload.taskId,\n threadId: payload.threadId,\n status: payload.status,\n },\n };\n case \"agent_task_update\":\n return {\n kind: \"status\",\n message: payload.preview || payload.currentStep || \"Task updated\",\n metadata: {\n taskId: payload.taskId,\n currentStep: payload.currentStep,\n },\n };\n case \"agent_task_complete\":\n return {\n kind: \"status\",\n message: payload.summary,\n metadata: { taskId: payload.taskId },\n };\n case \"error\":\n return {\n kind: \"status\",\n message: payload.error,\n metadata: {\n errorCode: payload.errorCode,\n upgradeUrl: payload.upgradeUrl,\n },\n };\n case \"missing_api_key\":\n return {\n kind: \"status\",\n message: \"Missing API key\",\n };\n case \"done\":\n return { kind: \"status\", message: \"Run completed\" };\n case \"loop_limit\":\n return { kind: \"status\", message: \"Run stopped at the loop limit\" };\n case \"auto_continue\":\n return {\n kind: \"status\",\n message: \"Run reached its continuation boundary\",\n metadata: { reason: payload.reason },\n };\n case \"clear\":\n return null;\n case \"agent_call\":\n return {\n kind: \"status\",\n message: `${payload.agent} ${payload.status}`,\n metadata: { agent: payload.agent, status: payload.status },\n };\n case \"agent_call_text\":\n return {\n kind: \"note\",\n message: payload.text,\n metadata: { agent: payload.agent },\n };\n default:\n return null;\n }\n}\n\nexport function toAgentTaskBackgroundTranscriptEvent(\n runId: string,\n event: RunEvent,\n): AgentTeamBackgroundTranscriptEvent | null {\n const summary = summarizeAgentChatEvent(event);\n if (!summary) return null;\n return {\n schemaVersion: 1,\n id: `${runId}:${event.seq}`,\n runId,\n kind: summary.kind,\n source: \"hosted-agent-team\",\n sourceRecord: {\n type: \"agent-team-run-event\",\n id: `${runId}:${event.seq}`,\n seq: event.seq,\n },\n message: summary.message,\n createdAt: new Date().toISOString(),\n metadata: summary.metadata,\n };\n}\n\nexport interface SpawnTaskOptions {\n /** Description of what the sub-agent should do */\n description: string;\n /** Additional instructions scoped to this sub-agent */\n instructions?: string;\n /** Model to use (e.g. \"claude-haiku-4-5\"). Uses default if omitted */\n model?: string;\n /** The owner email for thread creation */\n ownerEmail: string;\n /** The system prompt base for the sub-agent */\n systemPrompt: string;\n /** Available actions for the sub-agent */\n actions: Record<string, ActionEntry>;\n /** Agent engine to use. Falls back to creating an Anthropic engine with apiKey. */\n engine?: AgentEngine;\n /** API key for Anthropic (used only if engine is not provided) */\n apiKey?: string;\n /** Callback to emit events to the parent chat stream */\n parentSend: (event: AgentChatEvent) => void;\n /** Parent thread ID — used to auto-respond when the sub-agent finishes */\n parentThreadId?: string;\n}\n\n/**\n * Spawn a sub-agent task. Creates a thread, starts a background agent run,\n * and emits agent_task events to the parent chat stream.\n */\nexport async function spawnTask(opts: SpawnTaskOptions): Promise<AgentTask> {\n const taskId = generateTaskId();\n\n // Create a dedicated thread for the sub-agent with the task as the first message\n const thread = await createThread(opts.ownerEmail, {\n title: opts.description.slice(0, 100),\n });\n\n // Save the initial user message to thread data so the tab shows content\n // immediately. Shape must match assistant-ui's ExportedMessageRepository —\n // each entry carries an explicit `parentId` so the runtime threads messages\n // into a linked list; without it, later assistant messages render as\n // orphaned siblings and only the one under `headId` is shown.\n const userMsgId = `msg-${taskId}-user`;\n try {\n const { updateThreadData } = await import(\"../chat-threads/store.js\");\n const threadData = JSON.stringify({\n headId: userMsgId,\n messages: [\n {\n message: {\n id: userMsgId,\n role: \"user\",\n content: [{ type: \"text\", text: opts.description }],\n metadata: {},\n },\n parentId: null,\n },\n ],\n });\n await updateThreadData(\n thread.id,\n threadData,\n opts.description.slice(0, 100),\n opts.description.slice(0, 200),\n 1,\n );\n } catch {\n // Best effort — thread will still work without persisted messages\n }\n\n const task: AgentTask = {\n taskId,\n threadId: thread.id,\n description: opts.description,\n status: \"running\",\n preview: \"\",\n summary: \"\",\n currentStep: \"\",\n createdAt: Date.now(),\n };\n\n await saveTask(task);\n\n // Notify parent chat that a sub-agent was spawned\n opts.parentSend({\n type: \"agent_task\",\n taskId,\n threadId: thread.id,\n description: opts.description,\n status: \"running\",\n });\n\n // Build scoped system prompt\n // Prepend a clear \"you are a sub-agent\" reminder so the agent doesn't\n // start exploring the file system or database before using its actions.\n const actionNames = Object.keys(opts.actions).join(\", \");\n const subAgentPreamble = `## You Are a Sub-Agent\n\nYou are a focused sub-agent with a specific task. You have been given a curated set of actions that connect directly to the app's database and services.\n\n**Start immediately with your task. Do NOT:**\n- Run \\`db-schema\\` to explore the database structure\n- Run \\`search-files\\` or \\`list-files\\` to find code\n- Try to \\`curl\\` or access external URLs to find the app\n- Use \\`shell\\` for exploration — only for running \\`pnpm action\\` commands when no direct action exists\n\n**Your available actions (${actionNames}) work directly. Use them.**\n\n`;\n let systemPrompt = subAgentPreamble + opts.systemPrompt;\n if (opts.instructions) {\n systemPrompt += `\\n\\n## Task-Specific Instructions\\n\\n${opts.instructions}`;\n }\n\n // Resolve the engine — prefer the passed engine, fall back to Anthropic with apiKey\n const engine: AgentEngine =\n opts.engine ?? createAnthropicEngine({ apiKey: opts.apiKey });\n const model = opts.model ?? engine.defaultModel;\n\n // Build tools from actions using the normalized EngineTool format\n const messageAwareActions = createMessageAwareActions(taskId, opts.actions);\n const tools = actionsToEngineTools(messageAwareActions);\n\n const messages: EngineMessage[] = [\n { role: \"user\", content: [{ type: \"text\", text: opts.description }] },\n ];\n\n // Start the agent run in background\n const runId = `run-task-${taskId}`;\n let accumulatedText = \"\";\n let lastPreviewSent = 0;\n const PREVIEW_INTERVAL_MS = 300; // Throttle preview updates to every 300ms\n // Gate to prevent sendPreviewUpdate from overwriting terminal status\n let runFinished = false;\n\n startRun(\n runId,\n thread.id,\n async (send, signal) => {\n const sendPreviewUpdate = async (force = false) => {\n if (runFinished) return; // Don't overwrite completed/errored status\n const now = Date.now();\n if (!force && now - lastPreviewSent < PREVIEW_INTERVAL_MS) return;\n lastPreviewSent = now;\n task.preview = accumulatedText.slice(-800);\n // Persist to SQL so status checks from other processes see live state\n await saveTask(task);\n opts.parentSend({\n type: \"agent_task_update\",\n taskId,\n preview: task.preview,\n currentStep: task.currentStep,\n });\n };\n\n // Wrap the send function to also emit preview updates to parent\n const wrappedSend = (event: AgentChatEvent) => {\n send(event);\n\n if (event.type === \"text\") {\n accumulatedText += event.text;\n sendPreviewUpdate();\n } else if (event.type === \"tool_start\") {\n task.currentStep = `Running ${event.tool}...`;\n sendPreviewUpdate(true);\n } else if (event.type === \"tool_done\") {\n task.currentStep = \"\";\n sendPreviewUpdate(true);\n }\n };\n\n await runAgentLoop({\n engine,\n model,\n systemPrompt,\n tools,\n messages,\n actions: messageAwareActions,\n send: wrappedSend,\n signal,\n finalResponseGuard: createTaskMessageFinalGuard(taskId),\n });\n },\n // onComplete callback — called when the run finishes (success or error)\n async (run) => {\n // Prevent any in-flight sendPreviewUpdate from overwriting terminal status\n runFinished = true;\n\n if (run.status === \"errored\") {\n task.status = \"errored\";\n task.summary = accumulatedText.slice(-500) || \"Task failed.\";\n await saveTask(task);\n // Emit error as agent_task_complete with errored status\n opts.parentSend({\n type: \"agent_task\",\n taskId,\n threadId: thread.id,\n description: task.description,\n status: \"errored\",\n });\n } else {\n task.status = \"completed\";\n task.summary =\n accumulatedText.slice(-1000) || \"Task completed successfully.\";\n await saveTask(task);\n opts.parentSend({\n type: \"agent_task_complete\",\n taskId,\n summary: task.summary,\n });\n }\n\n // Persist the full conversation to threadData so the sub-agent tab\n // can restore it later (after the in-memory run is cleaned up).\n // Rebuild from run.events via buildAssistantMessage so partial text\n // streamed in an interrupted final iteration is preserved — the\n // EngineMessage[] array only picks up a turn after runAgentLoop\n // finishes pushing, so an aborted mid-stream would otherwise be lost.\n try {\n const { updateThreadData } = await import(\"../chat-threads/store.js\");\n const userMsg = {\n id: `msg-${taskId}-user`,\n role: \"user\" as const,\n content: [{ type: \"text\", text: opts.description }],\n metadata: {},\n };\n const assistantMsg = buildAssistantMessage(\n run.events ?? [],\n `task-${taskId}`,\n );\n // Chain assistant → user via parentId so assistant-ui renders them\n // as a linked conversation, not orphaned siblings. headId points to\n // the leaf (assistant if present, otherwise the user message).\n const messages: Array<{\n message: Record<string, unknown>;\n parentId: string | null;\n }> = [{ message: userMsg, parentId: null }];\n if (assistantMsg) {\n messages.push({\n message: {\n ...assistantMsg,\n status: { type: \"complete\", reason: \"stop\" },\n },\n parentId: userMsg.id,\n });\n }\n const headId = assistantMsg?.id ?? (userMsg.id as string | undefined);\n const repo = { headId, messages };\n\n const title = opts.description.slice(0, 100);\n const preview = accumulatedText.slice(0, 200);\n await updateThreadData(\n thread.id,\n JSON.stringify(repo),\n title,\n preview,\n repo.messages.length,\n );\n } catch {\n // Best effort — the in-memory replay path still works\n }\n\n // ─── Auto-follow-up on parent thread ────────────────────────────\n // When the sub-agent finishes, start a short agent run on the\n // parent thread so the user sees a recap without having to scroll\n // up or manually check the sub-agent card.\n if (opts.parentThreadId) {\n try {\n const { getActiveRunForThread } =\n await import(\"../agent/run-manager.js\");\n // Only auto-respond if the parent thread is idle — don't\n // interrupt an ongoing conversation.\n const activeRun = getActiveRunForThread(opts.parentThreadId);\n if (!activeRun || activeRun.status !== \"running\") {\n const followUpEngine =\n opts.engine ?? createAnthropicEngine({ apiKey: opts.apiKey });\n const followUpModel = opts.model ?? followUpEngine.defaultModel;\n\n const statusEmoji = task.status === \"errored\" ? \"!\" : \"done\";\n const notification =\n `[Sub-agent ${statusEmoji}] The sub-agent task \"${task.description}\" has ${task.status === \"errored\" ? \"failed\" : \"completed\"}.\\n\\n` +\n `Summary of what it did:\\n${task.summary}\\n\\n` +\n `Briefly let the user know the sub-agent finished and highlight any key results. Be concise — 1-2 sentences.`;\n\n const followUpRunId = `run-followup-${taskId}`;\n startRun(\n followUpRunId,\n opts.parentThreadId,\n async (send, signal) => {\n await runAgentLoop({\n engine: followUpEngine,\n model: followUpModel,\n systemPrompt: opts.systemPrompt,\n tools: [], // No tools needed for a recap\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: notification }],\n },\n ],\n actions: {},\n send,\n signal,\n });\n },\n );\n }\n } catch {\n // Best effort — don't break the sub-agent completion\n }\n }\n },\n );\n\n return task;\n}\n\n/** Get task by ID */\nexport async function getTask(taskId: string): Promise<AgentTask | undefined> {\n const task = await loadTask(taskId);\n return task ?? undefined;\n}\n\n/** Get task by thread ID */\nexport async function getTaskByThread(\n threadId: string,\n): Promise<AgentTask | undefined> {\n const task = await loadTaskByThread(threadId);\n return task ?? undefined;\n}\n\n/** List all tasks (most recent first) */\nexport async function listTasks(): Promise<AgentTask[]> {\n const entries = await listAppState(TASK_PREFIX);\n const tasks = entries.map((e) => e.value as unknown as AgentTask);\n return tasks.sort((a, b) => b.createdAt - a.createdAt);\n}\n\nexport async function listAgentTeamBackgroundRuns(): Promise<\n AgentTeamBackgroundRun[]\n> {\n return (await listTasks()).map(toAgentTaskBackgroundRun);\n}\n\nexport async function getAgentTeamBackgroundRun(\n runId: string,\n): Promise<AgentTeamBackgroundRun | null> {\n const task = await loadTask(taskIdFromBackgroundRunId(runId));\n return task ? toAgentTaskBackgroundRun(task) : null;\n}\n\nexport async function listAgentTeamBackgroundTranscriptEvents(\n runId: string,\n): Promise<AgentTeamBackgroundTranscriptEvent[]> {\n const normalizedRunId = taskRunId(taskIdFromBackgroundRunId(runId));\n const activeRun = getRun(normalizedRunId);\n const events = activeRun\n ? activeRun.events\n : await getPersistedRunEvents(normalizedRunId);\n\n return events\n .map((event) =>\n toAgentTaskBackgroundTranscriptEvent(normalizedRunId, event),\n )\n .filter((event): event is AgentTeamBackgroundTranscriptEvent =>\n Boolean(event),\n );\n}\n\nexport function subscribeToAgentTeamBackgroundRun(\n runId: string,\n fromSeq = 0,\n): ReadableStream<Uint8Array> | null {\n return subscribeToRun(taskRunId(taskIdFromBackgroundRunId(runId)), fromSeq);\n}\n\nasync function getPersistedRunEvents(runId: string): Promise<RunEvent[]> {\n const rows = await getRunEventsSince(runId, 0);\n return rows\n .map((row): RunEvent | null => {\n try {\n return {\n seq: row.seq,\n event: JSON.parse(row.eventData) as RunEvent[\"event\"],\n };\n } catch {\n return null;\n }\n })\n .filter((event): event is RunEvent => Boolean(event));\n}\n\n/** Send a message/update to a running sub-agent via application state */\nexport async function sendToTask(\n taskId: string,\n message: string,\n): Promise<{\n ok: boolean;\n error?: string;\n messageId?: string;\n queuedCount?: number;\n}> {\n const task = await loadTask(taskId);\n if (!task) return { ok: false, error: \"Task not found\" };\n if (task.status !== \"running\")\n return { ok: false, error: \"Task is not running\" };\n if (message.trim().length === 0)\n return { ok: false, error: \"Message is required\" };\n\n // Append to a durable per-task queue. Running sub-agents drain this queue\n // after tool batches and immediately before a final response. This does not\n // interrupt an in-flight model stream or tool call; it guarantees the next\n // safe continuation sees the update.\n try {\n const queued = await appendQueuedTaskMessage(taskId, message);\n return { ok: true, ...queued };\n } catch {\n const sessionId = getRequestUserEmail();\n if (!sessionId) return { ok: false, error: \"no authenticated user\" };\n return { ok: false, error: \"Unable to queue message\" };\n }\n}\n\nexport async function sendToAgentTeamBackgroundRun(\n runId: string,\n message: string,\n): Promise<SendToAgentTeamBackgroundRunResult> {\n return sendToTask(taskIdFromBackgroundRunId(runId), message);\n}\n\nasync function sendAgentTeamBackgroundAgentFollowUp(\n input: BackgroundAgentFollowUpInput,\n): Promise<BackgroundAgentControlResult> {\n const prompt = input.prompt.trim();\n if (!prompt) {\n return {\n ok: false,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n error: \"Follow-up prompt is required.\",\n };\n }\n\n const result = await sendToAgentTeamBackgroundRun(input.runId, prompt);\n return {\n ok: result.ok,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n queued: result.ok,\n message: result.ok\n ? \"Follow-up queued for the Agent Teams background run.\"\n : undefined,\n error: result.error,\n };\n}\n\nasync function controlAgentTeamBackgroundAgentRun(\n input: BackgroundAgentControlInput,\n): Promise<BackgroundAgentControlResult> {\n if (input.command !== \"stop\") {\n return {\n ok: false,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n error:\n \"Agent Teams background runs currently support stop through the shared controller.\",\n };\n }\n\n const result = await stopAgentTeamBackgroundRun(input.runId);\n return {\n ok: result.ok,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n message: result.ok ? \"Agent Teams background run stopped.\" : undefined,\n error: result.error,\n };\n}\n\nexport async function stopAgentTeamBackgroundRun(\n runId: string,\n reason = \"user\",\n): Promise<ControlAgentTeamBackgroundRunResult> {\n const taskId = taskIdFromBackgroundRunId(runId);\n const task = await loadTask(taskId);\n if (!task) return { ok: false, error: \"Task not found\" };\n if (task.status !== \"running\") {\n return { ok: false, error: \"Task is not running\" };\n }\n\n abortRun(taskRunId(taskId), reason);\n task.status = \"errored\";\n task.summary =\n reason === \"user\" ? \"Task stopped.\" : `Task stopped: ${reason}`;\n await saveTask(task);\n return { ok: true };\n}\n\n/** Mark a task as errored */\nexport async function markTaskErrored(\n taskId: string,\n error: string,\n): Promise<void> {\n const task = await loadTask(taskId);\n if (task) {\n task.status = \"errored\";\n task.summary = error;\n await saveTask(task);\n }\n}\n\nexport const _agentTeamsQueueForTests = {\n createMessageAwareActions,\n createTaskMessageFinalGuard,\n drainQueuedTaskMessages,\n formatQueuedTaskMessages,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"agent-teams.js","sourceRoot":"","sources":["../../src/server/agent-teams.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Teams — sub-agent orchestration for agent-native.\n *\n * The main agent chat acts as an orchestrator. It spawns sub-agents\n * for individual tasks, which run in their own threads. Sub-agents\n * appear as rich preview cards (chips) inline in the main chat.\n *\n * This module provides the server-side infrastructure:\n * - Creating sub-agent threads and running them in background\n * - Tracking task status and results\n * - Emitting SSE events for live preview cards\n * - Bidirectional messaging between main agent and sub-agents\n *\n * Task state is persisted in application_state (SQL) so it survives\n * serverless cold starts and works across multiple processes.\n */\n\nimport type { AgentChatEvent } from \"../agent/types.js\";\nimport type {\n ActionEntry,\n AgentLoopFinalResponseGuard,\n} from \"../agent/production-agent.js\";\nimport { actionsToEngineTools } from \"../agent/production-agent.js\";\nimport type { AgentEngine, EngineMessage } from \"../agent/engine/types.js\";\nimport { createAnthropicEngine } from \"../agent/engine/anthropic-engine.js\";\nimport { createThread } from \"../chat-threads/store.js\";\nimport {\n abortRun,\n getRun,\n startRun,\n subscribeToRun,\n} from \"../agent/run-manager.js\";\nimport { getRunEventsSince } from \"../agent/run-store.js\";\nimport { runAgentLoop } from \"../agent/production-agent.js\";\nimport { buildAssistantMessage } from \"../agent/thread-data-builder.js\";\nimport type { RunEvent } from \"../agent/types.js\";\nimport type {\n BackgroundAgentRun,\n BackgroundAgentRunStatus,\n BackgroundAgentTranscriptEvent,\n} from \"../code-agents/background-run.js\";\nimport type {\n BackgroundAgentController,\n BackgroundAgentControlInput,\n BackgroundAgentControlResult,\n BackgroundAgentFollowUpInput,\n ListBackgroundAgentRunsOptions,\n} from \"../code-agents/index.js\";\nimport {\n readAppState,\n writeAppState,\n listAppState,\n deleteAppState,\n} from \"../application-state/script-helpers.js\";\nimport { getRequestUserEmail } from \"./request-context.js\";\n\nexport interface AgentTask {\n taskId: string;\n threadId: string;\n description: string;\n status: \"running\" | \"completed\" | \"errored\";\n preview: string;\n summary: string;\n currentStep: string;\n createdAt: number;\n}\n\nexport type AgentTeamBackgroundRun = Omit<\n BackgroundAgentRun,\n | \"kind\"\n | \"source\"\n | \"sourceRecord\"\n | \"status\"\n | \"cwd\"\n | \"goalId\"\n | \"transcriptPath\"\n | \"artifactRoot\"\n> & {\n kind: \"agent-team\";\n source: \"hosted-agent-team\";\n sourceRecord: {\n type: \"agent-team-task\";\n id: string;\n threadId: string;\n };\n status: BackgroundAgentRunStatus;\n cwd?: string;\n goalId: \"agent-team\";\n transcriptPath?: string;\n artifactRoot?: string;\n};\n\nexport type AgentTeamBackgroundTranscriptEvent = Omit<\n BackgroundAgentTranscriptEvent,\n \"kind\" | \"source\" | \"sourceRecord\"\n> & {\n kind: \"user\" | \"system\" | \"note\" | \"artifact\" | \"status\";\n source: \"hosted-agent-team\";\n sourceRecord: {\n type: \"agent-team-run-event\";\n id: string;\n seq: number;\n };\n};\n\nexport interface SendToAgentTeamBackgroundRunResult {\n ok: boolean;\n error?: string;\n messageId?: string;\n queuedCount?: number;\n}\n\nexport interface ControlAgentTeamBackgroundRunResult {\n ok: boolean;\n error?: string;\n}\n\nexport function createAgentTeamBackgroundAgentController(): BackgroundAgentController {\n return {\n async list(options?: ListBackgroundAgentRunsOptions) {\n if (options?.goalId && options.goalId !== \"agent-team\") return [];\n return listAgentTeamBackgroundRuns();\n },\n get: getAgentTeamBackgroundRun,\n transcript: listAgentTeamBackgroundTranscriptEvents,\n sendFollowUp: sendAgentTeamBackgroundAgentFollowUp,\n control: controlAgentTeamBackgroundAgentRun,\n };\n}\n\nexport const agentTeamBackgroundAgentController =\n createAgentTeamBackgroundAgentController();\n\n/** Key prefix for task records: agent-task:{taskId} */\nconst TASK_PREFIX = \"agent-task:\";\n\n/** Key prefix for thread→task reverse lookup: agent-task-thread:{threadId} */\nconst THREAD_PREFIX = \"agent-task-thread:\";\n\n/** Key prefix for queued orchestrator→sub-agent messages. */\nconst TASK_MESSAGE_PREFIX = \"task-message:\";\n\nexport interface QueuedTaskMessage {\n id: string;\n from: \"orchestrator\";\n message: string;\n timestamp: number;\n}\n\nfunction taskMessageQueuePrefix(taskId: string): string {\n return `${TASK_MESSAGE_PREFIX}${taskId}:`;\n}\n\nfunction generateTaskMessageId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizeQueuedTaskMessage(\n value: Record<string, unknown>,\n fallbackId: string,\n): QueuedTaskMessage | null {\n if (typeof value.message !== \"string\" || value.message.trim().length === 0) {\n return null;\n }\n const timestamp =\n typeof value.timestamp === \"number\" && Number.isFinite(value.timestamp)\n ? value.timestamp\n : Date.now();\n return {\n id: typeof value.id === \"string\" ? value.id : fallbackId,\n from: \"orchestrator\",\n message: value.message,\n timestamp,\n };\n}\n\nfunction formatQueuedTaskMessages(messages: QueuedTaskMessage[]): string {\n const label =\n messages.length === 1\n ? \"Orchestrator message received while you were working\"\n : \"Orchestrator messages received while you were working\";\n const body = messages\n .map((message) => {\n const sentAt = new Date(message.timestamp).toISOString();\n return `[${sentAt}] ${message.message}`;\n })\n .join(\"\\n\\n\");\n return `${label}:\\n\\n${body}\\n\\nAdjust your next steps to account for this update.`;\n}\n\nconst taskMessageDrainLocks = new Map<string, Promise<unknown>>();\n\nasync function withTaskMessageDrainLock<T>(\n taskId: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = taskMessageDrainLocks.get(taskId) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n taskMessageDrainLocks.set(taskId, current);\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (taskMessageDrainLocks.get(taskId) === current) {\n taskMessageDrainLocks.delete(taskId);\n }\n }\n}\n\nasync function listQueuedTaskMessages(\n taskId: string,\n): Promise<Array<{ key: string; message: QueuedTaskMessage }>> {\n const queuePrefix = taskMessageQueuePrefix(taskId);\n const entries = await listAppState(queuePrefix);\n const messages = entries\n .map((entry) => {\n const id = entry.key.slice(queuePrefix.length);\n const message = normalizeQueuedTaskMessage(entry.value, id);\n return message ? { key: entry.key, message } : null;\n })\n .filter(\n (\n entry,\n ): entry is {\n key: string;\n message: QueuedTaskMessage;\n } => Boolean(entry),\n );\n\n // Backward compatibility for messages queued by the old implementation.\n const legacyKey = `${TASK_MESSAGE_PREFIX}${taskId}`;\n const legacy = await readAppState(legacyKey);\n const legacyMessage = legacy\n ? normalizeQueuedTaskMessage(legacy, \"legacy\")\n : null;\n if (legacyMessage) {\n messages.push({ key: legacyKey, message: legacyMessage });\n }\n\n return messages.sort((a, b) => {\n const byTimestamp = a.message.timestamp - b.message.timestamp;\n return byTimestamp || a.message.id.localeCompare(b.message.id);\n });\n}\n\nasync function drainQueuedTaskMessages(\n taskId: string,\n): Promise<QueuedTaskMessage[]> {\n return withTaskMessageDrainLock(taskId, async () => {\n const entries = await listQueuedTaskMessages(taskId);\n if (entries.length === 0) return [];\n for (const entry of entries) {\n await deleteAppState(entry.key);\n }\n return entries.map((entry) => entry.message);\n });\n}\n\nasync function appendQueuedTaskMessage(\n taskId: string,\n message: string,\n): Promise<{ messageId: string; queuedCount: number }> {\n const messageId = generateTaskMessageId();\n await writeAppState(`${taskMessageQueuePrefix(taskId)}${messageId}`, {\n id: messageId,\n from: \"orchestrator\",\n message,\n timestamp: Date.now(),\n });\n const queuedCount = (await listQueuedTaskMessages(taskId)).length;\n return { messageId, queuedCount };\n}\n\nfunction createMessageAwareActions(\n taskId: string,\n actions: Record<string, ActionEntry>,\n): Record<string, ActionEntry> {\n return Object.fromEntries(\n Object.entries(actions).map(([name, entry]) => [\n name,\n {\n ...entry,\n run: async (args, context) => {\n const result = await entry.run(args, context);\n const queuedMessages = await drainQueuedTaskMessages(taskId);\n if (queuedMessages.length === 0) return result;\n\n // Tool results are already the next safe model-visible boundary:\n // the loop records all tool output, then asks the model to continue.\n // Attaching queued updates here avoids mutating message history while\n // an assistant tool-call turn is still being resolved.\n const formatted = formatQueuedTaskMessages(queuedMessages);\n const resultText =\n typeof result === \"string\"\n ? result\n : JSON.stringify(result, null, 2);\n return `${resultText}\\n\\n${formatted}`;\n },\n },\n ]),\n );\n}\n\nfunction createTaskMessageFinalGuard(\n taskId: string,\n): AgentLoopFinalResponseGuard {\n return async () => {\n const queuedMessages = await drainQueuedTaskMessages(taskId);\n if (queuedMessages.length === 0) return null;\n\n // This is queued delivery, not a live interrupt: if the sub-agent is\n // already producing a final answer, the guard asks the loop for one more\n // continuation that includes the orchestrator update as a fresh user turn.\n return {\n retryMessage: formatQueuedTaskMessages(queuedMessages),\n fallbackMessage:\n \"I received an orchestrator update while finishing, but could not continue from it. Please check the task status and send the update again if needed.\",\n };\n };\n}\n\nasync function saveTask(task: AgentTask): Promise<void> {\n await writeAppState(`${TASK_PREFIX}${task.taskId}`, task as any);\n await writeAppState(`${THREAD_PREFIX}${task.threadId}`, {\n taskId: task.taskId,\n });\n}\n\nasync function loadTask(taskId: string): Promise<AgentTask | null> {\n const data = await readAppState(`${TASK_PREFIX}${taskId}`);\n return data ? (data as unknown as AgentTask) : null;\n}\n\nasync function loadTaskByThread(threadId: string): Promise<AgentTask | null> {\n const ref = await readAppState(`${THREAD_PREFIX}${threadId}`);\n if (!ref || !ref.taskId) return null;\n return loadTask(ref.taskId as string);\n}\n\nfunction generateTaskId(): string {\n return `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction taskRunId(taskId: string): string {\n return `run-task-${taskId}`;\n}\n\nfunction taskIdFromBackgroundRunId(runId: string): string {\n return runId.startsWith(\"run-task-\")\n ? runId.slice(\"run-task-\".length)\n : runId;\n}\n\nfunction mapTaskStatusToBackgroundStatus(\n status: AgentTask[\"status\"],\n): BackgroundAgentRunStatus {\n return status;\n}\n\nfunction taskTimestampToIso(timestamp: number): string {\n const date = new Date(timestamp);\n return Number.isFinite(date.getTime())\n ? date.toISOString()\n : new Date(0).toISOString();\n}\n\nfunction latestTaskText(task: AgentTask): string | undefined {\n return task.summary || task.preview || task.currentStep || undefined;\n}\n\nexport function toAgentTaskBackgroundRun(\n task: AgentTask,\n): AgentTeamBackgroundRun {\n const createdAt = taskTimestampToIso(task.createdAt);\n return {\n schemaVersion: 1,\n id: taskRunId(task.taskId),\n kind: \"agent-team\",\n source: \"hosted-agent-team\",\n sourceLabel: \"Agent Teams\",\n sourceRecord: {\n type: \"agent-team-task\",\n id: task.taskId,\n threadId: task.threadId,\n },\n title: task.description,\n subtitle: task.currentStep || undefined,\n status: mapTaskStatusToBackgroundStatus(task.status),\n phase: task.currentStep || task.status,\n createdAt,\n updatedAt: createdAt,\n goalId: \"agent-team\",\n needsInput: false,\n needsApproval: false,\n details: [\n { label: \"Task\", value: task.taskId },\n { label: \"Thread\", value: task.threadId },\n ],\n surfaceUrl: `agent-native://threads/${task.threadId}`,\n metadata: {\n taskId: task.taskId,\n threadId: task.threadId,\n description: task.description,\n preview: task.preview,\n summary: task.summary,\n currentStep: task.currentStep,\n latestText: latestTaskText(task),\n },\n };\n}\n\nfunction summarizeAgentChatEvent(event: RunEvent): {\n kind: AgentTeamBackgroundTranscriptEvent[\"kind\"];\n message: string;\n metadata?: Record<string, unknown>;\n} | null {\n const payload = event.event;\n switch (payload.type) {\n case \"text\":\n return { kind: \"note\", message: payload.text };\n case \"activity\":\n return {\n kind: \"status\",\n message: payload.label,\n metadata: payload.tool ? { tool: payload.tool } : undefined,\n };\n case \"tool_start\":\n return {\n kind: \"status\",\n message: `Running ${payload.tool}`,\n metadata: { tool: payload.tool, input: payload.input },\n };\n case \"tool_done\":\n return {\n kind: \"artifact\",\n message: payload.result,\n metadata: { tool: payload.tool },\n };\n case \"agent_task\":\n return {\n kind: \"status\",\n message: `${payload.description} (${payload.status})`,\n metadata: {\n taskId: payload.taskId,\n threadId: payload.threadId,\n status: payload.status,\n },\n };\n case \"agent_task_update\":\n return {\n kind: \"status\",\n message: payload.preview || payload.currentStep || \"Task updated\",\n metadata: {\n taskId: payload.taskId,\n currentStep: payload.currentStep,\n },\n };\n case \"agent_task_complete\":\n return {\n kind: \"status\",\n message: payload.summary,\n metadata: { taskId: payload.taskId },\n };\n case \"error\":\n return {\n kind: \"status\",\n message: payload.error,\n metadata: {\n errorCode: payload.errorCode,\n upgradeUrl: payload.upgradeUrl,\n },\n };\n case \"missing_api_key\":\n return {\n kind: \"status\",\n message: \"Missing API key\",\n };\n case \"done\":\n return { kind: \"status\", message: \"Run completed\" };\n case \"loop_limit\":\n return { kind: \"status\", message: \"Run stopped at the loop limit\" };\n case \"auto_continue\":\n return {\n kind: \"status\",\n message: \"Run reached its continuation boundary\",\n metadata: { reason: payload.reason },\n };\n case \"clear\":\n return null;\n case \"agent_call\":\n return {\n kind: \"status\",\n message: `${payload.agent} ${payload.status}`,\n metadata: { agent: payload.agent, status: payload.status },\n };\n case \"agent_call_text\":\n return {\n kind: \"note\",\n message: payload.text,\n metadata: { agent: payload.agent },\n };\n default:\n return null;\n }\n}\n\nexport function toAgentTaskBackgroundTranscriptEvent(\n runId: string,\n event: RunEvent,\n): AgentTeamBackgroundTranscriptEvent | null {\n const summary = summarizeAgentChatEvent(event);\n if (!summary) return null;\n return {\n schemaVersion: 1,\n id: `${runId}:${event.seq}`,\n runId,\n kind: summary.kind,\n source: \"hosted-agent-team\",\n sourceRecord: {\n type: \"agent-team-run-event\",\n id: `${runId}:${event.seq}`,\n seq: event.seq,\n },\n message: summary.message,\n createdAt: new Date().toISOString(),\n metadata: summary.metadata,\n };\n}\n\nexport interface SpawnTaskOptions {\n /** Description of what the sub-agent should do */\n description: string;\n /** Additional instructions scoped to this sub-agent */\n instructions?: string;\n /** Model to use (e.g. \"claude-haiku-4-5\"). Uses default if omitted */\n model?: string;\n /** The owner email for thread creation */\n ownerEmail: string;\n /** The system prompt base for the sub-agent */\n systemPrompt: string;\n /** Available actions for the sub-agent */\n actions: Record<string, ActionEntry>;\n /** Agent engine to use. Falls back to creating an Anthropic engine with apiKey. */\n engine?: AgentEngine;\n /** API key for Anthropic (used only if engine is not provided) */\n apiKey?: string;\n /** Callback to emit events to the parent chat stream */\n parentSend: (event: AgentChatEvent) => void;\n /** Parent thread ID — used to auto-respond when the sub-agent finishes */\n parentThreadId?: string;\n}\n\n/**\n * Spawn a sub-agent task. Creates a thread, starts a background agent run,\n * and emits agent_task events to the parent chat stream.\n */\nexport async function spawnTask(opts: SpawnTaskOptions): Promise<AgentTask> {\n const taskId = generateTaskId();\n\n // Create a dedicated thread for the sub-agent with the task as the first message\n const thread = await createThread(opts.ownerEmail, {\n title: opts.description.slice(0, 100),\n });\n\n // Save the initial user message to thread data so the tab shows content\n // immediately. Shape must match assistant-ui's ExportedMessageRepository —\n // each entry carries an explicit `parentId` so the runtime threads messages\n // into a linked list; without it, later assistant messages render as\n // orphaned siblings and only the one under `headId` is shown.\n const userMsgId = `msg-${taskId}-user`;\n try {\n const { updateThreadData } = await import(\"../chat-threads/store.js\");\n const threadData = JSON.stringify({\n headId: userMsgId,\n messages: [\n {\n message: {\n id: userMsgId,\n role: \"user\",\n content: [{ type: \"text\", text: opts.description }],\n metadata: {},\n },\n parentId: null,\n },\n ],\n });\n await updateThreadData(\n thread.id,\n threadData,\n opts.description.slice(0, 100),\n opts.description.slice(0, 200),\n 1,\n );\n } catch {\n // Best effort — thread will still work without persisted messages\n }\n\n const task: AgentTask = {\n taskId,\n threadId: thread.id,\n description: opts.description,\n status: \"running\",\n preview: \"\",\n summary: \"\",\n currentStep: \"\",\n createdAt: Date.now(),\n };\n\n await saveTask(task);\n\n // Notify parent chat that a sub-agent was spawned\n opts.parentSend({\n type: \"agent_task\",\n taskId,\n threadId: thread.id,\n description: opts.description,\n status: \"running\",\n });\n\n // Build scoped system prompt\n // Prepend a clear \"you are a sub-agent\" reminder so the agent doesn't\n // start exploring the file system or database before using its actions.\n const actionNames = Object.keys(opts.actions).join(\", \");\n const subAgentPreamble = `## You Are a Sub-Agent\n\nYou are a focused sub-agent with a specific task. You have been given a curated set of actions that connect directly to the app's database and services.\n\n**Start immediately with your task. Do NOT:**\n- Run \\`db-schema\\` to explore the database structure\n- Run \\`bash\\` just to search/list files\n- Try to \\`curl\\` or access external URLs to find the app\n- Use \\`bash\\` for exploration — only for running \\`pnpm action\\` commands when no direct action exists\n\n**Your available actions (${actionNames}) work directly. Use them.**\n\n`;\n let systemPrompt = subAgentPreamble + opts.systemPrompt;\n if (opts.instructions) {\n systemPrompt += `\\n\\n## Task-Specific Instructions\\n\\n${opts.instructions}`;\n }\n\n // Resolve the engine — prefer the passed engine, fall back to Anthropic with apiKey\n const engine: AgentEngine =\n opts.engine ?? createAnthropicEngine({ apiKey: opts.apiKey });\n const model = opts.model ?? engine.defaultModel;\n\n // Build tools from actions using the normalized EngineTool format\n const messageAwareActions = createMessageAwareActions(taskId, opts.actions);\n const tools = actionsToEngineTools(messageAwareActions);\n\n const messages: EngineMessage[] = [\n { role: \"user\", content: [{ type: \"text\", text: opts.description }] },\n ];\n\n // Start the agent run in background\n const runId = `run-task-${taskId}`;\n let accumulatedText = \"\";\n let lastPreviewSent = 0;\n const PREVIEW_INTERVAL_MS = 300; // Throttle preview updates to every 300ms\n // Gate to prevent sendPreviewUpdate from overwriting terminal status\n let runFinished = false;\n\n startRun(\n runId,\n thread.id,\n async (send, signal) => {\n const sendPreviewUpdate = async (force = false) => {\n if (runFinished) return; // Don't overwrite completed/errored status\n const now = Date.now();\n if (!force && now - lastPreviewSent < PREVIEW_INTERVAL_MS) return;\n lastPreviewSent = now;\n task.preview = accumulatedText.slice(-800);\n // Persist to SQL so status checks from other processes see live state\n await saveTask(task);\n opts.parentSend({\n type: \"agent_task_update\",\n taskId,\n preview: task.preview,\n currentStep: task.currentStep,\n });\n };\n\n // Wrap the send function to also emit preview updates to parent\n const wrappedSend = (event: AgentChatEvent) => {\n send(event);\n\n if (event.type === \"text\") {\n accumulatedText += event.text;\n sendPreviewUpdate();\n } else if (event.type === \"tool_start\") {\n task.currentStep = `Running ${event.tool}...`;\n sendPreviewUpdate(true);\n } else if (event.type === \"tool_done\") {\n task.currentStep = \"\";\n sendPreviewUpdate(true);\n }\n };\n\n await runAgentLoop({\n engine,\n model,\n systemPrompt,\n tools,\n messages,\n actions: messageAwareActions,\n send: wrappedSend,\n signal,\n finalResponseGuard: createTaskMessageFinalGuard(taskId),\n });\n },\n // onComplete callback — called when the run finishes (success or error)\n async (run) => {\n // Prevent any in-flight sendPreviewUpdate from overwriting terminal status\n runFinished = true;\n\n if (run.status === \"errored\") {\n task.status = \"errored\";\n task.summary = accumulatedText.slice(-500) || \"Task failed.\";\n await saveTask(task);\n // Emit error as agent_task_complete with errored status\n opts.parentSend({\n type: \"agent_task\",\n taskId,\n threadId: thread.id,\n description: task.description,\n status: \"errored\",\n });\n } else {\n task.status = \"completed\";\n task.summary =\n accumulatedText.slice(-1000) || \"Task completed successfully.\";\n await saveTask(task);\n opts.parentSend({\n type: \"agent_task_complete\",\n taskId,\n summary: task.summary,\n });\n }\n\n // Persist the full conversation to threadData so the sub-agent tab\n // can restore it later (after the in-memory run is cleaned up).\n // Rebuild from run.events via buildAssistantMessage so partial text\n // streamed in an interrupted final iteration is preserved — the\n // EngineMessage[] array only picks up a turn after runAgentLoop\n // finishes pushing, so an aborted mid-stream would otherwise be lost.\n try {\n const { updateThreadData } = await import(\"../chat-threads/store.js\");\n const userMsg = {\n id: `msg-${taskId}-user`,\n role: \"user\" as const,\n content: [{ type: \"text\", text: opts.description }],\n metadata: {},\n };\n const assistantMsg = buildAssistantMessage(\n run.events ?? [],\n `task-${taskId}`,\n );\n // Chain assistant → user via parentId so assistant-ui renders them\n // as a linked conversation, not orphaned siblings. headId points to\n // the leaf (assistant if present, otherwise the user message).\n const messages: Array<{\n message: Record<string, unknown>;\n parentId: string | null;\n }> = [{ message: userMsg, parentId: null }];\n if (assistantMsg) {\n messages.push({\n message: {\n ...assistantMsg,\n status: { type: \"complete\", reason: \"stop\" },\n },\n parentId: userMsg.id,\n });\n }\n const headId = assistantMsg?.id ?? (userMsg.id as string | undefined);\n const repo = { headId, messages };\n\n const title = opts.description.slice(0, 100);\n const preview = accumulatedText.slice(0, 200);\n await updateThreadData(\n thread.id,\n JSON.stringify(repo),\n title,\n preview,\n repo.messages.length,\n );\n } catch {\n // Best effort — the in-memory replay path still works\n }\n\n // ─── Auto-follow-up on parent thread ────────────────────────────\n // When the sub-agent finishes, start a short agent run on the\n // parent thread so the user sees a recap without having to scroll\n // up or manually check the sub-agent card.\n if (opts.parentThreadId) {\n try {\n const { getActiveRunForThread } =\n await import(\"../agent/run-manager.js\");\n // Only auto-respond if the parent thread is idle — don't\n // interrupt an ongoing conversation.\n const activeRun = getActiveRunForThread(opts.parentThreadId);\n if (!activeRun || activeRun.status !== \"running\") {\n const followUpEngine =\n opts.engine ?? createAnthropicEngine({ apiKey: opts.apiKey });\n const followUpModel = opts.model ?? followUpEngine.defaultModel;\n\n const statusEmoji = task.status === \"errored\" ? \"!\" : \"done\";\n const notification =\n `[Sub-agent ${statusEmoji}] The sub-agent task \"${task.description}\" has ${task.status === \"errored\" ? \"failed\" : \"completed\"}.\\n\\n` +\n `Summary of what it did:\\n${task.summary}\\n\\n` +\n `Briefly let the user know the sub-agent finished and highlight any key results. Be concise — 1-2 sentences.`;\n\n const followUpRunId = `run-followup-${taskId}`;\n startRun(\n followUpRunId,\n opts.parentThreadId,\n async (send, signal) => {\n await runAgentLoop({\n engine: followUpEngine,\n model: followUpModel,\n systemPrompt: opts.systemPrompt,\n tools: [], // No tools needed for a recap\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: notification }],\n },\n ],\n actions: {},\n send,\n signal,\n });\n },\n );\n }\n } catch {\n // Best effort — don't break the sub-agent completion\n }\n }\n },\n );\n\n return task;\n}\n\n/** Get task by ID */\nexport async function getTask(taskId: string): Promise<AgentTask | undefined> {\n const task = await loadTask(taskId);\n return task ?? undefined;\n}\n\n/** Get task by thread ID */\nexport async function getTaskByThread(\n threadId: string,\n): Promise<AgentTask | undefined> {\n const task = await loadTaskByThread(threadId);\n return task ?? undefined;\n}\n\n/** List all tasks (most recent first) */\nexport async function listTasks(): Promise<AgentTask[]> {\n const entries = await listAppState(TASK_PREFIX);\n const tasks = entries.map((e) => e.value as unknown as AgentTask);\n return tasks.sort((a, b) => b.createdAt - a.createdAt);\n}\n\nexport async function listAgentTeamBackgroundRuns(): Promise<\n AgentTeamBackgroundRun[]\n> {\n return (await listTasks()).map(toAgentTaskBackgroundRun);\n}\n\nexport async function getAgentTeamBackgroundRun(\n runId: string,\n): Promise<AgentTeamBackgroundRun | null> {\n const task = await loadTask(taskIdFromBackgroundRunId(runId));\n return task ? toAgentTaskBackgroundRun(task) : null;\n}\n\nexport async function listAgentTeamBackgroundTranscriptEvents(\n runId: string,\n): Promise<AgentTeamBackgroundTranscriptEvent[]> {\n const normalizedRunId = taskRunId(taskIdFromBackgroundRunId(runId));\n const activeRun = getRun(normalizedRunId);\n const events = activeRun\n ? activeRun.events\n : await getPersistedRunEvents(normalizedRunId);\n\n return events\n .map((event) =>\n toAgentTaskBackgroundTranscriptEvent(normalizedRunId, event),\n )\n .filter((event): event is AgentTeamBackgroundTranscriptEvent =>\n Boolean(event),\n );\n}\n\nexport function subscribeToAgentTeamBackgroundRun(\n runId: string,\n fromSeq = 0,\n): ReadableStream<Uint8Array> | null {\n return subscribeToRun(taskRunId(taskIdFromBackgroundRunId(runId)), fromSeq);\n}\n\nasync function getPersistedRunEvents(runId: string): Promise<RunEvent[]> {\n const rows = await getRunEventsSince(runId, 0);\n return rows\n .map((row): RunEvent | null => {\n try {\n return {\n seq: row.seq,\n event: JSON.parse(row.eventData) as RunEvent[\"event\"],\n };\n } catch {\n return null;\n }\n })\n .filter((event): event is RunEvent => Boolean(event));\n}\n\n/** Send a message/update to a running sub-agent via application state */\nexport async function sendToTask(\n taskId: string,\n message: string,\n): Promise<{\n ok: boolean;\n error?: string;\n messageId?: string;\n queuedCount?: number;\n}> {\n const task = await loadTask(taskId);\n if (!task) return { ok: false, error: \"Task not found\" };\n if (task.status !== \"running\")\n return { ok: false, error: \"Task is not running\" };\n if (message.trim().length === 0)\n return { ok: false, error: \"Message is required\" };\n\n // Append to a durable per-task queue. Running sub-agents drain this queue\n // after tool batches and immediately before a final response. This does not\n // interrupt an in-flight model stream or tool call; it guarantees the next\n // safe continuation sees the update.\n try {\n const queued = await appendQueuedTaskMessage(taskId, message);\n return { ok: true, ...queued };\n } catch {\n const sessionId = getRequestUserEmail();\n if (!sessionId) return { ok: false, error: \"no authenticated user\" };\n return { ok: false, error: \"Unable to queue message\" };\n }\n}\n\nexport async function sendToAgentTeamBackgroundRun(\n runId: string,\n message: string,\n): Promise<SendToAgentTeamBackgroundRunResult> {\n return sendToTask(taskIdFromBackgroundRunId(runId), message);\n}\n\nasync function sendAgentTeamBackgroundAgentFollowUp(\n input: BackgroundAgentFollowUpInput,\n): Promise<BackgroundAgentControlResult> {\n const prompt = input.prompt.trim();\n if (!prompt) {\n return {\n ok: false,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n error: \"Follow-up prompt is required.\",\n };\n }\n\n const result = await sendToAgentTeamBackgroundRun(input.runId, prompt);\n return {\n ok: result.ok,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n queued: result.ok,\n message: result.ok\n ? \"Follow-up queued for the Agent Teams background run.\"\n : undefined,\n error: result.error,\n };\n}\n\nasync function controlAgentTeamBackgroundAgentRun(\n input: BackgroundAgentControlInput,\n): Promise<BackgroundAgentControlResult> {\n if (input.command !== \"stop\") {\n return {\n ok: false,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n error:\n \"Agent Teams background runs currently support stop through the shared controller.\",\n };\n }\n\n const result = await stopAgentTeamBackgroundRun(input.runId);\n return {\n ok: result.ok,\n runId: input.runId,\n run: await getAgentTeamBackgroundRun(input.runId),\n message: result.ok ? \"Agent Teams background run stopped.\" : undefined,\n error: result.error,\n };\n}\n\nexport async function stopAgentTeamBackgroundRun(\n runId: string,\n reason = \"user\",\n): Promise<ControlAgentTeamBackgroundRunResult> {\n const taskId = taskIdFromBackgroundRunId(runId);\n const task = await loadTask(taskId);\n if (!task) return { ok: false, error: \"Task not found\" };\n if (task.status !== \"running\") {\n return { ok: false, error: \"Task is not running\" };\n }\n\n abortRun(taskRunId(taskId), reason);\n task.status = \"errored\";\n task.summary =\n reason === \"user\" ? \"Task stopped.\" : `Task stopped: ${reason}`;\n await saveTask(task);\n return { ok: true };\n}\n\n/** Mark a task as errored */\nexport async function markTaskErrored(\n taskId: string,\n error: string,\n): Promise<void> {\n const task = await loadTask(taskId);\n if (task) {\n task.status = \"errored\";\n task.summary = error;\n await saveTask(task);\n }\n}\n\nexport const _agentTeamsQueueForTests = {\n createMessageAwareActions,\n createTaskMessageFinalGuard,\n drainQueuedTaskMessages,\n formatQueuedTaskMessages,\n};\n"]}
|
|
@@ -29,7 +29,7 @@ export interface Skill {
|
|
|
29
29
|
/**
|
|
30
30
|
* Filesystem path to the skill directory, relative to the template root
|
|
31
31
|
* (e.g. `.agents/skills/create-deck`). The agent can read any file here via
|
|
32
|
-
*
|
|
32
|
+
* bash in dev — skills are folders, not single files, and may contain
|
|
33
33
|
* supporting assets, scripts, or additional markdown.
|
|
34
34
|
*/
|
|
35
35
|
dir: string;
|
|
@@ -104,9 +104,9 @@ export declare function loadAgentsBundle(): Promise<AgentsBundle>;
|
|
|
104
104
|
* file plus any number of supporting files (additional markdown, examples,
|
|
105
105
|
* images, scripts). This block lists what's available and how to read them.
|
|
106
106
|
*
|
|
107
|
-
* In dev mode the agent has
|
|
107
|
+
* In dev mode the agent has bash access and reads skills via `cat` — exactly
|
|
108
108
|
* like running `claude` locally in the repo. In production mode the agent has
|
|
109
|
-
* no
|
|
109
|
+
* no bash; templates that need skill content at runtime should inline the
|
|
110
110
|
* critical parts directly in `AGENTS.md`.
|
|
111
111
|
*/
|
|
112
112
|
export declare function generateSkillsPromptBlock(bundle: AgentsBundle): string;
|
|
@@ -242,9 +242,9 @@ export async function loadAgentsBundle() {
|
|
|
242
242
|
* file plus any number of supporting files (additional markdown, examples,
|
|
243
243
|
* images, scripts). This block lists what's available and how to read them.
|
|
244
244
|
*
|
|
245
|
-
* In dev mode the agent has
|
|
245
|
+
* In dev mode the agent has bash access and reads skills via `cat` — exactly
|
|
246
246
|
* like running `claude` locally in the repo. In production mode the agent has
|
|
247
|
-
* no
|
|
247
|
+
* no bash; templates that need skill content at runtime should inline the
|
|
248
248
|
* critical parts directly in `AGENTS.md`.
|
|
249
249
|
*/
|
|
250
250
|
export function generateSkillsPromptBlock(bundle) {
|
|
@@ -260,9 +260,9 @@ export function generateSkillsPromptBlock(bundle) {
|
|
|
260
260
|
return `<skills>
|
|
261
261
|
The following skills live in the repo at \`.agents/skills/<name>/\`. Each skill is a folder containing a \`SKILL.md\` entry file and sometimes supporting files. Read a skill BEFORE starting a task it applies to.
|
|
262
262
|
|
|
263
|
-
To read a skill in dev mode (when you have
|
|
264
|
-
\`
|
|
265
|
-
\`
|
|
263
|
+
To read a skill in dev mode (when you have bash access):
|
|
264
|
+
\`bash(command="cat .agents/skills/<name>/SKILL.md")\`
|
|
265
|
+
\`bash(command="ls .agents/skills/<name>/")\` to see all files in the folder
|
|
266
266
|
|
|
267
267
|
Available skills:
|
|
268
268
|
${lines.join("\n")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-bundle.js","sourceRoot":"","sources":["../../src/server/agents-bundle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agents bundle — loads AGENTS.md and .agents/skills/ from the template.\n *\n * This is the single source of truth the framework's agent uses to mirror what\n * Claude Code / Codex / any other agent would see when running locally in the\n * repo. The filesystem is the canonical source; this module is just a loader\n * that works both in dev (direct fs read) and production (content bundled at\n * build time via the `virtual:agents-bundle` Vite plugin).\n *\n * Resolution order inside `loadAgentsBundle()`:\n * 1. Virtual module (`virtual:agents-bundle`) — inlined at build time by the\n * framework's Vite plugin. This is the ONLY path that works on edge\n * runtimes (Cloudflare Workers) where `readFileSync` doesn't exist.\n * 2. Filesystem fallback — `process.cwd()/AGENTS.md` +\n * `process.cwd()/.agents/skills/`. Only reliable in local dev and Node\n * production (`agent-native start`); not on Netlify/Vercel/CF at runtime.\n * 3. Empty bundle — everything silently returns empty strings.\n *\n * Result is cached in module scope so it's only computed once per cold start.\n */\n\nexport interface SkillMeta {\n name: string;\n description: string;\n}\n\nexport interface Skill {\n meta: SkillMeta;\n /** Contents of SKILL.md (the entry file of the skill). */\n content: string;\n /**\n * Filesystem path to the skill directory, relative to the template root\n * (e.g. `.agents/skills/create-deck`). The agent can read any file here via\n * shell in dev — skills are folders, not single files, and may contain\n * supporting assets, scripts, or additional markdown.\n */\n dir: string;\n /**\n * Files inside the skill directory (relative to the skill dir), excluding\n * `SKILL.md`. Lets the agent know what else is available without a separate\n * `ls` call. Empty array if the skill is single-file.\n */\n extraFiles: string[];\n}\n\nexport interface AgentsBundle {\n /** Contents of the template's AGENTS.md (empty string if missing). */\n agentsMd: string;\n /**\n * Contents of the workspace core's AGENTS.md, if the app is inside an\n * enterprise monorepo with a `workspaceCore` configured. Empty string\n * otherwise. Sits between the framework system prompt and the template's\n * AGENTS.md in the instruction stack.\n */\n workspaceAgentsMd?: string;\n /**\n * Map from skill name → skill content. Contains skills merged from the\n * workspace core layer (if present) and the template layer. On name\n * collision, the template's version wins so apps can override a shared\n * enterprise skill by dropping a same-named file under\n * `.agents/skills/<name>/`.\n */\n skills: Record<string, Skill>;\n}\n\nconst EMPTY: AgentsBundle = { agentsMd: \"\", workspaceAgentsMd: \"\", skills: {} };\n\nlet cached: AgentsBundle | null = null;\n\n/**\n * Parse the YAML frontmatter at the top of a skill file.\n * Only pulls out `name` and `description` — deliberately simple, no YAML lib.\n * Handles:\n * - Inline: `description: Some text`\n * - Folded scalar: `description: >-\\n multi\\n line` → \"multi line\"\n * - Literal scalar: `description: |\\n multi\\n line` → \"multi\\nline\"\n */\nexport function parseSkillFrontmatter(content: string): Partial<SkillMeta> {\n const match = content.match(/^---\\r?\\n([\\s\\S]+?)\\r?\\n---/);\n if (!match) return {};\n const lines = match[1].split(/\\r?\\n/);\n const result: Partial<SkillMeta> = {};\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const keyMatch = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):\\s*(.*)$/);\n if (!keyMatch) continue;\n const [, key, valueRaw] = keyMatch;\n const trimmed = valueRaw.trim();\n\n const isFolded = trimmed === \">\" || trimmed === \">-\";\n const isLiteral = trimmed === \"|\" || trimmed === \"|-\";\n\n let value: string;\n if (isFolded || isLiteral) {\n // Collect subsequent indented lines (at least one leading space).\n const block: string[] = [];\n let j = i + 1;\n while (j < lines.length) {\n const next = lines[j];\n if (next.length === 0) {\n block.push(\"\");\n j++;\n continue;\n }\n if (!/^\\s/.test(next)) break;\n block.push(next.replace(/^\\s+/, \"\"));\n j++;\n }\n // Trim trailing blank lines\n while (block.length > 0 && block[block.length - 1] === \"\") block.pop();\n value = isFolded\n ? block.filter((l) => l !== \"\").join(\" \")\n : block.join(\"\\n\");\n i = j - 1;\n } else {\n value = trimmed;\n }\n\n if (key === \"name\" && value) result.name = value;\n else if (key === \"description\" && value) result.description = value;\n }\n\n return result;\n}\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Paths to a workspace-core's agent resources, for merging into a template's\n * bundle. All fields optional — pass null for any missing piece.\n */\nexport interface WorkspaceAgentsSource {\n /** Absolute path to the workspace core's skills/ directory. */\n skillsDir: string | null;\n /** Absolute path to the workspace core's AGENTS.md. */\n agentsMdPath: string | null;\n /** Root dir (used to compute `dir` paths for workspace-core skills). */\n rootDir: string;\n}\n\n/**\n * Read one skills directory into a `Record<string, Skill>`. Extracted so\n * both the template and workspace-core paths can reuse it. `dirPrefix` is\n * the display path that will be reported to the agent (e.g.\n * `.agents/skills/<name>` for templates, or\n * `<workspace-shared-package>/.agents/skills/<name>` for the workspace layer).\n */\nfunction readSkillsDir(\n skillsDir: string,\n rootForRelative: string,\n out: Record<string, Skill>,\n skipExistingNames: boolean,\n): void {\n if (!fs.existsSync(skillsDir)) return;\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const skillDirAbs = path.join(skillsDir, entry.name);\n const skillFile = path.join(skillDirAbs, \"SKILL.md\");\n try {\n const realSkillFile = fs.realpathSync(skillFile);\n if (!fs.existsSync(realSkillFile)) continue;\n const content = fs.readFileSync(realSkillFile, \"utf-8\");\n const meta = parseSkillFrontmatter(content);\n const name = meta.name ?? entry.name;\n if (skipExistingNames && out[name]) continue; // Template wins\n\n const extraFiles: string[] = [];\n try {\n const walk = (subdir: string, prefix: string) => {\n for (const e of fs.readdirSync(subdir, { withFileTypes: true })) {\n const abs = path.join(subdir, e.name);\n const rel = prefix ? `${prefix}/${e.name}` : e.name;\n if (e.isDirectory() || e.isSymbolicLink()) {\n try {\n const stat = fs.statSync(abs);\n if (stat.isDirectory()) walk(abs, rel);\n } catch {}\n } else if (e.isFile() && e.name !== \"SKILL.md\") {\n extraFiles.push(rel);\n }\n }\n };\n walk(skillDirAbs, \"\");\n } catch {}\n extraFiles.sort();\n\n out[name] = {\n meta: { name, description: meta.description ?? \"\" },\n content,\n dir: path.relative(rootForRelative, skillDirAbs).replace(/\\\\/g, \"/\"),\n extraFiles,\n };\n } catch {\n // Skip unreadable skills\n }\n }\n}\n\n/**\n * Read AGENTS.md + all skills directly from the filesystem rooted at `cwd`.\n * Optionally also reads a workspace-core's AGENTS.md and skills directory\n * and merges them in (template wins on name collisions). Used by both the\n * Vite plugin (at build time) and the runtime fallback (in dev / Node prod).\n *\n * Synchronous — the Vite plugin's load hook calls it inline during the build.\n */\nexport function readAgentsBundleFromFs(\n cwd: string,\n workspaceSource: WorkspaceAgentsSource | null = null,\n): AgentsBundle {\n let agentsMd = \"\";\n try {\n const agentsMdPath = path.join(cwd, \"AGENTS.md\");\n if (fs.existsSync(agentsMdPath)) {\n agentsMd = fs.readFileSync(agentsMdPath, \"utf-8\");\n }\n } catch {}\n\n let workspaceAgentsMd = \"\";\n if (workspaceSource?.agentsMdPath) {\n try {\n if (fs.existsSync(workspaceSource.agentsMdPath)) {\n workspaceAgentsMd = fs.readFileSync(\n workspaceSource.agentsMdPath,\n \"utf-8\",\n );\n }\n } catch {}\n }\n\n // Merge skills: template first (so its entries are authoritative), then\n // workspace-core with skipExistingNames=true so same-named skills don't\n // overwrite the template's.\n const skills: Record<string, Skill> = {};\n try {\n const skillsDir = path.join(cwd, \".agents\", \"skills\");\n readSkillsDir(skillsDir, cwd, skills, false);\n } catch {}\n\n if (workspaceSource?.skillsDir) {\n try {\n readSkillsDir(\n workspaceSource.skillsDir,\n workspaceSource.rootDir,\n skills,\n true,\n );\n } catch {}\n }\n\n return { agentsMd, workspaceAgentsMd, skills };\n}\n\n/**\n * Load the agents bundle. Returns a cached result on subsequent calls.\n * Tries the virtual module first (works everywhere, including edge), then\n * falls back to filesystem reads from `process.cwd()` — which, when a\n * workspace core is present, also merges in the workspace core's skills\n * and AGENTS.md.\n */\nexport async function loadAgentsBundle(): Promise<AgentsBundle> {\n if (cached) return cached;\n\n // 1. Try the Vite-emitted virtual module. This is the path that works on\n // every deployment target because the content is inlined at build time.\n // The Vite plugin itself is responsible for merging workspace-core\n // content into the bundle it emits.\n try {\n // @ts-expect-error — virtual module is resolved at build time by our\n // Vite plugin; nothing exists at this path on disk.\n const mod = await import(\"virtual:agents-bundle\");\n if (mod && mod.default) {\n cached = mod.default as AgentsBundle;\n return cached;\n }\n } catch {\n // Virtual module not available — fall through to filesystem.\n }\n\n // 2. Filesystem fallback — works in dev / Node prod. If a workspace core\n // is present in the ancestor chain, merge its skills + AGENTS.md in.\n try {\n let workspaceSource: WorkspaceAgentsSource | null = null;\n try {\n const { getWorkspaceCoreExports } =\n await import(\"../deploy/workspace-core.js\");\n const ws = await getWorkspaceCoreExports(process.cwd());\n if (ws) {\n workspaceSource = {\n skillsDir: ws.skillsDir,\n agentsMdPath: ws.agentsMdPath,\n rootDir: ws.packageDir,\n };\n }\n } catch {\n // workspace-core discovery isn't available (e.g. edge runtime).\n }\n cached = readAgentsBundleFromFs(process.cwd(), workspaceSource);\n return cached;\n } catch {\n cached = EMPTY;\n return cached;\n }\n}\n\n/**\n * Generate the `<skills>` block to inject into the system prompt.\n *\n * Skills are folders at `.agents/skills/<name>/` containing a `SKILL.md` entry\n * file plus any number of supporting files (additional markdown, examples,\n * images, scripts). This block lists what's available and how to read them.\n *\n * In dev mode the agent has shell access and reads skills via `cat` — exactly\n * like running `claude` locally in the repo. In production mode the agent has\n * no shell; templates that need skill content at runtime should inline the\n * critical parts directly in `AGENTS.md`.\n */\nexport function generateSkillsPromptBlock(bundle: AgentsBundle): string {\n const entries = Object.values(bundle.skills);\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((s) => {\n const extras =\n s.extraFiles.length > 0\n ? ` (also contains: ${s.extraFiles.join(\", \")})`\n : \"\";\n return `- \\`${s.meta.name}\\` at \\`${s.dir}/\\` — ${s.meta.description || \"(no description)\"}${extras}`;\n });\n\n return `<skills>\nThe following skills live in the repo at \\`.agents/skills/<name>/\\`. Each skill is a folder containing a \\`SKILL.md\\` entry file and sometimes supporting files. Read a skill BEFORE starting a task it applies to.\n\nTo read a skill in dev mode (when you have shell access):\n \\`shell(command=\"cat .agents/skills/<name>/SKILL.md\")\\`\n \\`shell(command=\"ls .agents/skills/<name>/\")\\` to see all files in the folder\n\nAvailable skills:\n${lines.join(\"\\n\")}\n</skills>`;\n}\n\n/** For tests — reset the module cache. */\nexport function __resetAgentsBundleCache(): void {\n cached = null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agents-bundle.js","sourceRoot":"","sources":["../../src/server/agents-bundle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agents bundle — loads AGENTS.md and .agents/skills/ from the template.\n *\n * This is the single source of truth the framework's agent uses to mirror what\n * Claude Code / Codex / any other agent would see when running locally in the\n * repo. The filesystem is the canonical source; this module is just a loader\n * that works both in dev (direct fs read) and production (content bundled at\n * build time via the `virtual:agents-bundle` Vite plugin).\n *\n * Resolution order inside `loadAgentsBundle()`:\n * 1. Virtual module (`virtual:agents-bundle`) — inlined at build time by the\n * framework's Vite plugin. This is the ONLY path that works on edge\n * runtimes (Cloudflare Workers) where `readFileSync` doesn't exist.\n * 2. Filesystem fallback — `process.cwd()/AGENTS.md` +\n * `process.cwd()/.agents/skills/`. Only reliable in local dev and Node\n * production (`agent-native start`); not on Netlify/Vercel/CF at runtime.\n * 3. Empty bundle — everything silently returns empty strings.\n *\n * Result is cached in module scope so it's only computed once per cold start.\n */\n\nexport interface SkillMeta {\n name: string;\n description: string;\n}\n\nexport interface Skill {\n meta: SkillMeta;\n /** Contents of SKILL.md (the entry file of the skill). */\n content: string;\n /**\n * Filesystem path to the skill directory, relative to the template root\n * (e.g. `.agents/skills/create-deck`). The agent can read any file here via\n * bash in dev — skills are folders, not single files, and may contain\n * supporting assets, scripts, or additional markdown.\n */\n dir: string;\n /**\n * Files inside the skill directory (relative to the skill dir), excluding\n * `SKILL.md`. Lets the agent know what else is available without a separate\n * `ls` call. Empty array if the skill is single-file.\n */\n extraFiles: string[];\n}\n\nexport interface AgentsBundle {\n /** Contents of the template's AGENTS.md (empty string if missing). */\n agentsMd: string;\n /**\n * Contents of the workspace core's AGENTS.md, if the app is inside an\n * enterprise monorepo with a `workspaceCore` configured. Empty string\n * otherwise. Sits between the framework system prompt and the template's\n * AGENTS.md in the instruction stack.\n */\n workspaceAgentsMd?: string;\n /**\n * Map from skill name → skill content. Contains skills merged from the\n * workspace core layer (if present) and the template layer. On name\n * collision, the template's version wins so apps can override a shared\n * enterprise skill by dropping a same-named file under\n * `.agents/skills/<name>/`.\n */\n skills: Record<string, Skill>;\n}\n\nconst EMPTY: AgentsBundle = { agentsMd: \"\", workspaceAgentsMd: \"\", skills: {} };\n\nlet cached: AgentsBundle | null = null;\n\n/**\n * Parse the YAML frontmatter at the top of a skill file.\n * Only pulls out `name` and `description` — deliberately simple, no YAML lib.\n * Handles:\n * - Inline: `description: Some text`\n * - Folded scalar: `description: >-\\n multi\\n line` → \"multi line\"\n * - Literal scalar: `description: |\\n multi\\n line` → \"multi\\nline\"\n */\nexport function parseSkillFrontmatter(content: string): Partial<SkillMeta> {\n const match = content.match(/^---\\r?\\n([\\s\\S]+?)\\r?\\n---/);\n if (!match) return {};\n const lines = match[1].split(/\\r?\\n/);\n const result: Partial<SkillMeta> = {};\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const keyMatch = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):\\s*(.*)$/);\n if (!keyMatch) continue;\n const [, key, valueRaw] = keyMatch;\n const trimmed = valueRaw.trim();\n\n const isFolded = trimmed === \">\" || trimmed === \">-\";\n const isLiteral = trimmed === \"|\" || trimmed === \"|-\";\n\n let value: string;\n if (isFolded || isLiteral) {\n // Collect subsequent indented lines (at least one leading space).\n const block: string[] = [];\n let j = i + 1;\n while (j < lines.length) {\n const next = lines[j];\n if (next.length === 0) {\n block.push(\"\");\n j++;\n continue;\n }\n if (!/^\\s/.test(next)) break;\n block.push(next.replace(/^\\s+/, \"\"));\n j++;\n }\n // Trim trailing blank lines\n while (block.length > 0 && block[block.length - 1] === \"\") block.pop();\n value = isFolded\n ? block.filter((l) => l !== \"\").join(\" \")\n : block.join(\"\\n\");\n i = j - 1;\n } else {\n value = trimmed;\n }\n\n if (key === \"name\" && value) result.name = value;\n else if (key === \"description\" && value) result.description = value;\n }\n\n return result;\n}\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Paths to a workspace-core's agent resources, for merging into a template's\n * bundle. All fields optional — pass null for any missing piece.\n */\nexport interface WorkspaceAgentsSource {\n /** Absolute path to the workspace core's skills/ directory. */\n skillsDir: string | null;\n /** Absolute path to the workspace core's AGENTS.md. */\n agentsMdPath: string | null;\n /** Root dir (used to compute `dir` paths for workspace-core skills). */\n rootDir: string;\n}\n\n/**\n * Read one skills directory into a `Record<string, Skill>`. Extracted so\n * both the template and workspace-core paths can reuse it. `dirPrefix` is\n * the display path that will be reported to the agent (e.g.\n * `.agents/skills/<name>` for templates, or\n * `<workspace-shared-package>/.agents/skills/<name>` for the workspace layer).\n */\nfunction readSkillsDir(\n skillsDir: string,\n rootForRelative: string,\n out: Record<string, Skill>,\n skipExistingNames: boolean,\n): void {\n if (!fs.existsSync(skillsDir)) return;\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const skillDirAbs = path.join(skillsDir, entry.name);\n const skillFile = path.join(skillDirAbs, \"SKILL.md\");\n try {\n const realSkillFile = fs.realpathSync(skillFile);\n if (!fs.existsSync(realSkillFile)) continue;\n const content = fs.readFileSync(realSkillFile, \"utf-8\");\n const meta = parseSkillFrontmatter(content);\n const name = meta.name ?? entry.name;\n if (skipExistingNames && out[name]) continue; // Template wins\n\n const extraFiles: string[] = [];\n try {\n const walk = (subdir: string, prefix: string) => {\n for (const e of fs.readdirSync(subdir, { withFileTypes: true })) {\n const abs = path.join(subdir, e.name);\n const rel = prefix ? `${prefix}/${e.name}` : e.name;\n if (e.isDirectory() || e.isSymbolicLink()) {\n try {\n const stat = fs.statSync(abs);\n if (stat.isDirectory()) walk(abs, rel);\n } catch {}\n } else if (e.isFile() && e.name !== \"SKILL.md\") {\n extraFiles.push(rel);\n }\n }\n };\n walk(skillDirAbs, \"\");\n } catch {}\n extraFiles.sort();\n\n out[name] = {\n meta: { name, description: meta.description ?? \"\" },\n content,\n dir: path.relative(rootForRelative, skillDirAbs).replace(/\\\\/g, \"/\"),\n extraFiles,\n };\n } catch {\n // Skip unreadable skills\n }\n }\n}\n\n/**\n * Read AGENTS.md + all skills directly from the filesystem rooted at `cwd`.\n * Optionally also reads a workspace-core's AGENTS.md and skills directory\n * and merges them in (template wins on name collisions). Used by both the\n * Vite plugin (at build time) and the runtime fallback (in dev / Node prod).\n *\n * Synchronous — the Vite plugin's load hook calls it inline during the build.\n */\nexport function readAgentsBundleFromFs(\n cwd: string,\n workspaceSource: WorkspaceAgentsSource | null = null,\n): AgentsBundle {\n let agentsMd = \"\";\n try {\n const agentsMdPath = path.join(cwd, \"AGENTS.md\");\n if (fs.existsSync(agentsMdPath)) {\n agentsMd = fs.readFileSync(agentsMdPath, \"utf-8\");\n }\n } catch {}\n\n let workspaceAgentsMd = \"\";\n if (workspaceSource?.agentsMdPath) {\n try {\n if (fs.existsSync(workspaceSource.agentsMdPath)) {\n workspaceAgentsMd = fs.readFileSync(\n workspaceSource.agentsMdPath,\n \"utf-8\",\n );\n }\n } catch {}\n }\n\n // Merge skills: template first (so its entries are authoritative), then\n // workspace-core with skipExistingNames=true so same-named skills don't\n // overwrite the template's.\n const skills: Record<string, Skill> = {};\n try {\n const skillsDir = path.join(cwd, \".agents\", \"skills\");\n readSkillsDir(skillsDir, cwd, skills, false);\n } catch {}\n\n if (workspaceSource?.skillsDir) {\n try {\n readSkillsDir(\n workspaceSource.skillsDir,\n workspaceSource.rootDir,\n skills,\n true,\n );\n } catch {}\n }\n\n return { agentsMd, workspaceAgentsMd, skills };\n}\n\n/**\n * Load the agents bundle. Returns a cached result on subsequent calls.\n * Tries the virtual module first (works everywhere, including edge), then\n * falls back to filesystem reads from `process.cwd()` — which, when a\n * workspace core is present, also merges in the workspace core's skills\n * and AGENTS.md.\n */\nexport async function loadAgentsBundle(): Promise<AgentsBundle> {\n if (cached) return cached;\n\n // 1. Try the Vite-emitted virtual module. This is the path that works on\n // every deployment target because the content is inlined at build time.\n // The Vite plugin itself is responsible for merging workspace-core\n // content into the bundle it emits.\n try {\n // @ts-expect-error — virtual module is resolved at build time by our\n // Vite plugin; nothing exists at this path on disk.\n const mod = await import(\"virtual:agents-bundle\");\n if (mod && mod.default) {\n cached = mod.default as AgentsBundle;\n return cached;\n }\n } catch {\n // Virtual module not available — fall through to filesystem.\n }\n\n // 2. Filesystem fallback — works in dev / Node prod. If a workspace core\n // is present in the ancestor chain, merge its skills + AGENTS.md in.\n try {\n let workspaceSource: WorkspaceAgentsSource | null = null;\n try {\n const { getWorkspaceCoreExports } =\n await import(\"../deploy/workspace-core.js\");\n const ws = await getWorkspaceCoreExports(process.cwd());\n if (ws) {\n workspaceSource = {\n skillsDir: ws.skillsDir,\n agentsMdPath: ws.agentsMdPath,\n rootDir: ws.packageDir,\n };\n }\n } catch {\n // workspace-core discovery isn't available (e.g. edge runtime).\n }\n cached = readAgentsBundleFromFs(process.cwd(), workspaceSource);\n return cached;\n } catch {\n cached = EMPTY;\n return cached;\n }\n}\n\n/**\n * Generate the `<skills>` block to inject into the system prompt.\n *\n * Skills are folders at `.agents/skills/<name>/` containing a `SKILL.md` entry\n * file plus any number of supporting files (additional markdown, examples,\n * images, scripts). This block lists what's available and how to read them.\n *\n * In dev mode the agent has bash access and reads skills via `cat` — exactly\n * like running `claude` locally in the repo. In production mode the agent has\n * no bash; templates that need skill content at runtime should inline the\n * critical parts directly in `AGENTS.md`.\n */\nexport function generateSkillsPromptBlock(bundle: AgentsBundle): string {\n const entries = Object.values(bundle.skills);\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((s) => {\n const extras =\n s.extraFiles.length > 0\n ? ` (also contains: ${s.extraFiles.join(\", \")})`\n : \"\";\n return `- \\`${s.meta.name}\\` at \\`${s.dir}/\\` — ${s.meta.description || \"(no description)\"}${extras}`;\n });\n\n return `<skills>\nThe following skills live in the repo at \\`.agents/skills/<name>/\\`. Each skill is a folder containing a \\`SKILL.md\\` entry file and sometimes supporting files. Read a skill BEFORE starting a task it applies to.\n\nTo read a skill in dev mode (when you have bash access):\n \\`bash(command=\"cat .agents/skills/<name>/SKILL.md\")\\`\n \\`bash(command=\"ls .agents/skills/<name>/\")\\` to see all files in the folder\n\nAvailable skills:\n${lines.join(\"\\n\")}\n</skills>`;\n}\n\n/** For tests — reset the module cache. */\nexport function __resetAgentsBundleCache(): void {\n cached = null;\n}\n"]}
|
package/dist/server/auth.d.ts
CHANGED
|
@@ -178,6 +178,23 @@ export declare function safeReturnPath(raw: string | null | undefined): string;
|
|
|
178
178
|
* proceeds. Mirrors the rawPath/getLoginHtml resolution in the auth guard.
|
|
179
179
|
*/
|
|
180
180
|
export declare function getConfiguredLoginHtml(event: H3Event): string | null;
|
|
181
|
+
/**
|
|
182
|
+
* True only when the request originates from the local machine — the raw
|
|
183
|
+
* socket peer is `127.0.0.0/8`, `::1`, or the IPv4-mapped `::ffff:127.0.0.1`
|
|
184
|
+
* (an optional IPv6 zone id like `fe80::1%en0` is stripped first).
|
|
185
|
+
*
|
|
186
|
+
* `getRequestIP(event)` is called WITHOUT `{ xForwardedFor: true }`, so it
|
|
187
|
+
* returns the real connection peer and never an attacker-controlled
|
|
188
|
+
* `X-Forwarded-For` value — a remote client cannot spoof its way past this.
|
|
189
|
+
* Used to scope local-only conveniences (the desktop SSO broker and the dev
|
|
190
|
+
* auto-account) so a directly network-reachable dev server never exposes
|
|
191
|
+
* them to a remote visitor. NOTE: a reverse proxy / tunnel that connects to
|
|
192
|
+
* the dev server over localhost still appears as loopback, so this is a
|
|
193
|
+
* necessary but not sufficient gate — callers pair it with NODE_ENV and,
|
|
194
|
+
* for the dev account, a throwaway per-DB password.
|
|
195
|
+
*/
|
|
196
|
+
export declare function isLoopbackAddress(ip: string | undefined): boolean;
|
|
197
|
+
export declare function isExpectedAuthFailure(error: unknown): boolean;
|
|
181
198
|
/**
|
|
182
199
|
* Create a new session in the legacy sessions table.
|
|
183
200
|
* Used by google-oauth.ts for mobile deep linking.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAsChE,KAAK,KAAK,GAAG,SAAS,CAAC;AAQvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAMlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAwB5D,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"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"}
|