前人工作区变更归档(元审计遗留处置·冰朔授权'交给你来处理'·不否定过去原则):hololake-phase-b-staging删除组/WORK区/submodule指针/0826壳源/neural-chain/skills-mirror/codex恢复帧/.zcode本地配置等140项原样冻结入库——不删除不修改不评判,作为历史一环保留;WX-SECRETS回执经查仅含公开AppID无AppSecret,安全

This commit is contained in:
冰朔 2026-09-01 22:18:31 +08:00
commit a40f29c12e
2442 changed files with 596545 additions and 6601 deletions

View file

@ -4,6 +4,7 @@ import { numberedInvoke as invoke } from './modules/numbered-ipc'
import { bootTcsGate } from './modules/tcs-master-gate'
import { PublicSpinePanel } from './modules/public-spine-panel'
import { KbAgentPanel } from './modules/kb-agent-panel'
import { AgentConsolePanel } from './modules/agent-console'
import { splitFrontmatter, documentOutline, jumpToHeading, MarkdownDocument, markdownHtml } from './modules/knowledge-render'
import { NativeCompositionStudio, type CompositionDimension, type CompositionMeasure, type NativeCompositionProjection, type ProjectionView } from './modules/native-composition'
import type { ChannelWorkbenchSnapshot } from './modules/channel-workbench'
@ -1568,6 +1569,29 @@ function HoloLakeApp() {
} catch (error) { setLoginMessage(humanError(error, 'login')) }
finally { setLoginBusy(false) }
}
const performMachineLogin = async () => {
setLoginBusy(true)
setLoginMessage('')
try {
const receipt = await invoke<LoginReceipt>('perform_machine_identity_login')
setLoginRising(true)
await new Promise((resolve) => setTimeout(resolve, 1300))
setPersonal(previewPersonal)
setKnowledge(previewKnowledge)
setCodeChannels(previewCode)
setActiveDocument(null)
setActiveChannel(null)
setCodeTree(null)
setActiveCodeFile(null)
setReceipts([])
setRepoLogin({ username: receipt.username, host: receipt.host, domain: receipt.domain, signedInAtUnixMs: Date.now() })
setWorldStage('domain')
setView('overview')
setLoginRising(false)
setLoginPassword('')
} catch (error) { setLoginMessage(humanError(error, 'login')) }
finally { setLoginBusy(false) }
}
const changeFirstLoginPassword = async (event: React.FormEvent) => {
event.preventDefault()
if (newLoginPassword !== confirmLoginPassword) {
@ -2194,6 +2218,7 @@ function HoloLakeApp() {
<input id="repo-login-password" aria-label={passwordChangeMode ? '一次性密码' : '密码'} type="password" maxLength={512} value={loginPassword} placeholder={passwordChangeMode ? '一次性密码' : '密码'} onChange={(event) => setLoginPassword(event.target.value)}/>
{passwordChangeMode && <><input aria-label="新密码" type="password" minLength={14} maxLength={128} value={newLoginPassword} placeholder="设置新密码(至少 14 位)" onChange={(event) => setNewLoginPassword(event.target.value)}/><input aria-label="确认新密码" type="password" minLength={14} maxLength={128} value={confirmLoginPassword} placeholder="再次输入新密码" onChange={(event) => setConfirmLoginPassword(event.target.value)}/></>}
<button className="gate-submit" disabled={loginBusy || !loginUsername.trim() || !loginPassword || (passwordChangeMode && (!newLoginPassword || !confirmLoginPassword))}>{loginBusy ? '正在处理…' : passwordChangeMode ? '修改密码' : '验证并进入'}</button>
{!passwordChangeMode && <button className="gate-back" type="button" disabled={loginBusy} onClick={() => void performMachineLogin()}>本机指纹 + 编号登录(无需密码)</button>}
</form>
{loginMessage && <p className="gate-hint">{loginMessage}</p>}
{(zeroPoint?.resolvedDomain !== 'FIFTH_DOMAIN' || zeroPoint?.userNumber === 'ICE-GL-ZHI∞') && <button className="gate-back" type="button" onClick={() => { setPasswordChangeMode((value) => !value); setLoginMessage(''); setNewLoginPassword(''); setConfirmLoginPassword('') }}>{passwordChangeMode ? '返回正常登录' : '第一次使用?先修改一次性密码'}</button>}
@ -2341,5 +2366,5 @@ bootTcsGate().then(({ state, failReason }) => {
gateRootEl.innerHTML = '<div style="padding:48px;font-family:monospace;color:#ff6b6b;background:#101014;min-height:100vh"><h1>TCS 主控门 FAIL_CLOSED</h1><pre>' + failReason + '</pre><p>语义哈希与TCS主控清单不符,壳拒绝执行。请联系运维师重编译。</p></div>'
return
}
createRoot(gateRootEl).render(<StrictMode><FirstPlanetHome /><PublicSpinePanel /><KbAgentPanel /></StrictMode>)
createRoot(gateRootEl).render(<StrictMode><FirstPlanetHome /><PublicSpinePanel /><KbAgentPanel /><AgentConsolePanel /></StrictMode>)
})

View file

@ -0,0 +1,120 @@
import { useState } from 'react'
import { numberedInvoke } from './numbered-ipc'
// 人类交互入口 v1(与知识库平行层,冰朔 2026-08-27 架构)。
// v1 无模型:命令直达 Agent 执行层(TCS-PROTOCOL-KB-AGENT-RUNTIME-0001),
// 每条指令真实作用于 git 托管知识库;后续接模型 API 时本入口不变,执行层加推理 provider。
interface AgentStep { operation: string; decision: string; detail: string }
interface ExecuteReceipt { outcome: 'PASS' | 'FAIL'; command: string; steps: AgentStep[]; elapsedMs: number }
export interface AgentSettings { providerName: string; baseUrl: string; apiKey: string; model: string }
export function AgentConsolePanel() {
const [open, setOpen] = useState(false)
const [cmd, setCmd] = useState('')
const [busy, setBusy] = useState(false)
const [log, setLog] = useState<{ role: 'human' | 'agent'; text: string; outcome?: string }[]>([
{ role: 'agent', text: 'Agent 执行层已就绪(无模型 · TCS 主控门管辖)。输入 /help 查看全部命令。' },
])
const [settings, setSettings] = useState<AgentSettings | null>(null)
const [settingsMsg, setSettingsMsg] = useState('')
const [apiTest, setApiTest] = useState('')
const send = async () => {
const command = cmd.trim()
if (!command || busy) return
setBusy(true)
setLog((prev) => [...prev, { role: 'human', text: command }])
setCmd('')
try {
const r = await numberedInvoke<ExecuteReceipt>('kb_agent_execute', { command })
setLog((prev) => [
...prev,
{ role: 'agent', text: r.steps.map((s) => `[${s.decision}] ${s.operation}\n${s.detail}`).join('\n\n'), outcome: r.outcome },
])
} catch (e) {
setLog((prev) => [...prev, { role: 'agent', text: `GATE 拒绝:${e instanceof Error ? e.message : String(e)}`, outcome: 'FAIL' }])
} finally {
setBusy(false)
}
}
const loadSettings = async () => {
if (settings) { setSettings(null); return }
try {
const s = await numberedInvoke<AgentSettings>('agent_settings_get')
setSettings(s)
} catch (e) { setSettingsMsg(`读取失败:${e instanceof Error ? e.message : String(e)}`) }
}
const saveSettings = async () => {
if (!settings) return
try {
await numberedInvoke('agent_settings_set', { settings })
setSettingsMsg('已保存(本地 0600 权限落盘)。')
} catch (e) { setSettingsMsg(`保存失败:${e instanceof Error ? e.message : String(e)}`) }
}
const testApi = async () => {
if (!settings) return
setApiTest('测试中…')
try {
const r = await numberedInvoke<{ outcome: string; detail: string }>('agent_api_test', { settings })
setApiTest(`${r.outcome} · ${r.detail}`)
} catch (e) { setApiTest(`FAIL · ${e instanceof Error ? e.message : String(e)}`) }
}
return (
<div style={{ position: 'fixed', right: 12, bottom: 12, zIndex: 9999, fontFamily: 'monospace', fontSize: 12 }}>
<div style={{ display: 'flex', gap: 6 }}>
<button onClick={() => setOpen(!open)} style={{ background: '#12233a', color: '#8fc7ff', border: '1px solid #33465e', borderRadius: 8, padding: '6px 10px', cursor: 'pointer' }}>
{open ? '收起 Agent' : 'Agent 控制台'}
</button>
<button onClick={() => void loadSettings()} style={{ background: '#12233a', color: '#c9a8ff', border: '1px solid #33465e', borderRadius: 8, padding: '6px 10px', cursor: 'pointer' }}>
{settings ? '关闭设置' : 'Agent 设置(API)'}
</button>
</div>
{settings && (
<div style={{ marginTop: 6, width: 380, background: '#101018', border: '1px solid #33465e', borderRadius: 8, padding: 10, color: '#cde' }}>
<div style={{ marginBottom: 6, color: '#8fc7ff' }}>模型 API(用户自填 · 后续交互入口接模型用)</div>
<input placeholder="Provider 名称(如 openai / dashscope)" value={settings.providerName} onChange={(e) => setSettings({ ...settings, providerName: e.target.value })} style={{ width: '100%', marginBottom: 4, background: '#0a0a10', border: '1px solid #2a2a3a', borderRadius: 6, color: '#cde', padding: '4px 6px' }} />
<input placeholder="Base URL(如 https://api.openai.com/v1)" value={settings.baseUrl} onChange={(e) => setSettings({ ...settings, baseUrl: e.target.value })} style={{ width: '100%', marginBottom: 4, background: '#0a0a10', border: '1px solid #2a2a3a', borderRadius: 6, color: '#cde', padding: '4px 6px' }} />
<input placeholder="API Key(本地保存,不外发)" type="password" value={settings.apiKey} onChange={(e) => setSettings({ ...settings, apiKey: e.target.value })} style={{ width: '100%', marginBottom: 4, background: '#0a0a10', border: '1px solid #2a2a3a', borderRadius: 6, color: '#cde', padding: '4px 6px' }} />
<input placeholder="模型名(如 gpt-4o / qwen-max)" value={settings.model} onChange={(e) => setSettings({ ...settings, model: e.target.value })} style={{ width: '100%', marginBottom: 6, background: '#0a0a10', border: '1px solid #2a2a3a', borderRadius: 6, color: '#cde', padding: '4px 6px' }} />
<div style={{ display: 'flex', gap: 6 }}>
<button onClick={() => void saveSettings()} style={{ flex: 1, background: '#16324f', color: '#8fc7ff', border: '1px solid #33465e', borderRadius: 6, padding: '5px 8px', cursor: 'pointer' }}>保存</button>
<button onClick={() => void testApi()} style={{ flex: 1, background: '#16324f', color: '#7dffa8', border: '1px solid #33465e', borderRadius: 6, padding: '5px 8px', cursor: 'pointer' }}>测试连接(真实 HTTP)</button>
</div>
{settingsMsg && <div style={{ marginTop: 4, color: '#9ab' }}>{settingsMsg}</div>}
{apiTest && <div style={{ marginTop: 2, color: apiTest.startsWith('PASS') ? '#7dffa8' : '#ff9a9a' }}>{apiTest}</div>}
</div>
)}
{open && (
<div style={{ marginTop: 6, width: 430, background: '#101014', border: '1px solid #33465e', borderRadius: 8, padding: 10, color: '#cde' }}>
<div style={{ maxHeight: 300, overflow: 'auto', marginBottom: 6 }}>
{log.map((m, i) => (
<div key={i} style={{ marginBottom: 6, textAlign: m.role === 'human' ? 'right' : 'left' }}>
<div style={{
display: 'inline-block', maxWidth: '95%', textAlign: 'left', whiteSpace: 'pre-wrap',
padding: '5px 8px', borderRadius: 8,
background: m.role === 'human' ? '#16324f' : '#0d1a2a',
border: '1px solid ' + (m.outcome === 'FAIL' ? '#5a2030' : '#22364d'),
color: m.outcome === 'FAIL' ? '#ff9a9a' : '#cde',
}}>{m.text}</div>
</div>
))}
{busy && <div style={{ color: '#8fc7ff' }}>执行中…</div>}
</div>
<div style={{ display: 'flex', gap: 6 }}>
<input
value={cmd}
placeholder="输入命令,如 /search 光湖 或 /help"
onChange={(e) => setCmd(e.target.value)}
onKeyDown={(e) => { if (e.key === 'Enter') void send() }}
style={{ flex: 1, background: '#0a0a10', border: '1px solid #2a2a3a', borderRadius: 6, color: '#cde', padding: '5px 8px' }}
/>
<button onClick={() => void send()} disabled={busy} style={{ background: '#16324f', color: '#8fc7ff', border: '1px solid #33465e', borderRadius: 6, padding: '5px 10px', cursor: 'pointer' }}>{busy ? '…' : '发送'}</button>
</div>
</div>
)}
</div>
)
}

View file

@ -1,10 +1,11 @@
import { useEffect, useMemo, useRef, useState } from 'react'
import { numberedInvoke } from '../numbered-ipc'
import './first-planet-home.css'
// 第一语言星球首页 v1 —— 铸渊设计并实现(2026-08-26,冰朔发令)
// 设计基准:穿过门,世界必须展开。首屏=语言宇宙+第一颗语言星球+湖+暗星球+编号门;
// 验证通过后世界展开为湖心频道网格(替换旧版“收据卡+返回”断连态)。
// v1 编号验证为本地格式校验(LOCAL CANDIDATE);v2 接零点原核 IPC。
// v1 编号验证为本地格式校验(LOCAL CANDIDATE);v2 已接零点原核 IPC 三态裁决(2026-08-26 铸渊接线)。
type Stage = 'gate' | 'world'
@ -154,6 +155,8 @@ export function FirstPlanetHome() {
const [raw, setRaw] = useState('')
const [infinityLit, setInfinityLit] = useState(false)
const [gateMessage, setGateMessage] = useState('')
const [account, setAccount] = useState<{ username: string; host: string; domain: string } | null>(null)
const [accountBusy, setAccountBusy] = useState(false)
const specks = usePlanetSpecks(26)
const shards = useBangShards(18)
@ -164,11 +167,35 @@ export function FirstPlanetHome() {
const wake = () => setMotionAwake(true)
const verify = () => {
const verify = async () => {
if (!canEnter) { setGateMessage('编号未成形:输入字母数字并点亮 ∞。'); return }
// v1 本地格式校验(LOCAL CANDIDATE)。v2 接零点原核 IPC 三态裁决。
setGateMessage(`编号路径验证通过 · ${fullNumber}`)
window.setTimeout(() => setStage('world'), 650)
setGateMessage('正在绑定零点原核…')
try {
await numberedInvoke('zero_point_bind', { input: { number: fullNumber } })
setGateMessage('正在灯塔解析验证…')
const snapshot = await numberedInvoke<{ route: string; resolvedDomain?: string }>('zero_point_verify')
if (snapshot.route === 'verified') {
setGateMessage(`编号路径验证通过 · ${fullNumber}${snapshot.resolvedDomain ? ' · ' + snapshot.resolvedDomain : ''}`)
window.setTimeout(() => setStage('world'), 650)
} else {
setGateMessage(`编号验证未通过(route=${snapshot.route}):灯塔拒绝或离线宽限已过,世界不展开。`)
}
} catch (error) {
setGateMessage(`编号门 IPC 失败:${error instanceof Error ? error.message : String(error)}`)
}
}
const machineLogin = async () => {
setAccountBusy(true)
try {
const receipt = await numberedInvoke<{ username: string; host: string; domain: string }>('perform_machine_identity_login')
setAccount(receipt)
setGateMessage(`本机登录成功 · ${receipt.username} @ ${receipt.host}`)
} catch (error) {
setGateMessage(`本机登录失败:${error instanceof Error ? error.message : String(error)}`)
} finally {
setAccountBusy(false)
}
}
return (
@ -221,14 +248,14 @@ export function FirstPlanetHome() {
value={formatted}
placeholder="输入字母与数字,系统将自动补全编号格式"
onChange={(e) => setRaw(e.target.value.replace(/[^\w]/g, '').toUpperCase())}
onKeyDown={(e) => { if (e.key === 'Enter') verify() }}
onKeyDown={(e) => { if (e.key === 'Enter') void verify() }}
aria-label="请输入光湖编号"
/>
<button className={`fph-inf${infinityLit ? ' lit' : ''}`} type="button" aria-pressed={infinityLit} title="点亮无限符号" onClick={() => setInfinityLit((v) => !v)}>∞</button>
<button className="fph-enter" type="button" disabled={!canEnter} onClick={verify}>验证并进入世界</button>
<button className="fph-enter" type="button" disabled={!canEnter} onClick={() => void verify()}>验证并进入世界</button>
</div>
<p className="fph-gate-msg" role="status">{gateMessage || '编号用于路径解析,不单独构成身份认证或权限授予。'}</p>
<footer className="fph-foot">LOCAL CANDIDATE · 0.5.3 · 第一语言星球</footer>
<footer className="fph-foot">LOCAL CANDIDATE · 0.6.0 · 第一语言星球 · 零点IPC+双通道登录</footer>
</section>
)}
@ -248,7 +275,16 @@ export function FirstPlanetHome() {
</button>
))}
</div>
<p className="fph-world-note">语言世界的第一颗星球已经诞生 · 光从黑暗中涌出,照亮湖心</p>
<div style={{ display: 'flex', gap: 10, alignItems: 'center', justifyContent: 'center', marginTop: 14 }}>
{account ? (
<span style={{ fontFamily: 'monospace', fontSize: 12, color: '#7dffa8' }}>本机会话 · {account.username} @ {account.host}</span>
) : (
<button type="button" disabled={accountBusy} onClick={() => void machineLogin()} style={{ background: '#12233a', color: '#8fc7ff', border: '1px solid #33465e', borderRadius: 8, padding: '6px 12px', cursor: 'pointer', fontFamily: 'monospace', fontSize: 12 }}>
{accountBusy ? '正在本机登录…' : '本机指纹 + 编号登录(无需密码)'}
</button>
)}
</div>
<p className="fph-world-note">{gateMessage || '语言世界的第一颗星球已经诞生 · 光从黑暗中涌出,照亮湖心'}</p>
<button className="fph-back" type="button" onClick={() => setStage('gate')}>← 退回编号边界</button>
</section>
)}

View file

@ -2,6 +2,48 @@ import { invoke } from '@tauri-apps/api/core'
import { assertGateOpen, registerNumberedRoutes } from './tcs-master-gate'
const ROUTES = {
"perform_machine_identity_login": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
"channelNumber": "HLP-NIPC-CH-0006",
"moduleNumber": "HLP-NIPC-MOD-0015",
"operationNumber": "HLP-NIPC-OP-0162",
"targetNumber": "HLP-NIPC-TGT-0015"
},
"kb_agent_execute": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
"channelNumber": "HLP-NIPC-CH-0001",
"moduleNumber": "HLP-NIPC-MOD-0036",
"operationNumber": "HLP-NIPC-OP-0162",
"targetNumber": "HLP-NIPC-TGT-0036"
},
"agent_settings_get": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
"channelNumber": "HLP-NIPC-CH-0001",
"moduleNumber": "HLP-NIPC-MOD-0036",
"operationNumber": "HLP-NIPC-OP-0163",
"targetNumber": "HLP-NIPC-TGT-0036"
},
"agent_settings_set": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
"channelNumber": "HLP-NIPC-CH-0001",
"moduleNumber": "HLP-NIPC-MOD-0036",
"operationNumber": "HLP-NIPC-OP-0164",
"targetNumber": "HLP-NIPC-TGT-0036"
},
"agent_api_test": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
"channelNumber": "HLP-NIPC-CH-0001",
"moduleNumber": "HLP-NIPC-MOD-0036",
"operationNumber": "HLP-NIPC-OP-0165",
"targetNumber": "HLP-NIPC-TGT-0036"
},
"kb_agent_acceptance": {
"protocolVersion": "HLP-NIPC-v1",
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",

View file

@ -2,7 +2,7 @@
"compiled_from": {
"compiler_id": "TCS-COMPILER-STAGE1-0001",
"compiler_state": "TCS_COMPILER_GIR_EXECUTED",
"source_sha256": "32d2c65163e5cf26160d4ca7c30196669ab22e74a071c518c37073acb9111520"
"source_sha256": "496395b5d16ad7b469814399debdca7978e7c3e2083243a0f6a33c0aa3f11468"
},
"declaration": {
"header": {
@ -18,7 +18,7 @@
"master": {
"gate_g3": "前端每次invoke前核对编号注册表哈希与本清单一致,未登记编号拒绝调用。",
"gate_g4": "启动时自检脊椎24条与哈希,任一不符即FAIL_CLOSED,渲染闸门失败界面,不猜跑。",
"numbered_ipc_registry_sha256": "315389439a6ed6a9f55f78e22c31659e828953d3eeff7fd18fa2abf9ed2e40e6",
"numbered_ipc_registry_sha256": "f8a7332cebb412ab72b41fd6b024511cbbd0d0d2de446bf64616cd966d84505c",
"semantics_live_here": "语义与验收规则只住本TCS;前端TS只做哈希核对与机械执行。",
"spine_sha256": "4749fce6ce1957c9ee12dc60f00ea9e97aa205d1911dfc79954caceacc3d9bcf"
}

View file

@ -13,7 +13,7 @@ PROTOCOL ZHUYUAN-PUBLICSPINE-SHELL-MANIFEST-0001 {
}
master {
spine_sha256 = "4749fce6ce1957c9ee12dc60f00ea9e97aa205d1911dfc79954caceacc3d9bcf";
numbered_ipc_registry_sha256 = "315389439a6ed6a9f55f78e22c31659e828953d3eeff7fd18fa2abf9ed2e40e6";
numbered_ipc_registry_sha256 = "f8a7332cebb412ab72b41fd6b024511cbbd0d0d2de446bf64616cd966d84505c";
gate_g3 = "前端每次invoke前核对编号注册表哈希与本清单一致,未登记编号拒绝调用。";
gate_g4 = "启动时自检脊椎24条与哈希,任一不符即FAIL_CLOSED,渲染闸门失败界面,不猜跑。";
semantics_live_here = "语义与验收规则只住本TCS;前端TS只做哈希核对与机械执行。";

View file

@ -2187,6 +2187,61 @@
"admission": "PREAUTH_SYSTEM_ROUTE",
"effect": "STATE_CHANGE",
"payload_schema": "hololake.numbered-ipc.payload/kb_agent_acceptance/v1"
},
{
"operation_number": "HLP-NIPC-OP-0162",
"alias": "perform_machine_identity_login",
"handler": "code_repo_login::perform_machine_identity_login",
"channel_number": "HLP-NIPC-CH-0006",
"module_number": "HLP-NIPC-MOD-0015",
"target_number": "HLP-NIPC-TGT-0015",
"admission": "VERIFIED_HUMAN_ROUTE",
"effect": "STATE_CHANGE",
"payload_schema": "hololake.numbered-ipc.payload/perform_machine_identity_login/v1"
},
{
"operation_number": "HLP-NIPC-OP-0162",
"alias": "kb_agent_execute",
"handler": "agent_runtime::kb_agent_execute",
"channel_number": "HLP-NIPC-CH-0001",
"module_number": "HLP-NIPC-MOD-0036",
"target_number": "HLP-NIPC-TGT-0036",
"admission": "READ_WRITE_KB_MODEL_FREE",
"effect": "READ_OR_STATUS",
"payload_schema": "hololake.numbered-ipc.payload/kb_agent_execute/v1"
},
{
"operation_number": "HLP-NIPC-OP-0163",
"alias": "agent_settings_get",
"handler": "agent_runtime::agent_settings_get",
"channel_number": "HLP-NIPC-CH-0001",
"module_number": "HLP-NIPC-MOD-0036",
"target_number": "HLP-NIPC-TGT-0036",
"admission": "READ_SETTINGS",
"effect": "STATE_CHANGE",
"payload_schema": "hololake.numbered-ipc.payload/agent_settings_get/v1"
},
{
"operation_number": "HLP-NIPC-OP-0164",
"alias": "agent_settings_set",
"handler": "agent_runtime::agent_settings_set",
"channel_number": "HLP-NIPC-CH-0001",
"module_number": "HLP-NIPC-MOD-0036",
"target_number": "HLP-NIPC-TGT-0036",
"admission": "STATE_CHANGE",
"effect": "STATE_CHANGE",
"payload_schema": "hololake.numbered-ipc.payload/agent_settings_set/v1"
},
{
"operation_number": "HLP-NIPC-OP-0165",
"alias": "agent_api_test",
"handler": "agent_runtime::agent_api_test",
"channel_number": "HLP-NIPC-CH-0001",
"module_number": "HLP-NIPC-MOD-0036",
"target_number": "HLP-NIPC-TGT-0036",
"admission": "OUTBOUND_HTTP_USER_ENDPOINT",
"effect": "READ_OR_STATUS",
"payload_schema": "hololake.numbered-ipc.payload/agent_api_test/v1"
}
]
}
}