@agent-native/dispatch 0.7.0 → 0.8.0
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 +37 -0
- package/dist/actions/apply-dream-proposal.d.ts +3 -0
- package/dist/actions/apply-dream-proposal.d.ts.map +1 -0
- package/dist/actions/apply-dream-proposal.js +11 -0
- package/dist/actions/apply-dream-proposal.js.map +1 -0
- package/dist/actions/create-dream-report.d.ts +3 -0
- package/dist/actions/create-dream-report.d.ts.map +1 -0
- package/dist/actions/create-dream-report.js +67 -0
- package/dist/actions/create-dream-report.js.map +1 -0
- package/dist/actions/create-workspace-resource.js +3 -3
- package/dist/actions/create-workspace-resource.js.map +1 -1
- package/dist/actions/delete-workspace-resource.js +1 -1
- package/dist/actions/delete-workspace-resource.js.map +1 -1
- package/dist/actions/ensure-dream-job.d.ts +3 -0
- package/dist/actions/ensure-dream-job.d.ts.map +1 -0
- package/dist/actions/ensure-dream-job.js +73 -0
- package/dist/actions/ensure-dream-job.js.map +1 -0
- package/dist/actions/get-dream-settings.d.ts +3 -0
- package/dist/actions/get-dream-settings.d.ts.map +1 -0
- package/dist/actions/get-dream-settings.js +11 -0
- package/dist/actions/get-dream-settings.js.map +1 -0
- package/dist/actions/get-dream.d.ts +3 -0
- package/dist/actions/get-dream.d.ts.map +1 -0
- package/dist/actions/get-dream.js +13 -0
- package/dist/actions/get-dream.js.map +1 -0
- package/dist/actions/get-workspace-resource-effective-context.d.ts +3 -0
- package/dist/actions/get-workspace-resource-effective-context.d.ts.map +1 -0
- package/dist/actions/get-workspace-resource-effective-context.js +27 -0
- package/dist/actions/get-workspace-resource-effective-context.js.map +1 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +30 -4
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/list-dream-candidates.d.ts +3 -0
- package/dist/actions/list-dream-candidates.d.ts.map +1 -0
- package/dist/actions/list-dream-candidates.js +68 -0
- package/dist/actions/list-dream-candidates.js.map +1 -0
- package/dist/actions/list-dreams.d.ts +3 -0
- package/dist/actions/list-dreams.d.ts.map +1 -0
- package/dist/actions/list-dreams.js +17 -0
- package/dist/actions/list-dreams.js.map +1 -0
- package/dist/actions/list-workspace-resources-for-app.d.ts +3 -0
- package/dist/actions/list-workspace-resources-for-app.d.ts.map +1 -0
- package/dist/actions/list-workspace-resources-for-app.js +12 -0
- package/dist/actions/list-workspace-resources-for-app.js.map +1 -0
- package/dist/actions/list-workspace-resources.js +1 -1
- package/dist/actions/list-workspace-resources.js.map +1 -1
- package/dist/actions/navigate.d.ts +1 -0
- package/dist/actions/navigate.d.ts.map +1 -1
- package/dist/actions/navigate.js +2 -1
- package/dist/actions/navigate.js.map +1 -1
- package/dist/actions/preview-dream-proposal.d.ts +3 -0
- package/dist/actions/preview-dream-proposal.d.ts.map +1 -0
- package/dist/actions/preview-dream-proposal.js +13 -0
- package/dist/actions/preview-dream-proposal.js.map +1 -0
- package/dist/actions/preview-workspace-resource-change.d.ts +3 -0
- package/dist/actions/preview-workspace-resource-change.d.ts.map +1 -0
- package/dist/actions/preview-workspace-resource-change.js +24 -0
- package/dist/actions/preview-workspace-resource-change.js.map +1 -0
- package/dist/actions/reject-dream-proposal.d.ts +3 -0
- package/dist/actions/reject-dream-proposal.d.ts.map +1 -0
- package/dist/actions/reject-dream-proposal.js +12 -0
- package/dist/actions/reject-dream-proposal.js.map +1 -0
- package/dist/actions/restore-starter-workspace-resources.d.ts +3 -0
- package/dist/actions/restore-starter-workspace-resources.d.ts.map +1 -0
- package/dist/actions/restore-starter-workspace-resources.js +14 -0
- package/dist/actions/restore-starter-workspace-resources.js.map +1 -0
- package/dist/actions/send-code-agent-remote-command.d.ts +3 -0
- package/dist/actions/send-code-agent-remote-command.d.ts.map +1 -0
- package/dist/actions/send-code-agent-remote-command.js +53 -0
- package/dist/actions/send-code-agent-remote-command.js.map +1 -0
- package/dist/actions/set-dream-settings.d.ts +3 -0
- package/dist/actions/set-dream-settings.d.ts.map +1 -0
- package/dist/actions/set-dream-settings.js +41 -0
- package/dist/actions/set-dream-settings.js.map +1 -0
- package/dist/actions/update-workspace-resource.js +1 -1
- package/dist/actions/update-workspace-resource.js.map +1 -1
- package/dist/actions/view-screen.d.ts.map +1 -1
- package/dist/actions/view-screen.js +73 -2
- package/dist/actions/view-screen.js.map +1 -1
- package/dist/components/approval-value-block.d.ts +7 -0
- package/dist/components/approval-value-block.d.ts.map +1 -0
- package/dist/components/approval-value-block.js +22 -0
- package/dist/components/approval-value-block.js.map +1 -0
- package/dist/components/create-app-popover.d.ts.map +1 -1
- package/dist/components/create-app-popover.js +3 -2
- package/dist/components/create-app-popover.js.map +1 -1
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +8 -1
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/ui/chart.d.ts +1 -1
- package/dist/components/workspace-app-card.d.ts.map +1 -1
- package/dist/components/workspace-app-card.js +25 -4
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/components/workspace-resource-effective-stack.d.ts +11 -0
- package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -0
- package/dist/components/workspace-resource-effective-stack.js +59 -0
- package/dist/components/workspace-resource-effective-stack.js.map +1 -0
- package/dist/components/workspace-resource-impact-preview.d.ts +9 -0
- package/dist/components/workspace-resource-impact-preview.d.ts.map +1 -0
- package/dist/components/workspace-resource-impact-preview.js +39 -0
- package/dist/components/workspace-resource-impact-preview.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +59 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +714 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +44 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/hooks/use-navigation-state.d.ts +3 -0
- package/dist/hooks/use-navigation-state.d.ts.map +1 -1
- package/dist/hooks/use-navigation-state.js +23 -3
- package/dist/hooks/use-navigation-state.js.map +1 -1
- package/dist/lib/utils.d.ts +2 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +5 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/pages/approval.d.ts.map +1 -1
- package/dist/routes/pages/approval.js +4 -1
- package/dist/routes/pages/approval.js.map +1 -1
- package/dist/routes/pages/approvals.js +1 -1
- package/dist/routes/pages/approvals.js.map +1 -1
- package/dist/routes/pages/dream-settings.d.ts +34 -0
- package/dist/routes/pages/dream-settings.d.ts.map +1 -0
- package/dist/routes/pages/dream-settings.js +68 -0
- package/dist/routes/pages/dream-settings.js.map +1 -0
- package/dist/routes/pages/dreams.d.ts +5 -0
- package/dist/routes/pages/dreams.d.ts.map +1 -0
- package/dist/routes/pages/dreams.js +435 -0
- package/dist/routes/pages/dreams.js.map +1 -0
- package/dist/routes/pages/workspace.d.ts.map +1 -1
- package/dist/routes/pages/workspace.js +187 -35
- package/dist/routes/pages/workspace.js.map +1 -1
- package/dist/server/lib/app-creation-store.d.ts.map +1 -1
- package/dist/server/lib/app-creation-store.js +3 -2
- package/dist/server/lib/app-creation-store.js.map +1 -1
- package/dist/server/lib/dispatch-integrations.d.ts +1 -1
- package/dist/server/lib/dispatch-integrations.d.ts.map +1 -1
- package/dist/server/lib/dispatch-integrations.js +9 -4
- package/dist/server/lib/dispatch-integrations.js.map +1 -1
- package/dist/server/lib/dispatch-remote-commands.d.ts +83 -0
- package/dist/server/lib/dispatch-remote-commands.d.ts.map +1 -0
- package/dist/server/lib/dispatch-remote-commands.js +256 -0
- package/dist/server/lib/dispatch-remote-commands.js.map +1 -0
- package/dist/server/lib/dispatch-store.d.ts +26 -0
- package/dist/server/lib/dispatch-store.d.ts.map +1 -1
- package/dist/server/lib/dispatch-store.js +17 -1
- package/dist/server/lib/dispatch-store.js.map +1 -1
- package/dist/server/lib/dreams-store.d.ts +398 -0
- package/dist/server/lib/dreams-store.d.ts.map +1 -0
- package/dist/server/lib/dreams-store.js +2330 -0
- package/dist/server/lib/dreams-store.js.map +1 -0
- package/dist/server/lib/thread-debug-store.d.ts +2 -2
- package/dist/server/lib/vault-store.d.ts +1 -1
- package/dist/server/lib/workspace-resources-store.d.ts +181 -17
- package/dist/server/lib/workspace-resources-store.d.ts.map +1 -1
- package/dist/server/lib/workspace-resources-store.js +737 -108
- package/dist/server/lib/workspace-resources-store.js.map +1 -1
- package/package.json +4 -2
- package/src/actions/apply-dream-proposal.ts +12 -0
- package/src/actions/create-dream-report.ts +76 -0
- package/src/actions/create-workspace-resource.ts +3 -3
- package/src/actions/delete-workspace-resource.ts +1 -1
- package/src/actions/ensure-dream-job.ts +76 -0
- package/src/actions/get-dream-settings.ts +12 -0
- package/src/actions/get-dream.ts +14 -0
- package/src/actions/get-workspace-resource-effective-context.ts +34 -0
- package/src/actions/index.spec.ts +26 -0
- package/src/actions/index.ts +31 -4
- package/src/actions/list-dream-candidates.ts +77 -0
- package/src/actions/list-dreams.ts +17 -0
- package/src/actions/list-workspace-resources-for-app.ts +13 -0
- package/src/actions/list-workspace-resources.ts +1 -1
- package/src/actions/navigate.ts +2 -1
- package/src/actions/preview-dream-proposal.ts +14 -0
- package/src/actions/preview-workspace-resource-change.ts +25 -0
- package/src/actions/reject-dream-proposal.ts +12 -0
- package/src/actions/restore-starter-workspace-resources.ts +17 -0
- package/src/actions/send-code-agent-remote-command.ts +59 -0
- package/src/actions/set-dream-settings.spec.ts +81 -0
- package/src/actions/set-dream-settings.ts +44 -0
- package/src/actions/update-workspace-resource.ts +1 -1
- package/src/actions/view-screen.ts +90 -2
- package/src/components/approval-value-block.spec.tsx +59 -0
- package/src/components/approval-value-block.tsx +33 -0
- package/src/components/create-app-popover.tsx +3 -2
- package/src/components/layout/Layout.tsx +8 -0
- package/src/components/workspace-app-card.tsx +166 -1
- package/src/components/workspace-resource-effective-stack.spec.tsx +125 -0
- package/src/components/workspace-resource-effective-stack.tsx +141 -0
- package/src/components/workspace-resource-impact-preview.spec.tsx +147 -0
- package/src/components/workspace-resource-impact-preview.tsx +116 -0
- package/src/db/migrations.ts +59 -0
- package/src/db/schema.ts +46 -2
- package/src/hooks/use-navigation-state.ts +24 -5
- package/src/lib/utils.ts +6 -1
- package/src/routes/index.ts +1 -0
- package/src/routes/pages/approval.tsx +14 -1
- package/src/routes/pages/approvals.tsx +1 -1
- package/src/routes/pages/dream-settings.spec.ts +130 -0
- package/src/routes/pages/dream-settings.ts +103 -0
- package/src/routes/pages/dreams.tsx +1828 -0
- package/src/routes/pages/workspace.tsx +577 -97
- package/src/server/lib/app-creation-store.ts +3 -2
- package/src/server/lib/dispatch-integrations.ts +10 -3
- package/src/server/lib/dispatch-remote-commands.spec.ts +167 -0
- package/src/server/lib/dispatch-remote-commands.ts +375 -0
- package/src/server/lib/dispatch-store.ts +37 -1
- package/src/server/lib/dreams-store.spec.ts +1492 -0
- package/src/server/lib/dreams-store.ts +3168 -0
- package/src/server/lib/workspace-resource-approval-lifecycle.spec.ts +236 -0
- package/src/server/lib/workspace-resources-store.spec.ts +1106 -0
- package/src/server/lib/workspace-resources-store.ts +1001 -134
- package/dist/actions/sync-workspace-resources-to-all.d.ts +0 -3
- package/dist/actions/sync-workspace-resources-to-all.d.ts.map +0 -1
- package/dist/actions/sync-workspace-resources-to-all.js +0 -9
- package/dist/actions/sync-workspace-resources-to-all.js.map +0 -1
- package/dist/actions/sync-workspace-resources-to-app.d.ts +0 -3
- package/dist/actions/sync-workspace-resources-to-app.d.ts.map +0 -1
- package/dist/actions/sync-workspace-resources-to-app.js +0 -11
- package/dist/actions/sync-workspace-resources-to-app.js.map +0 -1
- package/src/actions/sync-workspace-resources-to-all.ts +0 -10
- package/src/actions/sync-workspace-resources-to-app.ts +0 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-integrations.js","sourceRoot":"","sources":["../../../src/server/lib/dispatch-integrations.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IncomingMessage,\n PlatformAdapter,\n} from \"@agent-native/core/server\";\nimport { resolveOrgIdForEmail } from \"@agent-native/core/org\";\nimport crypto from \"node:crypto\";\nimport { consumeLinkToken, resolveLinkedOwner } from \"./dispatch-store.js\";\n\ntype SlackSenderProfile = {\n email: string | null;\n name: string | null;\n};\n\nconst slackProfileCache = new Map<\n string,\n { profile: SlackSenderProfile; expiresAt: number }\n>();\nconst SLACK_PROFILE_CACHE_TTL = 10 * 60 * 1000;\n\nfunction contextString(value: unknown): string | null {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return null;\n}\n\nexport function identityKeyForIncoming(\n incoming: IncomingMessage,\n): string | null {\n const senderId = contextString(incoming.senderId);\n if (!senderId) return null;\n\n if (incoming.platform === \"slack\") {\n const teamId = contextString(incoming.platformContext.teamId);\n return teamId ? `${teamId}:${senderId}` : senderId;\n }\n\n if (incoming.platform === \"whatsapp\") {\n const phoneNumberId = contextString(incoming.platformContext.phoneNumberId);\n return phoneNumberId ? `${phoneNumberId}:${senderId}` : senderId;\n }\n\n if (incoming.platform === \"email\") {\n return senderId.toLowerCase();\n }\n\n return senderId;\n}\n\nfunction fallbackOwnerForIncoming(incoming: IncomingMessage): string {\n const tenant =\n contextString(incoming.platformContext.teamId) ||\n contextString(incoming.platformContext.phoneNumberId) ||\n contextString(incoming.platformContext.chatId) ||\n contextString(incoming.platformContext.from) ||\n incoming.externalThreadId;\n const raw = `${incoming.platform}:${tenant}:${incoming.senderId || \"\"}`;\n const hash = crypto\n .createHash(\"sha256\")\n .update(raw)\n .digest(\"hex\")\n .slice(0, 16);\n return `dispatch+${hash}@integration.local`;\n}\n\nfunction configuredDefaultOwnerForIncoming(\n incoming: IncomingMessage,\n): string | null {\n // This is intentionally Slack-only: a deployment-wide default owner grants\n // that Slack workspace access to the owner's connected agents and org\n // credentials, so other platforms should opt in with explicit identity links.\n if (incoming.platform !== \"slack\") return null;\n const email = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (!email) return null;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email) ? email : null;\n}\n\nasync function resolveSlackSenderProfile(\n incoming: IncomingMessage,\n): Promise<SlackSenderProfile> {\n if (incoming.platform !== \"slack\") return { email: null, name: null };\n const token = process.env.SLACK_BOT_TOKEN;\n const userId = contextString(incoming.senderId);\n const teamId = contextString(incoming.platformContext.teamId);\n if (!token || !userId) return { email: null, name: null };\n\n // Slack user IDs are scoped per workspace, so without a teamId we can't\n // safely cache: two installs of the bot in different workspaces could\n // share user-id strings and collide on a single \"default\" key. Skip the\n // cache (and lookup on every request) when teamId is missing.\n const cacheKey = teamId ? `${teamId}:${userId}` : null;\n if (cacheKey) {\n const cached = slackProfileCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.profile;\n }\n\n try {\n const params = new URLSearchParams({ user: userId });\n const res = await fetch(`https://slack.com/api/users.info?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n const data = (await res.json()) as {\n ok?: boolean;\n user?: {\n real_name?: string;\n name?: string;\n profile?: {\n email?: string;\n real_name?: string;\n display_name?: string;\n };\n };\n };\n const profile = data.ok\n ? {\n email: data.user?.profile?.email?.trim().toLowerCase() || null,\n name:\n data.user?.profile?.real_name?.trim() ||\n data.user?.profile?.display_name?.trim() ||\n data.user?.real_name?.trim() ||\n data.user?.name?.trim() ||\n null,\n }\n : { email: null, name: null };\n if (cacheKey) {\n slackProfileCache.set(cacheKey, {\n profile,\n expiresAt: Date.now() + SLACK_PROFILE_CACHE_TTL,\n });\n }\n return profile;\n } catch {\n return { email: null, name: null };\n }\n}\n\nasync function resolveSlackOwnerFromVerifiedEmail(\n incoming: IncomingMessage,\n): Promise<string | null> {\n const profile = await resolveSlackSenderProfile(incoming);\n if (!profile.email) return null;\n\n incoming.senderEmail = profile.email;\n incoming.platformContext.senderEmail = profile.email;\n if (profile.name) {\n incoming.senderName = profile.name;\n incoming.platformContext.senderName = profile.name;\n }\n\n const orgId = await resolveOrgIdForEmail(profile.email);\n return orgId ? profile.email : null;\n}\n\nexport async function resolveDispatchOwner(\n incoming: IncomingMessage,\n): Promise<string> {\n try {\n const externalUserId = identityKeyForIncoming(incoming);\n\n // Webhooks do not have the browser request's org context, so allow a safe\n // cross-org fallback when the linked platform identity maps to one owner.\n const owner = await resolveLinkedOwner(incoming.platform, externalUserId, {\n allowAnyOrgFallback: true,\n });\n if (owner) return owner;\n\n // For email, the sender's email address is already a natural identity.\n // If the senderId looks like an email address, use it directly as the owner.\n if (\n incoming.platform === \"email\" &&\n incoming.senderId &&\n incoming.senderId.includes(\"@\")\n ) {\n return incoming.senderId;\n }\n\n // Slack gives us a user id in the event payload. Resolve it to a verified\n // workspace email and use that user's own org context when they are an\n // Agent-Native member, so artifacts created via @agent-native are visible\n // when they open the target app.\n if (incoming.platform === \"slack\") {\n const slackOwner = await resolveSlackOwnerFromVerifiedEmail(incoming);\n if (slackOwner) return slackOwner;\n }\n\n const defaultOwner = configuredDefaultOwnerForIncoming(incoming);\n if (defaultOwner) return defaultOwner;\n\n return fallbackOwnerForIncoming(incoming);\n } catch {\n const defaultOwner = configuredDefaultOwnerForIncoming(incoming);\n if (defaultOwner) return defaultOwner;\n return fallbackOwnerForIncoming(incoming);\n }\n}\n\nexport async function beforeDispatchProcess(\n incoming: IncomingMessage,\n _adapter: PlatformAdapter,\n): Promise<{ handled: true; responseText?: string } | { handled: false }> {\n const trimmed = incoming.text.trim();\n const match = trimmed.match(/^\\/link\\s+([a-zA-Z0-9_-]+)$/);\n if (!match) return { handled: false };\n\n try {\n const owner = await consumeLinkToken({\n platform: incoming.platform,\n token: match[1],\n externalUserId: identityKeyForIncoming(incoming),\n externalUserName: incoming.senderName || null,\n });\n return {\n handled: true,\n responseText: `Linked successfully. Future ${incoming.platform} messages will use ${owner}'s personal dispatch context.`,\n };\n } catch (error) {\n return {\n handled: true,\n responseText:\n error instanceof Error ? error.message : \"Failed to link this account.\",\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dispatch-integrations.js","sourceRoot":"","sources":["../../../src/server/lib/dispatch-integrations.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IncomingMessage,\n PlatformAdapter,\n} from \"@agent-native/core/server\";\nimport { resolveOrgIdForEmail } from \"@agent-native/core/org\";\nimport crypto from \"node:crypto\";\nimport { consumeLinkToken, resolveLinkedOwner } from \"./dispatch-store.js\";\nimport { handleRemoteCodeCommand } from \"./dispatch-remote-commands.js\";\n\ntype SlackSenderProfile = {\n email: string | null;\n name: string | null;\n};\n\nconst slackProfileCache = new Map<\n string,\n { profile: SlackSenderProfile; expiresAt: number }\n>();\nconst SLACK_PROFILE_CACHE_TTL = 10 * 60 * 1000;\n\nfunction contextString(value: unknown): string | null {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return null;\n}\n\nexport function identityKeyForIncoming(\n incoming: IncomingMessage,\n): string | null {\n const senderId = contextString(incoming.senderId);\n if (!senderId) return null;\n\n if (incoming.platform === \"slack\") {\n const teamId = contextString(incoming.platformContext.teamId);\n return teamId ? `${teamId}:${senderId}` : senderId;\n }\n\n if (incoming.platform === \"whatsapp\") {\n const phoneNumberId = contextString(incoming.platformContext.phoneNumberId);\n return phoneNumberId ? `${phoneNumberId}:${senderId}` : senderId;\n }\n\n if (incoming.platform === \"email\") {\n return senderId.toLowerCase();\n }\n\n return senderId;\n}\n\nfunction fallbackOwnerForIncoming(incoming: IncomingMessage): string {\n const tenant =\n contextString(incoming.platformContext.teamId) ||\n contextString(incoming.platformContext.phoneNumberId) ||\n contextString(incoming.platformContext.chatId) ||\n contextString(incoming.platformContext.from) ||\n incoming.externalThreadId;\n const raw = `${incoming.platform}:${tenant}:${incoming.senderId || \"\"}`;\n const hash = crypto\n .createHash(\"sha256\")\n .update(raw)\n .digest(\"hex\")\n .slice(0, 16);\n return `dispatch+${hash}@integration.local`;\n}\n\nfunction configuredDefaultOwnerForIncoming(\n incoming: IncomingMessage,\n): string | null {\n // This is intentionally Slack-only: a deployment-wide default owner grants\n // that Slack workspace access to the owner's connected agents and org\n // credentials, so other platforms should opt in with explicit identity links.\n if (incoming.platform !== \"slack\") return null;\n const email = process.env.DISPATCH_DEFAULT_OWNER_EMAIL?.trim();\n if (!email) return null;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email) ? email : null;\n}\n\nasync function resolveSlackSenderProfile(\n incoming: IncomingMessage,\n): Promise<SlackSenderProfile> {\n if (incoming.platform !== \"slack\") return { email: null, name: null };\n const token = process.env.SLACK_BOT_TOKEN;\n const userId = contextString(incoming.senderId);\n const teamId = contextString(incoming.platformContext.teamId);\n if (!token || !userId) return { email: null, name: null };\n\n // Slack user IDs are scoped per workspace, so without a teamId we can't\n // safely cache: two installs of the bot in different workspaces could\n // share user-id strings and collide on a single \"default\" key. Skip the\n // cache (and lookup on every request) when teamId is missing.\n const cacheKey = teamId ? `${teamId}:${userId}` : null;\n if (cacheKey) {\n const cached = slackProfileCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.profile;\n }\n\n try {\n const params = new URLSearchParams({ user: userId });\n const res = await fetch(`https://slack.com/api/users.info?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n const data = (await res.json()) as {\n ok?: boolean;\n user?: {\n real_name?: string;\n name?: string;\n profile?: {\n email?: string;\n real_name?: string;\n display_name?: string;\n };\n };\n };\n const profile = data.ok\n ? {\n email: data.user?.profile?.email?.trim().toLowerCase() || null,\n name:\n data.user?.profile?.real_name?.trim() ||\n data.user?.profile?.display_name?.trim() ||\n data.user?.real_name?.trim() ||\n data.user?.name?.trim() ||\n null,\n }\n : { email: null, name: null };\n if (cacheKey) {\n slackProfileCache.set(cacheKey, {\n profile,\n expiresAt: Date.now() + SLACK_PROFILE_CACHE_TTL,\n });\n }\n return profile;\n } catch {\n return { email: null, name: null };\n }\n}\n\nasync function resolveSlackOwnerFromVerifiedEmail(\n incoming: IncomingMessage,\n): Promise<string | null> {\n const profile = await resolveSlackSenderProfile(incoming);\n if (!profile.email) return null;\n\n incoming.senderEmail = profile.email;\n incoming.platformContext.senderEmail = profile.email;\n if (profile.name) {\n incoming.senderName = profile.name;\n incoming.platformContext.senderName = profile.name;\n }\n\n const orgId = await resolveOrgIdForEmail(profile.email);\n return orgId ? profile.email : null;\n}\n\nexport async function resolveDispatchOwner(\n incoming: IncomingMessage,\n): Promise<string> {\n try {\n const externalUserId = identityKeyForIncoming(incoming);\n\n // Webhooks do not have the browser request's org context, so allow a safe\n // cross-org fallback when the linked platform identity maps to one owner.\n const owner = await resolveLinkedOwner(incoming.platform, externalUserId, {\n allowAnyOrgFallback: true,\n });\n if (owner) return owner;\n\n // For email, the sender's email address is already a natural identity.\n // If the senderId looks like an email address, use it directly as the owner.\n if (\n incoming.platform === \"email\" &&\n incoming.senderId &&\n incoming.senderId.includes(\"@\")\n ) {\n return incoming.senderId;\n }\n\n // Slack gives us a user id in the event payload. Resolve it to a verified\n // workspace email and use that user's own org context when they are an\n // Agent-Native member, so artifacts created via @agent-native are visible\n // when they open the target app.\n if (incoming.platform === \"slack\") {\n const slackOwner = await resolveSlackOwnerFromVerifiedEmail(incoming);\n if (slackOwner) return slackOwner;\n }\n\n const defaultOwner = configuredDefaultOwnerForIncoming(incoming);\n if (defaultOwner) return defaultOwner;\n\n return fallbackOwnerForIncoming(incoming);\n } catch {\n const defaultOwner = configuredDefaultOwnerForIncoming(incoming);\n if (defaultOwner) return defaultOwner;\n return fallbackOwnerForIncoming(incoming);\n }\n}\n\nexport async function beforeDispatchProcess(\n incoming: IncomingMessage,\n adapter: PlatformAdapter,\n): Promise<{ handled: true; responseText?: string } | { handled: false }> {\n const trimmed = incoming.text.trim();\n const commandText =\n contextString(incoming.platformContext.rawText) || trimmed;\n const match = commandText.match(/^\\/link(?:@\\w+)?\\s+([a-zA-Z0-9_-]+)$/);\n if (!match) {\n return handleRemoteCodeCommand(incoming, adapter, {\n resolveOwner: () => resolveDispatchOwner(incoming),\n });\n }\n\n try {\n const owner = await consumeLinkToken({\n platform: incoming.platform,\n token: match[1],\n externalUserId: identityKeyForIncoming(incoming),\n externalUserName: incoming.senderName || null,\n });\n return {\n handled: true,\n responseText: `Linked successfully. Future ${incoming.platform} messages will use ${owner}'s personal dispatch context.`,\n };\n } catch (error) {\n return {\n handled: true,\n responseText:\n error instanceof Error ? error.message : \"Failed to link this account.\",\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { IncomingMessage, PlatformAdapter } from "@agent-native/core/server";
|
|
2
|
+
export type RemoteCodeCommand = {
|
|
3
|
+
type: "create";
|
|
4
|
+
prompt: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: "list";
|
|
7
|
+
} | {
|
|
8
|
+
type: "status";
|
|
9
|
+
runRef?: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: "continue";
|
|
12
|
+
runRef: string;
|
|
13
|
+
text: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: "approve";
|
|
16
|
+
approvalId: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "deny";
|
|
19
|
+
approvalId: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: "stop";
|
|
22
|
+
runRef: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: "help";
|
|
25
|
+
reason?: string;
|
|
26
|
+
};
|
|
27
|
+
export interface RemoteCodeCommandEnvelope {
|
|
28
|
+
kind: "code-agent";
|
|
29
|
+
ownerEmail: string;
|
|
30
|
+
command: Exclude<RemoteCodeCommand, {
|
|
31
|
+
type: "help";
|
|
32
|
+
}>;
|
|
33
|
+
source: {
|
|
34
|
+
platform: string;
|
|
35
|
+
externalThreadId: string;
|
|
36
|
+
senderId?: string;
|
|
37
|
+
senderName?: string;
|
|
38
|
+
messageId?: string;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface RemoteCodeRunSummary {
|
|
43
|
+
id?: string;
|
|
44
|
+
runId?: string;
|
|
45
|
+
title?: string;
|
|
46
|
+
prompt?: string;
|
|
47
|
+
status?: string;
|
|
48
|
+
updatedAt?: string | number | Date;
|
|
49
|
+
createdAt?: string | number | Date;
|
|
50
|
+
}
|
|
51
|
+
export interface RemoteCodeCommandResult {
|
|
52
|
+
ok?: boolean;
|
|
53
|
+
status?: string;
|
|
54
|
+
hostOnline?: boolean;
|
|
55
|
+
hostStatus?: string;
|
|
56
|
+
commandId?: string;
|
|
57
|
+
requestId?: string;
|
|
58
|
+
runId?: string;
|
|
59
|
+
run?: RemoteCodeRunSummary;
|
|
60
|
+
runs?: RemoteCodeRunSummary[];
|
|
61
|
+
message?: string;
|
|
62
|
+
error?: string;
|
|
63
|
+
}
|
|
64
|
+
export type RemoteCodeCommandRelay = (envelope: RemoteCodeCommandEnvelope) => Promise<RemoteCodeCommandResult>;
|
|
65
|
+
export interface HandleRemoteCodeCommandOptions {
|
|
66
|
+
resolveOwner: () => Promise<string> | string;
|
|
67
|
+
relay?: RemoteCodeCommandRelay;
|
|
68
|
+
}
|
|
69
|
+
export declare function parseTelegramCodeCommand(incoming: Pick<IncomingMessage, "platform" | "text" | "platformContext">): RemoteCodeCommand | null;
|
|
70
|
+
export declare function handleRemoteCodeCommand(incoming: IncomingMessage, _adapter: PlatformAdapter, options: HandleRemoteCodeCommandOptions): Promise<{
|
|
71
|
+
handled: true;
|
|
72
|
+
responseText?: string;
|
|
73
|
+
} | {
|
|
74
|
+
handled: false;
|
|
75
|
+
}>;
|
|
76
|
+
export declare function createRemoteCodeCommandEnvelope(incoming: IncomingMessage, ownerEmail: string, command: Exclude<RemoteCodeCommand, {
|
|
77
|
+
type: "help";
|
|
78
|
+
}>): RemoteCodeCommandEnvelope;
|
|
79
|
+
export declare function enqueueRemoteCodeCommand(envelope: RemoteCodeCommandEnvelope): Promise<RemoteCodeCommandResult>;
|
|
80
|
+
export declare function formatRemoteCodeCommandResult(command: Exclude<RemoteCodeCommand, {
|
|
81
|
+
type: "help";
|
|
82
|
+
}>, result: RemoteCodeCommandResult): string;
|
|
83
|
+
//# sourceMappingURL=dispatch-remote-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-remote-commands.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-remote-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
const CODE_COMMAND_RE = /^\/code(?:@[a-zA-Z0-9_]+)?(?:\s+|$)/i;
|
|
2
|
+
export function parseTelegramCodeCommand(incoming) {
|
|
3
|
+
if (incoming.platform !== "telegram")
|
|
4
|
+
return null;
|
|
5
|
+
const rawText = rawTelegramText(incoming);
|
|
6
|
+
if (!rawText || !CODE_COMMAND_RE.test(rawText))
|
|
7
|
+
return null;
|
|
8
|
+
return parseCodeCommandBody(rawText.replace(CODE_COMMAND_RE, "").trim());
|
|
9
|
+
}
|
|
10
|
+
export async function handleRemoteCodeCommand(incoming, _adapter, options) {
|
|
11
|
+
const command = parseTelegramCodeCommand(incoming);
|
|
12
|
+
if (!command)
|
|
13
|
+
return { handled: false };
|
|
14
|
+
if (command.type === "help") {
|
|
15
|
+
return { handled: true, responseText: formatCodeCommandHelp(command) };
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const ownerEmail = await options.resolveOwner();
|
|
19
|
+
const envelope = createRemoteCodeCommandEnvelope(incoming, ownerEmail, command);
|
|
20
|
+
const relay = options.relay ?? enqueueRemoteCodeCommand;
|
|
21
|
+
const result = await relay(envelope);
|
|
22
|
+
return {
|
|
23
|
+
handled: true,
|
|
24
|
+
responseText: formatRemoteCodeCommandResult(command, result),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return {
|
|
29
|
+
handled: true,
|
|
30
|
+
responseText: error instanceof Error
|
|
31
|
+
? `I couldn't route that code command: ${error.message}`
|
|
32
|
+
: "I couldn't route that code command.",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function createRemoteCodeCommandEnvelope(incoming, ownerEmail, command) {
|
|
37
|
+
return {
|
|
38
|
+
kind: "code-agent",
|
|
39
|
+
ownerEmail,
|
|
40
|
+
command,
|
|
41
|
+
source: {
|
|
42
|
+
platform: incoming.platform,
|
|
43
|
+
externalThreadId: incoming.externalThreadId,
|
|
44
|
+
senderId: incoming.senderId,
|
|
45
|
+
senderName: incoming.senderName,
|
|
46
|
+
messageId: contextString(incoming.platformContext.messageId),
|
|
47
|
+
timestamp: incoming.timestamp,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export async function enqueueRemoteCodeCommand(envelope) {
|
|
52
|
+
const helperResult = await tryCoreRemoteCommandHelper(envelope);
|
|
53
|
+
if (helperResult)
|
|
54
|
+
return helperResult;
|
|
55
|
+
const endpoint = `${resolveRemoteRelayBaseUrl()}/_agent-native/integrations/remote/enqueue`;
|
|
56
|
+
const response = await fetch(endpoint, {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "Content-Type": "application/json" },
|
|
59
|
+
body: JSON.stringify(envelope),
|
|
60
|
+
});
|
|
61
|
+
let body = null;
|
|
62
|
+
try {
|
|
63
|
+
body = await response.json();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
body = null;
|
|
67
|
+
}
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
const message = typeof body === "object" && body && "error" in body
|
|
70
|
+
? String(body.error)
|
|
71
|
+
: `remote relay returned ${response.status}`;
|
|
72
|
+
throw new Error(message);
|
|
73
|
+
}
|
|
74
|
+
return normalizeRemoteCodeCommandResult(body);
|
|
75
|
+
}
|
|
76
|
+
export function formatRemoteCodeCommandResult(command, result) {
|
|
77
|
+
if (result.message?.trim())
|
|
78
|
+
return result.message.trim();
|
|
79
|
+
if (result.error?.trim())
|
|
80
|
+
return `Code command failed: ${result.error.trim()}`;
|
|
81
|
+
if (command.type === "list")
|
|
82
|
+
return formatRunList(result.runs ?? []);
|
|
83
|
+
if (command.type === "status")
|
|
84
|
+
return formatStatus(command, result);
|
|
85
|
+
const id = result.runId ||
|
|
86
|
+
result.run?.runId ||
|
|
87
|
+
result.run?.id ||
|
|
88
|
+
result.commandId ||
|
|
89
|
+
result.requestId;
|
|
90
|
+
const suffix = id ? ` (${id})` : "";
|
|
91
|
+
const offline = isOfflineOrSleeping(result);
|
|
92
|
+
if (command.type === "create") {
|
|
93
|
+
return offline
|
|
94
|
+
? `Queued code run${suffix}. Your computer looks offline or asleep, so it will pick this up when it wakes.`
|
|
95
|
+
: `Queued code run${suffix}.`;
|
|
96
|
+
}
|
|
97
|
+
if (command.type === "continue") {
|
|
98
|
+
return offline
|
|
99
|
+
? `Queued follow-up for ${command.runRef}. Your computer looks offline or asleep, so it will pick this up when it wakes.`
|
|
100
|
+
: `Queued follow-up for ${command.runRef}.`;
|
|
101
|
+
}
|
|
102
|
+
if (command.type === "approve") {
|
|
103
|
+
return `Approved code-agent request ${command.approvalId}.`;
|
|
104
|
+
}
|
|
105
|
+
if (command.type === "deny") {
|
|
106
|
+
return `Denied code-agent request ${command.approvalId}.`;
|
|
107
|
+
}
|
|
108
|
+
if (command.type === "stop") {
|
|
109
|
+
return offline
|
|
110
|
+
? `Queued stop request for ${command.runRef}. Your computer looks offline or asleep, so it will receive the stop request when it wakes.`
|
|
111
|
+
: `Stop requested for ${command.runRef}.`;
|
|
112
|
+
}
|
|
113
|
+
return "Code command routed.";
|
|
114
|
+
}
|
|
115
|
+
function parseCodeCommandBody(body) {
|
|
116
|
+
if (!body)
|
|
117
|
+
return { type: "help" };
|
|
118
|
+
const [verbRaw = "", ...restParts] = body.split(/\s+/);
|
|
119
|
+
const verb = verbRaw.toLowerCase();
|
|
120
|
+
const rest = restParts.join(" ").trim();
|
|
121
|
+
if (verb === "help")
|
|
122
|
+
return { type: "help" };
|
|
123
|
+
if (verb === "list")
|
|
124
|
+
return { type: "list" };
|
|
125
|
+
if (verb === "status") {
|
|
126
|
+
return rest ? { type: "status", runRef: rest } : { type: "status" };
|
|
127
|
+
}
|
|
128
|
+
if (verb === "continue") {
|
|
129
|
+
const { first, rest: text } = splitFirst(rest);
|
|
130
|
+
if (!first || !text) {
|
|
131
|
+
return { type: "help", reason: "continue needs a run id and text" };
|
|
132
|
+
}
|
|
133
|
+
return { type: "continue", runRef: first, text };
|
|
134
|
+
}
|
|
135
|
+
if (verb === "approve") {
|
|
136
|
+
return rest
|
|
137
|
+
? { type: "approve", approvalId: rest }
|
|
138
|
+
: { type: "help", reason: "approve needs a request id" };
|
|
139
|
+
}
|
|
140
|
+
if (verb === "deny") {
|
|
141
|
+
return rest
|
|
142
|
+
? { type: "deny", approvalId: rest }
|
|
143
|
+
: { type: "help", reason: "deny needs a request id" };
|
|
144
|
+
}
|
|
145
|
+
if (verb === "stop") {
|
|
146
|
+
return rest
|
|
147
|
+
? { type: "stop", runRef: rest }
|
|
148
|
+
: { type: "help", reason: "stop needs a run id or list index" };
|
|
149
|
+
}
|
|
150
|
+
return { type: "create", prompt: body };
|
|
151
|
+
}
|
|
152
|
+
function rawTelegramText(incoming) {
|
|
153
|
+
const context = incoming.platformContext;
|
|
154
|
+
return (contextString(context.rawText) ||
|
|
155
|
+
contextString(context.originalText) ||
|
|
156
|
+
contextString(context.messageText) ||
|
|
157
|
+
(CODE_COMMAND_RE.test(incoming.text) ? incoming.text : null));
|
|
158
|
+
}
|
|
159
|
+
function formatCodeCommandHelp(command) {
|
|
160
|
+
const prefix = command?.reason ? `${command.reason}.\n\n` : "";
|
|
161
|
+
return `${prefix}Use /code <prompt>, /code list, /code status [run], /code continue <run> <text>, /code approve <id>, /code deny <id>, or /code stop <run>.`;
|
|
162
|
+
}
|
|
163
|
+
function formatRunList(runs) {
|
|
164
|
+
if (!runs.length)
|
|
165
|
+
return "No recent code-agent runs found.";
|
|
166
|
+
const lines = runs.slice(0, 8).map((run, index) => {
|
|
167
|
+
const id = run.runId || run.id || "unknown";
|
|
168
|
+
const title = run.title || run.prompt || "Untitled run";
|
|
169
|
+
const status = run.status || "unknown";
|
|
170
|
+
return `${index + 1}. ${title} — ${status} (${id})`;
|
|
171
|
+
});
|
|
172
|
+
return `Recent code-agent runs:\n${lines.join("\n")}`;
|
|
173
|
+
}
|
|
174
|
+
function formatStatus(command, result) {
|
|
175
|
+
const run = result.run;
|
|
176
|
+
const hostStatus = result.hostStatus || (result.hostOnline ? "online" : "offline");
|
|
177
|
+
if (!run) {
|
|
178
|
+
const target = command.runRef ? ` for ${command.runRef}` : "";
|
|
179
|
+
return `Code-agent host is ${hostStatus}${target}.`;
|
|
180
|
+
}
|
|
181
|
+
const id = run.runId || run.id || command.runRef || "unknown";
|
|
182
|
+
const title = run.title || run.prompt || "Untitled run";
|
|
183
|
+
const status = run.status || result.status || "unknown";
|
|
184
|
+
const updated = formatDate(run.updatedAt || run.createdAt);
|
|
185
|
+
return [
|
|
186
|
+
`Code run ${id}: ${status}`,
|
|
187
|
+
`Task: ${title}`,
|
|
188
|
+
`Host: ${hostStatus}`,
|
|
189
|
+
updated ? `Updated: ${updated}` : "",
|
|
190
|
+
]
|
|
191
|
+
.filter(Boolean)
|
|
192
|
+
.join("\n");
|
|
193
|
+
}
|
|
194
|
+
function isOfflineOrSleeping(result) {
|
|
195
|
+
if (result.hostOnline === false)
|
|
196
|
+
return true;
|
|
197
|
+
const status = result.hostStatus?.toLowerCase();
|
|
198
|
+
return status === "offline" || status === "asleep" || status === "sleeping";
|
|
199
|
+
}
|
|
200
|
+
function splitFirst(value) {
|
|
201
|
+
const trimmed = value.trim();
|
|
202
|
+
const match = trimmed.match(/^(\S+)(?:\s+([\s\S]+))?$/);
|
|
203
|
+
return { first: match?.[1] || "", rest: match?.[2]?.trim() || "" };
|
|
204
|
+
}
|
|
205
|
+
function contextString(value) {
|
|
206
|
+
if (typeof value === "string" && value.trim())
|
|
207
|
+
return value.trim();
|
|
208
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
209
|
+
return String(value);
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
function formatDate(value) {
|
|
213
|
+
if (!value)
|
|
214
|
+
return null;
|
|
215
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
216
|
+
if (Number.isNaN(date.getTime()))
|
|
217
|
+
return null;
|
|
218
|
+
return date.toISOString();
|
|
219
|
+
}
|
|
220
|
+
async function tryCoreRemoteCommandHelper(envelope) {
|
|
221
|
+
const core = (await import("@agent-native/core/server"));
|
|
222
|
+
const helper = core.enqueueRemoteCommand ||
|
|
223
|
+
core.enqueueIntegrationRemoteCommand ||
|
|
224
|
+
core.enqueueRemoteIntegrationCommand;
|
|
225
|
+
if (typeof helper !== "function")
|
|
226
|
+
return null;
|
|
227
|
+
return normalizeRemoteCodeCommandResult(await helper(envelope));
|
|
228
|
+
}
|
|
229
|
+
function normalizeRemoteCodeCommandResult(value) {
|
|
230
|
+
if (!value || typeof value !== "object")
|
|
231
|
+
return { ok: true };
|
|
232
|
+
const result = value;
|
|
233
|
+
return {
|
|
234
|
+
ok: result.ok,
|
|
235
|
+
status: contextString(result.status),
|
|
236
|
+
hostOnline: typeof result.hostOnline === "boolean" ? result.hostOnline : undefined,
|
|
237
|
+
hostStatus: contextString(result.hostStatus),
|
|
238
|
+
commandId: contextString(result.commandId),
|
|
239
|
+
requestId: contextString(result.requestId),
|
|
240
|
+
runId: contextString(result.runId),
|
|
241
|
+
run: result.run,
|
|
242
|
+
runs: Array.isArray(result.runs) ? result.runs : undefined,
|
|
243
|
+
message: contextString(result.message),
|
|
244
|
+
error: contextString(result.error),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function resolveRemoteRelayBaseUrl() {
|
|
248
|
+
const raw = process.env.WEBHOOK_BASE_URL ||
|
|
249
|
+
process.env.APP_URL ||
|
|
250
|
+
process.env.URL ||
|
|
251
|
+
"http://localhost:3000";
|
|
252
|
+
if (/^https?:\/\//i.test(raw))
|
|
253
|
+
return raw.replace(/\/$/, "");
|
|
254
|
+
return `https://${raw.replace(/\/$/, "")}`;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=dispatch-remote-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-remote-commands.js","sourceRoot":"","sources":["../../../src/server/lib/dispatch-remote-commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IncomingMessage,\n PlatformAdapter,\n} from \"@agent-native/core/server\";\n\nexport type RemoteCodeCommand =\n | { type: \"create\"; prompt: string }\n | { type: \"list\" }\n | { type: \"status\"; runRef?: string }\n | { type: \"continue\"; runRef: string; text: string }\n | { type: \"approve\"; approvalId: string }\n | { type: \"deny\"; approvalId: string }\n | { type: \"stop\"; runRef: string }\n | { type: \"help\"; reason?: string };\n\nexport interface RemoteCodeCommandEnvelope {\n kind: \"code-agent\";\n ownerEmail: string;\n command: Exclude<RemoteCodeCommand, { type: \"help\" }>;\n source: {\n platform: string;\n externalThreadId: string;\n senderId?: string;\n senderName?: string;\n messageId?: string;\n timestamp: number;\n };\n}\n\nexport interface RemoteCodeRunSummary {\n id?: string;\n runId?: string;\n title?: string;\n prompt?: string;\n status?: string;\n updatedAt?: string | number | Date;\n createdAt?: string | number | Date;\n}\n\nexport interface RemoteCodeCommandResult {\n ok?: boolean;\n status?: string;\n hostOnline?: boolean;\n hostStatus?: string;\n commandId?: string;\n requestId?: string;\n runId?: string;\n run?: RemoteCodeRunSummary;\n runs?: RemoteCodeRunSummary[];\n message?: string;\n error?: string;\n}\n\nexport type RemoteCodeCommandRelay = (\n envelope: RemoteCodeCommandEnvelope,\n) => Promise<RemoteCodeCommandResult>;\n\nexport interface HandleRemoteCodeCommandOptions {\n resolveOwner: () => Promise<string> | string;\n relay?: RemoteCodeCommandRelay;\n}\n\nconst CODE_COMMAND_RE = /^\\/code(?:@[a-zA-Z0-9_]+)?(?:\\s+|$)/i;\n\nexport function parseTelegramCodeCommand(\n incoming: Pick<IncomingMessage, \"platform\" | \"text\" | \"platformContext\">,\n): RemoteCodeCommand | null {\n if (incoming.platform !== \"telegram\") return null;\n\n const rawText = rawTelegramText(incoming);\n if (!rawText || !CODE_COMMAND_RE.test(rawText)) return null;\n\n return parseCodeCommandBody(rawText.replace(CODE_COMMAND_RE, \"\").trim());\n}\n\nexport async function handleRemoteCodeCommand(\n incoming: IncomingMessage,\n _adapter: PlatformAdapter,\n options: HandleRemoteCodeCommandOptions,\n): Promise<{ handled: true; responseText?: string } | { handled: false }> {\n const command = parseTelegramCodeCommand(incoming);\n if (!command) return { handled: false };\n\n if (command.type === \"help\") {\n return { handled: true, responseText: formatCodeCommandHelp(command) };\n }\n\n try {\n const ownerEmail = await options.resolveOwner();\n const envelope = createRemoteCodeCommandEnvelope(\n incoming,\n ownerEmail,\n command,\n );\n const relay = options.relay ?? enqueueRemoteCodeCommand;\n const result = await relay(envelope);\n return {\n handled: true,\n responseText: formatRemoteCodeCommandResult(command, result),\n };\n } catch (error) {\n return {\n handled: true,\n responseText:\n error instanceof Error\n ? `I couldn't route that code command: ${error.message}`\n : \"I couldn't route that code command.\",\n };\n }\n}\n\nexport function createRemoteCodeCommandEnvelope(\n incoming: IncomingMessage,\n ownerEmail: string,\n command: Exclude<RemoteCodeCommand, { type: \"help\" }>,\n): RemoteCodeCommandEnvelope {\n return {\n kind: \"code-agent\",\n ownerEmail,\n command,\n source: {\n platform: incoming.platform,\n externalThreadId: incoming.externalThreadId,\n senderId: incoming.senderId,\n senderName: incoming.senderName,\n messageId: contextString(incoming.platformContext.messageId),\n timestamp: incoming.timestamp,\n },\n };\n}\n\nexport async function enqueueRemoteCodeCommand(\n envelope: RemoteCodeCommandEnvelope,\n): Promise<RemoteCodeCommandResult> {\n const helperResult = await tryCoreRemoteCommandHelper(envelope);\n if (helperResult) return helperResult;\n\n const endpoint = `${resolveRemoteRelayBaseUrl()}/_agent-native/integrations/remote/enqueue`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(envelope),\n });\n\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n\n if (!response.ok) {\n const message =\n typeof body === \"object\" && body && \"error\" in body\n ? String((body as { error?: unknown }).error)\n : `remote relay returned ${response.status}`;\n throw new Error(message);\n }\n\n return normalizeRemoteCodeCommandResult(body);\n}\n\nexport function formatRemoteCodeCommandResult(\n command: Exclude<RemoteCodeCommand, { type: \"help\" }>,\n result: RemoteCodeCommandResult,\n): string {\n if (result.message?.trim()) return result.message.trim();\n if (result.error?.trim())\n return `Code command failed: ${result.error.trim()}`;\n\n if (command.type === \"list\") return formatRunList(result.runs ?? []);\n if (command.type === \"status\") return formatStatus(command, result);\n\n const id =\n result.runId ||\n result.run?.runId ||\n result.run?.id ||\n result.commandId ||\n result.requestId;\n const suffix = id ? ` (${id})` : \"\";\n const offline = isOfflineOrSleeping(result);\n\n if (command.type === \"create\") {\n return offline\n ? `Queued code run${suffix}. Your computer looks offline or asleep, so it will pick this up when it wakes.`\n : `Queued code run${suffix}.`;\n }\n\n if (command.type === \"continue\") {\n return offline\n ? `Queued follow-up for ${command.runRef}. Your computer looks offline or asleep, so it will pick this up when it wakes.`\n : `Queued follow-up for ${command.runRef}.`;\n }\n\n if (command.type === \"approve\") {\n return `Approved code-agent request ${command.approvalId}.`;\n }\n\n if (command.type === \"deny\") {\n return `Denied code-agent request ${command.approvalId}.`;\n }\n\n if (command.type === \"stop\") {\n return offline\n ? `Queued stop request for ${command.runRef}. Your computer looks offline or asleep, so it will receive the stop request when it wakes.`\n : `Stop requested for ${command.runRef}.`;\n }\n\n return \"Code command routed.\";\n}\n\nfunction parseCodeCommandBody(body: string): RemoteCodeCommand {\n if (!body) return { type: \"help\" };\n\n const [verbRaw = \"\", ...restParts] = body.split(/\\s+/);\n const verb = verbRaw.toLowerCase();\n const rest = restParts.join(\" \").trim();\n\n if (verb === \"help\") return { type: \"help\" };\n if (verb === \"list\") return { type: \"list\" };\n if (verb === \"status\") {\n return rest ? { type: \"status\", runRef: rest } : { type: \"status\" };\n }\n if (verb === \"continue\") {\n const { first, rest: text } = splitFirst(rest);\n if (!first || !text) {\n return { type: \"help\", reason: \"continue needs a run id and text\" };\n }\n return { type: \"continue\", runRef: first, text };\n }\n if (verb === \"approve\") {\n return rest\n ? { type: \"approve\", approvalId: rest }\n : { type: \"help\", reason: \"approve needs a request id\" };\n }\n if (verb === \"deny\") {\n return rest\n ? { type: \"deny\", approvalId: rest }\n : { type: \"help\", reason: \"deny needs a request id\" };\n }\n if (verb === \"stop\") {\n return rest\n ? { type: \"stop\", runRef: rest }\n : { type: \"help\", reason: \"stop needs a run id or list index\" };\n }\n\n return { type: \"create\", prompt: body };\n}\n\nfunction rawTelegramText(\n incoming: Pick<IncomingMessage, \"text\" | \"platformContext\">,\n): string | null {\n const context = incoming.platformContext;\n return (\n contextString(context.rawText) ||\n contextString(context.originalText) ||\n contextString(context.messageText) ||\n (CODE_COMMAND_RE.test(incoming.text) ? incoming.text : null)\n );\n}\n\nfunction formatCodeCommandHelp(\n command?: Extract<RemoteCodeCommand, { type: \"help\" }>,\n): string {\n const prefix = command?.reason ? `${command.reason}.\\n\\n` : \"\";\n return `${prefix}Use /code <prompt>, /code list, /code status [run], /code continue <run> <text>, /code approve <id>, /code deny <id>, or /code stop <run>.`;\n}\n\nfunction formatRunList(runs: RemoteCodeRunSummary[]): string {\n if (!runs.length) return \"No recent code-agent runs found.\";\n const lines = runs.slice(0, 8).map((run, index) => {\n const id = run.runId || run.id || \"unknown\";\n const title = run.title || run.prompt || \"Untitled run\";\n const status = run.status || \"unknown\";\n return `${index + 1}. ${title} — ${status} (${id})`;\n });\n return `Recent code-agent runs:\\n${lines.join(\"\\n\")}`;\n}\n\nfunction formatStatus(\n command: Extract<RemoteCodeCommand, { type: \"status\" }>,\n result: RemoteCodeCommandResult,\n): string {\n const run = result.run;\n const hostStatus =\n result.hostStatus || (result.hostOnline ? \"online\" : \"offline\");\n if (!run) {\n const target = command.runRef ? ` for ${command.runRef}` : \"\";\n return `Code-agent host is ${hostStatus}${target}.`;\n }\n\n const id = run.runId || run.id || command.runRef || \"unknown\";\n const title = run.title || run.prompt || \"Untitled run\";\n const status = run.status || result.status || \"unknown\";\n const updated = formatDate(run.updatedAt || run.createdAt);\n return [\n `Code run ${id}: ${status}`,\n `Task: ${title}`,\n `Host: ${hostStatus}`,\n updated ? `Updated: ${updated}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction isOfflineOrSleeping(result: RemoteCodeCommandResult): boolean {\n if (result.hostOnline === false) return true;\n const status = result.hostStatus?.toLowerCase();\n return status === \"offline\" || status === \"asleep\" || status === \"sleeping\";\n}\n\nfunction splitFirst(value: string): { first: string; rest: string } {\n const trimmed = value.trim();\n const match = trimmed.match(/^(\\S+)(?:\\s+([\\s\\S]+))?$/);\n return { first: match?.[1] || \"\", rest: match?.[2]?.trim() || \"\" };\n}\n\nfunction contextString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction formatDate(value: RemoteCodeRunSummary[\"updatedAt\"]): string | null {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toISOString();\n}\n\nasync function tryCoreRemoteCommandHelper(\n envelope: RemoteCodeCommandEnvelope,\n): Promise<RemoteCodeCommandResult | null> {\n const core = (await import(\"@agent-native/core/server\")) as Record<\n string,\n unknown\n >;\n const helper =\n core.enqueueRemoteCommand ||\n core.enqueueIntegrationRemoteCommand ||\n core.enqueueRemoteIntegrationCommand;\n if (typeof helper !== \"function\") return null;\n return normalizeRemoteCodeCommandResult(await helper(envelope));\n}\n\nfunction normalizeRemoteCodeCommandResult(\n value: unknown,\n): RemoteCodeCommandResult {\n if (!value || typeof value !== \"object\") return { ok: true };\n const result = value as RemoteCodeCommandResult;\n return {\n ok: result.ok,\n status: contextString(result.status),\n hostOnline:\n typeof result.hostOnline === \"boolean\" ? result.hostOnline : undefined,\n hostStatus: contextString(result.hostStatus),\n commandId: contextString(result.commandId),\n requestId: contextString(result.requestId),\n runId: contextString(result.runId),\n run: result.run,\n runs: Array.isArray(result.runs) ? result.runs : undefined,\n message: contextString(result.message),\n error: contextString(result.error),\n };\n}\n\nfunction resolveRemoteRelayBaseUrl(): string {\n const raw =\n process.env.WEBHOOK_BASE_URL ||\n process.env.APP_URL ||\n process.env.URL ||\n \"http://localhost:3000\";\n if (/^https?:\\/\\//i.test(raw)) return raw.replace(/\\/$/, \"\");\n return `https://${raw.replace(/\\/$/, \"\")}`;\n}\n"]}
|
|
@@ -101,6 +101,32 @@ export declare function getDestinationById(destinationId: string, ctx?: Dispatch
|
|
|
101
101
|
createdAt: number;
|
|
102
102
|
updatedAt: number;
|
|
103
103
|
}>;
|
|
104
|
+
export declare function createApprovalRequest(input: {
|
|
105
|
+
changeType: string;
|
|
106
|
+
targetType: string;
|
|
107
|
+
targetId?: string | null;
|
|
108
|
+
summary: string;
|
|
109
|
+
payload: unknown;
|
|
110
|
+
beforeValue?: unknown;
|
|
111
|
+
afterValue?: unknown;
|
|
112
|
+
}): Promise<{
|
|
113
|
+
id: string;
|
|
114
|
+
ownerEmail: string;
|
|
115
|
+
orgId: string;
|
|
116
|
+
changeType: string;
|
|
117
|
+
targetType: string;
|
|
118
|
+
targetId: string;
|
|
119
|
+
status: string;
|
|
120
|
+
summary: string;
|
|
121
|
+
payload: string;
|
|
122
|
+
beforeValue: string;
|
|
123
|
+
afterValue: string;
|
|
124
|
+
requestedBy: string;
|
|
125
|
+
reviewedBy: string;
|
|
126
|
+
reviewedAt: number;
|
|
127
|
+
createdAt: number;
|
|
128
|
+
updatedAt: number;
|
|
129
|
+
}>;
|
|
104
130
|
export declare function upsertDestination(input: DispatchDestinationInput): Promise<{
|
|
105
131
|
id: string;
|
|
106
132
|
ownerEmail: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-store.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAoFvD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAEf,YAAY,EAAE,MAAM;IADhD,QAAQ,CAAC,IAAI,uBAAuB;gBACR,YAAY,EAAE,MAAM;CAKjD;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAKD,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD;AAwBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAYzE;AA6BD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB;;;;;;;;;;;;;;;;;GAgBpE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,iBAeA;AAED,wBAAsB,eAAe,CAAC,KAAK,SAAK;;;;;;;;;;;KAgB/C;AAED,wBAAsB,gBAAgB;;;;;;;;;;;;KAerC;AAED,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,WAAkC;;;;;;;;;;;;GAcxC;
|
|
1
|
+
{"version":3,"file":"dispatch-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -295,7 +295,7 @@ async function notifyApprovers(requestId, summary) {
|
|
|
295
295
|
}),
|
|
296
296
|
}).catch(() => { });
|
|
297
297
|
}
|
|
298
|
-
async function createApprovalRequest(input) {
|
|
298
|
+
export async function createApprovalRequest(input) {
|
|
299
299
|
const db = getDb();
|
|
300
300
|
const timestamp = now();
|
|
301
301
|
const requestId = id();
|
|
@@ -397,6 +397,22 @@ async function applyApprovedRequest(request) {
|
|
|
397
397
|
if (request.changeType === "approval-policy.update") {
|
|
398
398
|
return applyApprovalPolicy(payload, request.reviewedBy || currentOwnerEmail());
|
|
399
399
|
}
|
|
400
|
+
if (request.changeType === "dream-proposal.apply") {
|
|
401
|
+
const { applyApprovedDreamProposal } = await import("./dreams-store.js");
|
|
402
|
+
return applyApprovedDreamProposal(payload.proposalId, request.reviewedBy || currentOwnerEmail(), requestCtx);
|
|
403
|
+
}
|
|
404
|
+
if (request.changeType === "workspace-resource.create") {
|
|
405
|
+
const { applyWorkspaceResourceCreate } = await import("./workspace-resources-store.js");
|
|
406
|
+
return applyWorkspaceResourceCreate(payload.input, request.reviewedBy || currentOwnerEmail(), requestCtx);
|
|
407
|
+
}
|
|
408
|
+
if (request.changeType === "workspace-resource.update") {
|
|
409
|
+
const { applyWorkspaceResourceUpdate } = await import("./workspace-resources-store.js");
|
|
410
|
+
return applyWorkspaceResourceUpdate(payload.id, payload.input, request.reviewedBy || currentOwnerEmail(), requestCtx);
|
|
411
|
+
}
|
|
412
|
+
if (request.changeType === "workspace-resource.delete") {
|
|
413
|
+
const { applyWorkspaceResourceDelete } = await import("./workspace-resources-store.js");
|
|
414
|
+
return applyWorkspaceResourceDelete(payload.id, request.reviewedBy || currentOwnerEmail(), requestCtx);
|
|
415
|
+
}
|
|
400
416
|
throw new Error(`Unsupported approval request type: ${request.changeType}`);
|
|
401
417
|
}
|
|
402
418
|
export async function approveRequest(requestId) {
|