253 lines
8.6 KiB
YAML
253 lines
8.6 KiB
YAML
# ═══════════════════════════════════════════════
|
||
# 🔺 Sovereign: TCS-0002∞ | Root: SYS-GLW-0001
|
||
# 📜 Copyright: 国作登字-2026-A-00037559
|
||
# ═══════════════════════════════════════════════
|
||
name: Persona Invoke Endpoint
|
||
# 🔗 Phase B2 · Notion Agent → 铸渊人格体唤醒
|
||
#
|
||
# Notion Agent 通过 workflow_dispatch 触发此工作流,
|
||
# 等效于 POST /api/persona/invoke 接口。
|
||
#
|
||
# 完整流程:
|
||
# ① Notion Agent 发送 workflow_dispatch(传入工单信息)
|
||
# ② 铸渊 Agent 从 Notion 读取工单内容
|
||
# ③ 唤醒人格体(Claude API)处理 SYSLOG
|
||
# ④ 处理结果写回 Notion 工单(receipt_status = completed)
|
||
# ⑤ 广播文件推送到 GitHub 仓库 broadcasts/{dev_id}/
|
||
#
|
||
# 依赖 Secrets:
|
||
# LLM_API_KEY 第三方 LLM 平台密钥
|
||
# LLM_BASE_URL 第三方 LLM 平台 API 地址
|
||
# NOTION_API_TOKEN Notion API token
|
||
# NOTION_TICKET_DB_ID 工单队列数据库 ID
|
||
# CORE_BRAIN_PAGE_ID 曜冥核心大脑 v4.0 页面 ID
|
||
# PORTRAIT_DB_ID 开发者动态画像库 ID
|
||
# FINGERPRINT_DB_ID 模块指纹注册表 ID
|
||
# INVOKE_API_KEY 调用鉴权密钥
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
work_order_id:
|
||
description: 'Notion 工单页面 ID'
|
||
required: true
|
||
type: string
|
||
task_id:
|
||
description: '广播编号(如 BC-M23-001-AW)'
|
||
required: true
|
||
type: string
|
||
developer:
|
||
description: '开发者信息(如 DEV-012 Awen)'
|
||
required: false
|
||
default: 'unknown'
|
||
type: string
|
||
syslog_raw:
|
||
description: 'SYSLOG JSON 原文(可选,如为空则从 Notion 读取)'
|
||
required: false
|
||
default: ''
|
||
type: string
|
||
action:
|
||
description: '动作类型'
|
||
required: false
|
||
default: 'process_syslog'
|
||
type: string
|
||
|
||
jobs:
|
||
invoke:
|
||
name: 🔗 唤醒人格体处理 SYSLOG
|
||
runs-on: ubuntu-latest
|
||
permissions:
|
||
contents: write
|
||
|
||
steps:
|
||
- name: Checkout
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
- name: Install dependencies
|
||
run: npm ci --ignore-scripts
|
||
|
||
- name: 🔍 模块验证
|
||
id: verify
|
||
env:
|
||
SYSLOG_CONTENT: ${{ inputs.syslog_raw }}
|
||
BROADCAST_ID: ${{ inputs.task_id }}
|
||
AUTHOR: ${{ inputs.developer }}
|
||
run: node scripts/verify-modules.js
|
||
|
||
- name: 🧠 唤醒人格体
|
||
id: persona
|
||
env:
|
||
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
||
LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}
|
||
BROADCAST_ID: ${{ inputs.task_id }}
|
||
SUBMIT_TYPE: syslog
|
||
SUBMIT_CONTENT: ${{ inputs.syslog_raw }}
|
||
AUTHOR: ${{ inputs.developer }}
|
||
MODULE_VERIFY_RESULT: ${{ steps.verify.outputs.verify_report }}
|
||
NOTION_TOKEN: ${{ secrets.NOTION_API_KEY }}
|
||
CORE_BRAIN_PAGE_ID: ${{ secrets.CORE_BRAIN_PAGE_ID }}
|
||
PORTRAIT_DB_ID: ${{ secrets.PORTRAIT_DB_ID }}
|
||
FINGERPRINT_DB_ID: ${{ secrets.FINGERPRINT_DB_ID }}
|
||
run: node scripts/wake-persona.js
|
||
|
||
- name: 📝 回写 Notion 工单
|
||
if: always()
|
||
env:
|
||
NOTION_TOKEN: ${{ secrets.NOTION_API_KEY }}
|
||
WORK_ORDER_ID: ${{ inputs.work_order_id }}
|
||
PERSONA_RESULT: ${{ steps.persona.outputs.result }}
|
||
TASK_ID: ${{ inputs.task_id }}
|
||
run: |
|
||
node -e "
|
||
var https = require('https');
|
||
|
||
var token = process.env.NOTION_TOKEN || '';
|
||
var workOrderId = process.env.WORK_ORDER_ID || '';
|
||
var result = process.env.PERSONA_RESULT || '(no result)';
|
||
var taskId = process.env.TASK_ID || '';
|
||
|
||
if (!token || !workOrderId) {
|
||
console.log('⚠️ 缺少 Notion 配置,跳过回写');
|
||
process.exit(0);
|
||
}
|
||
|
||
// 更新工单状态为 ✅ 已完成
|
||
var body = JSON.stringify({
|
||
properties: {
|
||
'状态': { select: { name: '✅ 已完成' } }
|
||
}
|
||
});
|
||
|
||
var opts = {
|
||
hostname: 'api.notion.com',
|
||
port: 443,
|
||
path: '/v1/pages/' + workOrderId,
|
||
method: 'PATCH',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + token,
|
||
'Content-Type': 'application/json',
|
||
'Notion-Version': '2022-06-28',
|
||
'Content-Length': Buffer.byteLength(body)
|
||
}
|
||
};
|
||
|
||
var req = https.request(opts, function(res) {
|
||
var data = '';
|
||
res.on('data', function(c) { data += c; });
|
||
res.on('end', function() {
|
||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||
console.log('✅ 工单状态已更新为 ✅ 已完成');
|
||
} else {
|
||
console.log('⚠️ 工单状态更新失败: ' + res.statusCode);
|
||
}
|
||
});
|
||
});
|
||
req.on('error', function(e) { console.log('⚠️ ' + e.message); });
|
||
req.write(body);
|
||
req.end();
|
||
|
||
// 追加处理结果到工单
|
||
var appendBody = JSON.stringify({
|
||
children: [{
|
||
object: 'block',
|
||
type: 'heading_2',
|
||
heading_2: {
|
||
rich_text: [{ type: 'text', text: { content: '🧠 人格体处理结果 · receipt_status: completed' } }]
|
||
}
|
||
}, {
|
||
object: 'block',
|
||
type: 'paragraph',
|
||
paragraph: {
|
||
rich_text: [{ type: 'text', text: { content: result.slice(0, 2000) } }]
|
||
}
|
||
}]
|
||
});
|
||
|
||
var appendOpts = {
|
||
hostname: 'api.notion.com',
|
||
port: 443,
|
||
path: '/v1/blocks/' + workOrderId + '/children',
|
||
method: 'PATCH',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + token,
|
||
'Content-Type': 'application/json',
|
||
'Notion-Version': '2022-06-28',
|
||
'Content-Length': Buffer.byteLength(appendBody)
|
||
}
|
||
};
|
||
|
||
var req2 = https.request(appendOpts, function(res) {
|
||
var data = '';
|
||
res.on('data', function(c) { data += c; });
|
||
res.on('end', function() {
|
||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||
console.log('✅ 处理结果已追加到工单');
|
||
} else {
|
||
console.log('⚠️ 结果追加失败: ' + res.statusCode);
|
||
}
|
||
});
|
||
});
|
||
req2.on('error', function(e) { console.log('⚠️ ' + e.message); });
|
||
req2.write(appendBody);
|
||
req2.end();
|
||
"
|
||
|
||
- name: 📡 推送广播到 GitHub
|
||
if: steps.persona.outcome == 'success'
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
BROADCAST_ID: ${{ inputs.task_id }}
|
||
DEVELOPER_ID: ''
|
||
DEVELOPER_NAME: ${{ inputs.developer }}
|
||
BROADCAST_CONTENT: ${{ steps.persona.outputs.result }}
|
||
run: node scripts/push-broadcast-to-github.js
|
||
|
||
- name: 🔴 失败处理
|
||
if: failure()
|
||
env:
|
||
NOTION_TOKEN: ${{ secrets.NOTION_API_KEY }}
|
||
WORK_ORDER_ID: ${{ inputs.work_order_id }}
|
||
run: |
|
||
node -e "
|
||
var https = require('https');
|
||
var token = process.env.NOTION_TOKEN || '';
|
||
var workOrderId = process.env.WORK_ORDER_ID || '';
|
||
|
||
if (!token || !workOrderId) process.exit(0);
|
||
|
||
var body = JSON.stringify({
|
||
properties: {
|
||
'状态': { select: { name: '⚠️ 异常·等人工介入' } }
|
||
}
|
||
});
|
||
|
||
var opts = {
|
||
hostname: 'api.notion.com',
|
||
port: 443,
|
||
path: '/v1/pages/' + workOrderId,
|
||
method: 'PATCH',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + token,
|
||
'Content-Type': 'application/json',
|
||
'Notion-Version': '2022-06-28',
|
||
'Content-Length': Buffer.byteLength(body)
|
||
}
|
||
};
|
||
|
||
var req = https.request(opts, function(res) {
|
||
var data = '';
|
||
res.on('data', function(c) { data += c; });
|
||
res.on('end', function() {
|
||
console.log('工单状态已标记为 ⚠️ 异常');
|
||
});
|
||
});
|
||
req.on('error', function(e) { console.log(e.message); });
|
||
req.write(body);
|
||
req.end();
|
||
"
|