Files
hunjing/engine/include/hunjing/lingtai.h
T
chenxin a39cec5287 ✨ feat: 灵台引擎五神齐备与 Go/Rust 官方绑定(WP-15)
- C++ 新增四模块(modules.cpp,19 个导出符号全部 hj_*):
  小周天 hj_stream:流会话(sequence/delta_index 单调)与 content.block.delta envelope 确定性编码(重放字节一致)
  烛照 hj_policy:URL 协议白名单(拒 file/javascript/data)、路径授权根与 .. 段拒绝、幂等键非空≤128、四维决策表(autonomy×risk→allow/ask/deny,非法输入 deny fail-closed)
  洛书 hj_plan:预算核算(达限/负数拒绝)
  河图 hj_recall:确定性重排(词频×稳定排序,canonical JSON 输出;非法输入 PARSE_FAILED)
- doctest 22 用例 20135 断言全绿(含每模块 golden 与确定性双跑)
- Go 绑定(cgo 自包含编译引擎源码):Engine RAII/TransformMarkdown/ValidateURL/ValidatePath/Decide/CheckBudget/RecallRerank;go test 3 用例通过(transform/rerank golden 与 C++ 字节一致)
- Rust 绑定(bindgen 生成 + 安全包装):Engine RAII(Drop 释放)、Error 枚举映射全部 HjStatus、Send/Sync(HjEngine 线程安全);cargo test 3 用例通过(同 golden)
- 三端(C++/Go/Rust)与 Python golden 一致:同一 markdown 输入在四端输出字节相同(跨端一致性首次全语言验证)
2026-09-12 13:54:12 +08:00

