chore: add current provisioning state before migration
This commit is contained in:
parent
a9703b4748
commit
50745b0f22
660 changed files with 88126 additions and 0 deletions
300
core/nulib/lib_provisioning/webhook/ai_webhook.nu
Normal file
300
core/nulib/lib_provisioning/webhook/ai_webhook.nu
Normal file
|
|
@ -0,0 +1,300 @@
|
|||
# AI Webhook Integration for Chat Interfaces
|
||||
# Provides AI-powered webhook endpoints for chat platforms
|
||||
|
||||
use std
|
||||
use ../ai/lib.nu *
|
||||
use ../settings/lib.nu get_settings
|
||||
|
||||
# Main webhook handler for AI-powered chat integration
|
||||
export def ai_webhook_handler [
|
||||
payload: record
|
||||
--platform: string = "generic"
|
||||
--debug
|
||||
] {
|
||||
if $debug {
|
||||
print $"Debug: Received webhook payload: ($payload | to json)"
|
||||
}
|
||||
|
||||
# Validate AI is enabled for webhooks
|
||||
let ai_config = (get_ai_config)
|
||||
if not $ai_config.enabled or not $ai_config.enable_webhook_ai {
|
||||
return {
|
||||
success: false
|
||||
message: "AI webhook processing is disabled"
|
||||
response: "🤖 AI is currently disabled for webhook integrations"
|
||||
}
|
||||
}
|
||||
|
||||
# Extract message and metadata based on platform
|
||||
let parsed = (parse_webhook_payload $payload $platform)
|
||||
|
||||
try {
|
||||
let ai_response = (ai_process_webhook $parsed.message $parsed.user_id $parsed.channel)
|
||||
|
||||
# Format response based on platform
|
||||
let formatted_response = (format_webhook_response $ai_response $platform $parsed)
|
||||
|
||||
{
|
||||
success: true
|
||||
message: "AI webhook processing successful"
|
||||
response: $formatted_response
|
||||
user_id: $parsed.user_id
|
||||
channel: $parsed.channel
|
||||
platform: $platform
|
||||
}
|
||||
} catch { |e|
|
||||
{
|
||||
success: false
|
||||
message: $"AI webhook processing failed: ($e.msg)"
|
||||
response: $"❌ Sorry, I encountered an error: ($e.msg)"
|
||||
user_id: $parsed.user_id
|
||||
channel: $parsed.channel
|
||||
platform: $platform
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Parse webhook payload based on platform
|
||||
def parse_webhook_payload [payload: record, platform: string] {
|
||||
match $platform {
|
||||
"slack" => {
|
||||
{
|
||||
message: ($payload.text? // $payload.event?.text? // "")
|
||||
user_id: ($payload.user? // $payload.event?.user? // "unknown")
|
||||
channel: ($payload.channel? // $payload.event?.channel? // "unknown")
|
||||
thread_ts: ($payload.thread_ts? // $payload.event?.thread_ts?)
|
||||
bot_id: ($payload.bot_id? // $payload.event?.bot_id?)
|
||||
}
|
||||
}
|
||||
"discord" => {
|
||||
{
|
||||
message: ($payload.content? // "")
|
||||
user_id: ($payload.author?.id? // "unknown")
|
||||
channel: ($payload.channel_id? // "unknown")
|
||||
guild_id: ($payload.guild_id?)
|
||||
message_id: ($payload.id?)
|
||||
}
|
||||
}
|
||||
"teams" => {
|
||||
{
|
||||
message: ($payload.text? // "")
|
||||
user_id: ($payload.from?.id? // "unknown")
|
||||
channel: ($payload.conversation?.id? // "unknown")
|
||||
conversation_type: ($payload.conversation?.conversationType?)
|
||||
}
|
||||
}
|
||||
"webhook" | "generic" => {
|
||||
{
|
||||
message: ($payload.message? // $payload.text? // $payload.content? // "")
|
||||
user_id: ($payload.user_id? // $payload.user? // "webhook-user")
|
||||
channel: ($payload.channel? // $payload.channel_id? // "webhook")
|
||||
metadata: $payload
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
{
|
||||
message: ($payload | to json)
|
||||
user_id: "unknown"
|
||||
channel: $platform
|
||||
raw_payload: $payload
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Format AI response for specific platforms
|
||||
def format_webhook_response [response: string, platform: string, context: record] {
|
||||
match $platform {
|
||||
"slack" => {
|
||||
let blocks = [
|
||||
{
|
||||
type: "section"
|
||||
text: {
|
||||
type: "mrkdwn"
|
||||
text: $response
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
if ($context.thread_ts? != null) {
|
||||
{
|
||||
text: $response
|
||||
blocks: $blocks
|
||||
thread_ts: $context.thread_ts
|
||||
}
|
||||
} else {
|
||||
{
|
||||
text: $response
|
||||
blocks: $blocks
|
||||
}
|
||||
}
|
||||
}
|
||||
"discord" => {
|
||||
{
|
||||
content: $response
|
||||
embeds: [
|
||||
{
|
||||
title: "🤖 AI Infrastructure Assistant"
|
||||
description: $response
|
||||
color: 3447003
|
||||
footer: {
|
||||
text: "Powered by Provisioning AI"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
"teams" => {
|
||||
{
|
||||
type: "message"
|
||||
text: $response
|
||||
attachments: [
|
||||
{
|
||||
contentType: "application/vnd.microsoft.card.adaptive"
|
||||
content: {
|
||||
type: "AdaptiveCard"
|
||||
version: "1.0"
|
||||
body: [
|
||||
{
|
||||
type: "TextBlock"
|
||||
text: "🤖 AI Infrastructure Assistant"
|
||||
weight: "bolder"
|
||||
}
|
||||
{
|
||||
type: "TextBlock"
|
||||
text: $response
|
||||
wrap: true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
{
|
||||
message: $response
|
||||
timestamp: (date now | format date "%Y-%m-%d %H:%M:%S")
|
||||
ai_powered: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Slack-specific webhook handler
|
||||
export def slack_webhook [payload: record, --debug] {
|
||||
# Handle Slack challenge verification
|
||||
if "challenge" in $payload {
|
||||
return {
|
||||
challenge: $payload.challenge
|
||||
}
|
||||
}
|
||||
|
||||
# Skip bot messages to prevent loops
|
||||
if ($payload.event?.bot_id? != null) or ($payload.bot_id? != null) {
|
||||
return { success: true, message: "Ignored bot message" }
|
||||
}
|
||||
|
||||
ai_webhook_handler $payload --platform "slack" --debug $debug
|
||||
}
|
||||
|
||||
# Discord-specific webhook handler
|
||||
export def discord_webhook [payload: record, --debug] {
|
||||
# Skip bot messages to prevent loops
|
||||
if ($payload.author?.bot? == true) {
|
||||
return { success: true, message: "Ignored bot message" }
|
||||
}
|
||||
|
||||
ai_webhook_handler $payload --platform "discord" --debug $debug
|
||||
}
|
||||
|
||||
# Microsoft Teams-specific webhook handler
|
||||
export def teams_webhook [payload: record, --debug] {
|
||||
# Skip messages from bots
|
||||
if ($payload.from?.name? | str contains "bot") {
|
||||
return { success: true, message: "Ignored bot message" }
|
||||
}
|
||||
|
||||
ai_webhook_handler $payload --platform "teams" --debug $debug
|
||||
}
|
||||
|
||||
# Generic webhook handler
|
||||
export def generic_webhook [payload: record, --debug] {
|
||||
ai_webhook_handler $payload --platform "webhook" --debug $debug
|
||||
}
|
||||
|
||||
# Webhook server using nushell http server
|
||||
export def start_webhook_server [
|
||||
--port: int = 8080
|
||||
--host: string = "0.0.0.0"
|
||||
--debug
|
||||
] {
|
||||
if not (is_ai_enabled) {
|
||||
error make {msg: "AI is not enabled - cannot start webhook server"}
|
||||
}
|
||||
|
||||
let ai_config = (get_ai_config)
|
||||
if not $ai_config.enable_webhook_ai {
|
||||
error make {msg: "AI webhook processing is disabled"}
|
||||
}
|
||||
|
||||
print $"🤖 Starting AI webhook server on ($host):($port)"
|
||||
print "Available endpoints:"
|
||||
print " POST /webhook/slack - Slack integration"
|
||||
print " POST /webhook/discord - Discord integration"
|
||||
print " POST /webhook/teams - Microsoft Teams integration"
|
||||
print " POST /webhook/generic - Generic webhook"
|
||||
print " GET /health - Health check"
|
||||
print ""
|
||||
|
||||
# Note: This is a conceptual implementation
|
||||
# In practice, you'd use a proper web server
|
||||
print "⚠️ This is a conceptual webhook server."
|
||||
print "For production use, integrate with a proper HTTP server like:"
|
||||
print " - nginx with nushell CGI"
|
||||
print " - Custom HTTP server with nushell backend"
|
||||
print " - Serverless functions calling nushell scripts"
|
||||
}
|
||||
|
||||
# Health check endpoint
|
||||
export def webhook_health_check [] {
|
||||
let ai_config = (get_ai_config)
|
||||
let ai_test = (test_ai_connection)
|
||||
|
||||
{
|
||||
status: "healthy"
|
||||
ai_enabled: $ai_config.enabled
|
||||
ai_webhook_enabled: $ai_config.enable_webhook_ai
|
||||
ai_provider: $ai_config.provider
|
||||
ai_connection: $ai_test.success
|
||||
timestamp: (date now | format date "%Y-%m-%d %H:%M:%S")
|
||||
version: "provisioning-ai-v1.0"
|
||||
}
|
||||
}
|
||||
|
||||
# Process command-line webhook for testing
|
||||
export def test_webhook [
|
||||
message: string
|
||||
--platform: string = "generic"
|
||||
--user: string = "test-user"
|
||||
--channel: string = "test-channel"
|
||||
--debug
|
||||
] {
|
||||
let payload = {
|
||||
message: $message
|
||||
user_id: $user
|
||||
channel: $channel
|
||||
timestamp: (date now | format date "%Y-%m-%d %H:%M:%S")
|
||||
test: true
|
||||
}
|
||||
|
||||
let result = (ai_webhook_handler $payload --platform $platform --debug $debug)
|
||||
|
||||
print $"Platform: ($platform)"
|
||||
print $"User: ($user)"
|
||||
print $"Channel: ($channel)"
|
||||
print $"Message: ($message)"
|
||||
print ""
|
||||
print "AI Response:"
|
||||
print $result.response
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue