refactor: 全面改名为 HologramAgent + 提示词技术内容下沉到 skill/工具描述 + 修 21 处乱码
## ① 全面改名 HomeAgent → HologramAgent
仓库已改名,但代码与文档里仍有大量旧名。本次按"用户能看到的优先"全量替换:
- 用户可见:登录页标题/页脚、默认人格第一句、CLI 状态输出、启动日志、
plugin_install 的工具描述、AI 图片插件的 User-Agent
- 文档与脚本:README、assets/docs、docs/zh、deploy/*.sh、.github/workflows
- 鸿蒙工程:cmd/ohos/HomeAgent → cmd/ohos/HologramAgent(git mv)
目录内的 module/app 描述同步;**证书路径原样保留**
(default_HomeAgent_xxx.cer/p7b/p12 是签名材料的实际文件名,改了会找不到证书)
- 插件元数据:plugin.json 的 author
★ 必须保持原样的两处(改了会坏):
· legacySeededPromptSignature = "你是 HomeAgent 的看板娘「小宅」…"
—— 那是识别历史播种人格卡的**原文锚点**,改了就识别不出旧数据
· 公开 SDK 的 ProxyAuthHomeAgent = "homeagent"
—— 那是 SDK 契约里的值,属独立仓库,本仓不改
## ② 修 21 处乱码(U+FFFD)
这些是历史编辑留下的编码破坏,全在注释里,例如:
「赌注重下���遍」→「赌注重下一遍」
「「不��滤」」 →「「不过滤」」
「**待��退场**」→「**待退场**」
★ 保留 providers/chineseclip/tokenizer.go 里的 2 处:那是**故意**用
U+FFFD 演示"非法 UTF-8 字节被归一成 U+FFFD",不是乱码。
## ③ 提示词技术内容下沉(用户:技术性内容应该收敛到 skill 与 -help 中)
实测系统提示词 2309 字,其中两段几乎全是**模型无法据以行动的实现细节**:
【工具执行顺序】1272 字(ParallelSafe 声明、批内降级、batchRunnable 判据…)
【三层记忆】 1069 字(L1/L2/L3 编号、消费式删除、向量空间、指纹…)
收敛后 **2309 → 1723 字(-25%)**,保留的全是"模型据此做什么不同的事":
工具顺序:默认并行 / 不要依赖先后 / 同通道保序 / 写类工具可能串行
三层记忆:时序里能看最近 / doc_query 把历史事件按原始时间戳插回时序 /
关系用 memory_recall / 成文知识用 knowledge_search
判断口径写进判据:新加一段提示词前先问"模型会据此做什么不同的事",
答不上来就该进 skill 或工具描述。
## 判据
prompt_memory_test.go 新增 2 条:
- TestSystemPromptHasNoImplementationJargon
黑名单:ParallelSafe / batchRunnable / 消费式 / DenseCosine / fingerprint /
向量空间 / 批内降级 / 自激
- TestSystemPromptStaysCompact:上限 2000 字(当前 1723)
变异:把 "ParallelSafe 声明、批内降级" 加回工具顺序段 ⇒ 第一条立刻红。
## 验证
- go build ./... / go vet ./... 干净
- go test ./... -count=1:58 包 0 失败
- make check-client-versions:客户端与内核版本一致
@ -1,7 +1,7 @@
|
||||
{
|
||||
"app": {
|
||||
"bundleName": "com.example.homeagent",
|
||||
"vendor": "HomeAgent",
|
||||
"vendor": "HologramAgent",
|
||||
"versionCode": 1004000,
|
||||
"versionName": "1.4.0",
|
||||
// 分层图标:前景是字形,背景(沉淀色)在 base/ 与 dark/ 各一份,随系统主题切换。
|
||||
@ -2,7 +2,7 @@
|
||||
"string": [
|
||||
{
|
||||
"name": "app_name",
|
||||
"value": "HomeAgent"
|
||||
"value": "HologramAgent"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 989 B After Width: | Height: | Size: 989 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 988 B After Width: | Height: | Size: 988 B |
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "entry",
|
||||
"version": "1.0.0",
|
||||
"description": "HomeAgent HarmonyOS client entry module",
|
||||
"description": "HologramAgent HarmonyOS client entry module",
|
||||
"main": "",
|
||||
"author": "",
|
||||
"license": "Apache-2.0",
|
||||
@ -45,7 +45,7 @@ export function applyChatSse(ev: SseEvent, sink: ChatStreamSink): void {
|
||||
const frameType: string = frame['type'] as string ?? '';
|
||||
const type: string = ev.event.length > 0 ? ev.event : frameType;
|
||||
// 诊断只记事件类型(内容可能含隐私,不落盘)
|
||||
hilog.debug(0x0000, 'HomeAgent', 'sse %{public}s', type);
|
||||
hilog.debug(0x0000, 'HologramAgent', 'sse %{public}s', type);
|
||||
|
||||
if (type === 'agent_output') {
|
||||
const content: string = payload['content'] as string ?? '';
|
||||
@ -10,7 +10,7 @@ export class DeviceBridgeClient {
|
||||
private url: string = '';
|
||||
private token: string = '';
|
||||
private deviceId: string = '';
|
||||
private name: string = 'HomeAgent OHOS';
|
||||
private name: string = 'HologramAgent OHOS';
|
||||
private kind: string = 'phone';
|
||||
private caps: string[] = [];
|
||||
private hostname: string = 'ohos';
|
||||
@ -237,7 +237,7 @@ export class DeviceBridgeClient {
|
||||
// 为何不报错回去:这些 op 不要求回执(服务端 pushToDevice 不等
|
||||
// device→server 的应答),回一个错误帧反而会被当成未知帧处理。
|
||||
if (op.length > 0) {
|
||||
hilog.debug(0x0000, 'HomeAgent', 'device bridge: 忽略不支持的 op %{public}s', op);
|
||||
hilog.debug(0x0000, 'HologramAgent', 'device bridge: 忽略不支持的 op %{public}s', op);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -30,7 +30,7 @@ function ensureBridgeStateTracking(): void {
|
||||
*
|
||||
* 网关改造为子域反代后位于 devices.<基域名>,而基域名与子域标签都是**服务端
|
||||
* 配置**,客户端拼不出来。正常路径是先调 discoverGateway() 问服务端;
|
||||
* 本函数只在「服务端没有发现端点」(老版本 HomeAgent)时兜底,
|
||||
* 本函数只在「服务端没有发现端点」(老版本 HologramAgent)时兜底,
|
||||
* 保留旧部署的可用性。
|
||||
*/
|
||||
export function deviceGatewayUrl(base: string): string {
|
||||
@ -216,7 +216,7 @@ class StatusStore {
|
||||
if (build !== undefined && build !== null) {
|
||||
const bVer: string = build['version'] as string ?? '';
|
||||
const bCommit: string = build['commit'] as string ?? '';
|
||||
const bName: string = build['kernel_name'] as string ?? 'HomeAgent';
|
||||
const bName: string = build['kernel_name'] as string ?? 'HologramAgent';
|
||||
const bSdk: string = build['sdk_compatible'] as string ?? '';
|
||||
const bTime: string = build['build_time'] as string ?? '';
|
||||
lic = build['license'] as string ?? '';
|
||||
@ -11,11 +11,11 @@ import { ApiError } from './ApiClient';
|
||||
* 约定:
|
||||
* - UI 只显示 userMessage() 返回的短句(人话、可行动、不含技术细节);
|
||||
* - 技术细节(原始 message / HTTP 状态码 / 响应体)只写进 hilog,
|
||||
* 通过 `hdc shell hilog | grep HomeAgent` 排查,不进 UI。
|
||||
* 通过 `hdc shell hilog | grep HologramAgent` 排查,不进 UI。
|
||||
*/
|
||||
|
||||
const DOMAIN: number = 0xA0A0;
|
||||
const TAG: string = 'HomeAgent';
|
||||
const TAG: string = 'HologramAgent';
|
||||
|
||||
/** 网络类错误的统一提示:不暴露主机名、端口、curl 错误码。 */
|
||||
const MSG_UNREACHABLE: string = '连接不上后端服务,请检查网络与服务地址';
|
||||
@ -208,7 +208,7 @@ export struct ConnectionsPane {
|
||||
.fontSize(12)
|
||||
.fontColor(this.palette().textSecondary)
|
||||
.margin({ bottom: 10 })
|
||||
TextInput({ placeholder: '名称 (如 HomeAgent)', text: this.editName })
|
||||
TextInput({ placeholder: '名称 (如 HologramAgent)', text: this.editName })
|
||||
.height(36).fontSize(13).fontColor(this.palette().textPrimary)
|
||||
.placeholderColor(this.palette().textMuted).backgroundColor(this.palette().bgInput)
|
||||
.borderRadius(RADIUS_SM).border({ width: 1, color: this.palette().border })
|
||||
@ -69,7 +69,7 @@ export struct DeviceLocalPane {
|
||||
}) {
|
||||
PlainCard({ caption: '基本信息' }) {
|
||||
DeviceKvRow({ label: '设备 ID', value: this.deviceId.length > 0 ? this.deviceId : '未注册' })
|
||||
DeviceKvRow({ label: '名称', value: 'HomeAgent OHOS' })
|
||||
DeviceKvRow({ label: '名称', value: 'HologramAgent OHOS' })
|
||||
DeviceKvRow({ label: '类型', value: 'phone' })
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ export struct GradientBackground {
|
||||
// 只处理本地沙箱文件;http(s) 背景图不是本应用的场景(设置页只给图库选择)
|
||||
const path: string = src.startsWith('file://') ? src.substring(7) : src;
|
||||
if (!path.startsWith('/')) {
|
||||
hilog.error(0x0000, 'HomeAgent', 'bg: unsupported source');
|
||||
hilog.error(0x0000, 'HologramAgent', 'bg: unsupported source');
|
||||
this.bgPixel = undefined;
|
||||
return;
|
||||
}
|
||||
@ -59,11 +59,11 @@ export struct GradientBackground {
|
||||
await srcObj.release();
|
||||
fileIo.closeSync(f);
|
||||
this.bgPixel = pm;
|
||||
hilog.info(0x0000, 'HomeAgent', 'bg decoded ok');
|
||||
hilog.info(0x0000, 'HologramAgent', 'bg decoded ok');
|
||||
} catch (e) {
|
||||
// 失败必须留痕:否则表现就是"设置了但没生效",无从定位
|
||||
const err = e as BusinessError;
|
||||
hilog.error(0x0000, 'HomeAgent', 'bg decode failed code=%{public}d', err.code as number);
|
||||
hilog.error(0x0000, 'HologramAgent', 'bg decode failed code=%{public}d', err.code as number);
|
||||
this.bgPixel = undefined;
|
||||
}
|
||||
}
|
||||
@ -21,7 +21,7 @@ function storedThemeMode(): string {
|
||||
|
||||
export default class EntryAbility extends UIAbility {
|
||||
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
|
||||
console.info('[HomeAgent] ability onCreate');
|
||||
console.info('[HologramAgent] ability onCreate');
|
||||
const sysDark: boolean =
|
||||
this.context.config?.colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK;
|
||||
// Seed the OS color state first, then resolve the persisted mode.
|
||||
@ -33,7 +33,7 @@ export default class EntryAbility extends UIAbility {
|
||||
|
||||
onDestroy(): void {
|
||||
stopForegroundBridge();
|
||||
console.info('[HomeAgent] ability onDestroy');
|
||||
console.info('[HologramAgent] ability onDestroy');
|
||||
}
|
||||
|
||||
/** System dark/light switch — re-resolve when mode is 'system'. */
|
||||
@ -75,7 +75,7 @@ export default class EntryAbility extends UIAbility {
|
||||
onWindowStageCreate(windowStage: window.WindowStage): void {
|
||||
const startUI = (): void => {
|
||||
windowStage.loadContent('pages/Index', () => {
|
||||
console.info('[HomeAgent] main page loaded');
|
||||
console.info('[HologramAgent] main page loaded');
|
||||
});
|
||||
};
|
||||
|
||||
@ -99,21 +99,21 @@ export default class EntryAbility extends UIAbility {
|
||||
// 全屏沉浸:内容延伸到状态栏和导航栏区域
|
||||
win.setWindowLayoutFullScreen(true);
|
||||
} catch (e) {
|
||||
console.warn('[HomeAgent] setWindowLayoutFullScreen failed: ' + (e as Error).message);
|
||||
console.warn('[HologramAgent] setWindowLayoutFullScreen failed: ' + (e as Error).message);
|
||||
}
|
||||
connStore.init(this.context).then(async () => {
|
||||
const cur = connStore.getCurrentConnection();
|
||||
if (cur !== null) {
|
||||
apiClient.setConnection(cur);
|
||||
}
|
||||
console.info('[HomeAgent] connStore initialized');
|
||||
console.info('[HologramAgent] connStore initialized');
|
||||
// init 之后持久化的主题模式才可读,这里按存量设置重新解析并刷新系统栏
|
||||
this.reapplyStoredTheme();
|
||||
this.applySystemBar();
|
||||
startForegroundBridge(this.context);
|
||||
startUI();
|
||||
}).catch((e: Error) => {
|
||||
console.error('[HomeAgent] connStore init failed: ' + e.message);
|
||||
console.error('[HologramAgent] connStore init failed: ' + e.message);
|
||||
startUI();
|
||||
});
|
||||
});
|
||||
@ -129,16 +129,16 @@ export default class EntryAbility extends UIAbility {
|
||||
}
|
||||
|
||||
onWindowStageDestroy(): void {
|
||||
console.info('[HomeAgent] ability onWindowStageDestroy');
|
||||
console.info('[HologramAgent] ability onWindowStageDestroy');
|
||||
}
|
||||
|
||||
onForeground(): void {
|
||||
startForegroundBridge(this.context);
|
||||
console.info('[HomeAgent] ability onForeground');
|
||||
console.info('[HologramAgent] ability onForeground');
|
||||
}
|
||||
|
||||
onBackground(): void {
|
||||
stopForegroundBridge();
|
||||
console.info('[HomeAgent] ability onBackground');
|
||||
console.info('[HologramAgent] ability onBackground');
|
||||
}
|
||||
}
|
||||
@ -207,7 +207,7 @@ export function normalizeBaseUrl(raw: string): string {
|
||||
export function defaultConnection(): ConnectionConfig {
|
||||
const c: ConnectionConfig = {
|
||||
id: '',
|
||||
name: 'HomeAgent',
|
||||
name: 'HologramAgent',
|
||||
url: '',
|
||||
apiKey: '',
|
||||
type: 'webui',
|
||||
@ -2,7 +2,7 @@
|
||||
"module": {
|
||||
"name": "entry",
|
||||
"type": "entry",
|
||||
"description": "HomeAgent client entry module",
|
||||
"description": "HologramAgent client entry module",
|
||||
"mainElement": "EntryAbility",
|
||||
"deviceTypes": [
|
||||
"phone",
|
||||
@ -31,7 +31,7 @@
|
||||
{
|
||||
"name": "EntryAbility",
|
||||
"srcEntry": "./ets/entryability/EntryAbility.ets",
|
||||
"description": "HomeAgent main entry",
|
||||
"description": "HologramAgent main entry",
|
||||
"icon": "$media:layered_image",
|
||||
"label": "$string:app_name",
|
||||
// 启动页图标用透明底字形,配合随主题切换的 start_window_background,
|
||||
@ -2,7 +2,7 @@
|
||||
"string": [
|
||||
{
|
||||
"name": "app_name",
|
||||
"value": "HomeAgent"
|
||||
"value": "HologramAgent"
|
||||
},
|
||||
{
|
||||
"name": "read_pasteboard_reason",
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 177 B After Width: | Height: | Size: 177 B |
|
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 241 B |
|
Before Width: | Height: | Size: 164 B After Width: | Height: | Size: 164 B |
|
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 161 B After Width: | Height: | Size: 161 B |
|
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 218 B |
|
Before Width: | Height: | Size: 258 B After Width: | Height: | Size: 258 B |
|
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 220 B |
|
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
|
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 266 B |
|
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 322 B |
|
Before Width: | Height: | Size: 328 B After Width: | Height: | Size: 328 B |
|
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 251 B |
|
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 221 B |
|
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B |
|
Before Width: | Height: | Size: 151 B After Width: | Height: | Size: 151 B |
|
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
|
Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 318 B |
|
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 154 B |
|
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 206 B |