121 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Hunjing 灵台引擎公共头(Lingtai C ABI)。
// 契约真源:docs/contracts/lingtai-ffi.md;本文件是机器化前的稳定声明基线。
// 只导出 extern "C" 的 hj_* 符号与不透明句柄;异常、STL、RTTI 不跨越边界。
#ifndef HUNJING_LINGTAI_H
#define HUNJING_LINGTAI_H
#include <stddef.h>
#include <stdint.h>
#if defined(_WIN32)
#if defined(HJ_BUILDING)
#define HJ_API __declspec(dllexport)
#else
#define HJ_API __declspec(dllimport)
#endif
#else
#define HJ_API __attribute__((visibility("default")))
#endif
#ifdef __cplusplus
extern "C" {
#endif
// 当前 ABI major;major 不匹配时 hj_engine_new 拒绝初始化。
#define HJ_ABI_VERSION 1
// 不透明句柄:字段布局不进入契约。
typedef struct HjEngine HjEngine;
typedef struct HjBuffer HjBuffer;
// 稳定状态码(登记于契约第 5 节;新增不破坏兼容)。
typedef enum HjStatus {
HJ_OK = 0,
HJ_ERR_INVALID_ARGUMENT = 1,
HJ_ERR_OUT_OF_MEMORY = 2,
HJ_ERR_UNSUPPORTED_ABI = 3,
HJ_ERR_HANDLE_INVALID = 4,
HJ_ERR_REENTRANCY = 5,
HJ_ERR_PARSE_FAILED = 6,
HJ_ERR_LIMIT_EXCEEDED = 7,
HJ_ERR_POLICY_DENIED = 8,
HJ_ERR_SIGNATURE_INVALID = 9,
HJ_ERR_INDEX_CORRUPT = 10,
HJ_ERR_BUFFER_TOO_SMALL = 11,
HJ_ERR_INTERNAL = 12
} HjStatus;
// 返回引擎构建时的 ABI major。
HJ_API uint32_t hj_abi_version(void);
// 创建引擎句柄;宿主传入所需 major,不匹配返回 HJ_ERR_UNSUPPORTED_ABI 且不产生句柄。
// 成功时 *out_engine 非空。HjEngine 线程安全。
HJ_API HjStatus hj_engine_new(uint32_t required_abi_major, HjEngine **out_engine);
// 释放引擎句柄;句柄不在登记表(含二次释放)返回 HJ_ERR_HANDLE_INVALID,不崩溃。
HJ_API HjStatus hj_engine_free(HjEngine *engine);
// 释放引擎分配的缓冲;仅用于引擎产出的 HjBuffer。
HJ_API HjStatus hj_buffer_free(HjBuffer *buffer);
// 读取缓冲内容与长度;非法句柄返回 NULL / 0。
HJ_API const void *hj_buffer_data(const HjBuffer *buffer);
HJ_API size_t hj_buffer_len(const HjBuffer *buffer);
// 线程局部的最近一次错误消息(UTF-8、脱敏、不含正文与密钥);下一次调用覆盖。
HJ_API const char *hj_last_error(void);
// ===== 脾神(hj_transform):Markdown → canonical ContentBlock 确定性解析 =====
// 返回当前 parser version(稳定标识,随实现演进递增)。
HJ_API const char *hj_transform_version(void);
// 将 Markdown 规范化为 canonical ContentBlock JSON(键序确定、UTF-8)。
// 输出经 HjBuffer 返回,由 hj_buffer_free 释放;blocks 不含 id(由宿主生成)。
// 限额与非法 UTF-8 分别返回 HJ_ERR_LIMIT_EXCEEDED / HJ_ERR_INVALID_ARGUMENT。
HJ_API HjStatus hj_transform_markdown(
HjEngine *engine, const char *input, size_t input_len, HjBuffer **out);
// ===== 小周天(hj_stream):确定性流事件编码 =====
// 流会话句柄:Run 内 sequence 与 block delta_index 计数(契约第 5 节)。
typedef struct HjStream HjStream;
HJ_API HjStatus hj_stream_new(HjEngine *engine, HjStream **out_stream);
HJ_API HjStatus hj_stream_free(HjStream *stream);
// 追加文本增量:输出 content.block.delta envelope 的 canonical JSON
// (含 sequence 与 delta_index,键序确定);输出经 HjBuffer 返回。
HJ_API HjStatus hj_stream_append_delta(
HjStream *stream, const char *block_id, const char *text, size_t text_len,
HjBuffer **out);
HJ_API uint64_t hj_stream_sequence(const HjStream *stream);
// ===== 烛照(hj_policy):确定性判定原语 =====
// URL 校验:仅 http/https;拒绝 file/javascript/data 等协议(契约 3.4)。
HJ_API HjStatus hj_policy_validate_url(const char *url);
// 路径约束:canonicalize 后必须位于 root 内;越界返回 HJ_ERR_POLICY_DENIED。
HJ_API HjStatus hj_policy_validate_path(const char *path, const char *root);
// 幂等键:非空且不超过 128 字符(契约第 6 节)。
HJ_API HjStatus hj_policy_validate_idempotency_key(const char *key);
// 决策表:autonomy(0=自省 1=循律 2=请命 3=禁域)× risk(0=只读 1=副作用 2=高影响)
// 返回 0=allow 1=ask 2=deny;非法输入返回 2。
HJ_API int hj_policy_decide(int autonomy_level, int risk_level);
// ===== 洛书(hj_plan):预算核算 =====
// 已用 >= 上限 返回 HJ_ERR_LIMIT_EXCEEDED;负数参数 HJ_ERR_INVALID_ARGUMENT。
HJ_API HjStatus hj_plan_check_budget(int64_t used, int64_t maximum);
// ===== 河图(hj_recall):确定性重排 =====
// 候选重排:输入 {"query_terms": [".."], "candidates": [{"id","text"}]}
// 输出按确定性得分(词频 × 简单位置权重)排序的 canonical JSON。
HJ_API HjStatus hj_recall_rerank(const char *candidates_json, HjBuffer **out);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // HUNJING_LINGTAI_H