@optima-chat/optima-agent 0.8.98 → 0.8.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.claude/settings.local.json +166 -0
  2. package/.claude/skills/.kb-skills-managed.json +9 -0
  3. package/.claude/skills/ingesting-sources/SKILL.md +67 -0
  4. package/.claude/skills/initializing-kb/SKILL.md +117 -0
  5. package/.claude/skills/kol-outreach/SKILL.md +194 -333
  6. package/.claude/skills/linting-the-wiki/SKILL.md +60 -0
  7. package/.claude/skills/querying-the-wiki/SKILL.md +59 -0
  8. package/.claude/skills/updating-related-pages/SKILL.md +65 -0
  9. package/dist/bin/bi-cli.js +0 -0
  10. package/dist/bin/browser-cli.js +0 -0
  11. package/dist/bin/comfy.d.ts +3 -0
  12. package/dist/bin/comfy.d.ts.map +1 -0
  13. package/dist/bin/comfy.js +3 -0
  14. package/dist/bin/comfy.js.map +1 -0
  15. package/dist/bin/commerce.js +0 -0
  16. package/dist/bin/gen.js +0 -0
  17. package/dist/bin/google-ads.js +0 -0
  18. package/dist/bin/growth.d.ts +3 -0
  19. package/dist/bin/growth.d.ts.map +1 -0
  20. package/dist/bin/growth.js +3 -0
  21. package/dist/bin/growth.js.map +1 -0
  22. package/dist/bin/logistics.js +0 -0
  23. package/dist/bin/optima.js +0 -0
  24. package/dist/bin/scout.js +0 -0
  25. package/dist/bin/sentinel.js +0 -0
  26. package/dist/bin/shopify.js +0 -0
  27. package/dist/bin/sync-kb-skills.d.ts +6 -0
  28. package/dist/bin/sync-kb-skills.d.ts.map +1 -0
  29. package/dist/bin/sync-kb-skills.js +65 -0
  30. package/dist/bin/sync-kb-skills.js.map +1 -0
  31. package/dist/src/hooks-loader.d.ts +6 -0
  32. package/dist/src/hooks-loader.d.ts.map +1 -0
  33. package/dist/src/hooks-loader.js +215 -0
  34. package/dist/src/hooks-loader.js.map +1 -0
  35. package/dist/src/ui/App.d.ts +6 -0
  36. package/dist/src/ui/App.d.ts.map +1 -0
  37. package/dist/src/ui/App.js +164 -0
  38. package/dist/src/ui/App.js.map +1 -0
  39. package/dist/src/ui/components/Composer.d.ts +10 -0
  40. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  41. package/dist/src/ui/components/Composer.js +13 -0
  42. package/dist/src/ui/components/Composer.js.map +1 -0
  43. package/dist/src/ui/components/Header.d.ts +7 -0
  44. package/dist/src/ui/components/Header.d.ts.map +1 -0
  45. package/dist/src/ui/components/Header.js +7 -0
  46. package/dist/src/ui/components/Header.js.map +1 -0
  47. package/dist/src/ui/components/Message.d.ts +12 -0
  48. package/dist/src/ui/components/Message.d.ts.map +1 -0
  49. package/dist/src/ui/components/Message.js +21 -0
  50. package/dist/src/ui/components/Message.js.map +1 -0
  51. package/dist/src/ui/components/MessageList.d.ts +9 -0
  52. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  53. package/dist/src/ui/components/MessageList.js +18 -0
  54. package/dist/src/ui/components/MessageList.js.map +1 -0
  55. package/dist/src/ui/components/Spinner.d.ts +6 -0
  56. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  57. package/dist/src/ui/components/Spinner.js +7 -0
  58. package/dist/src/ui/components/Spinner.js.map +1 -0
  59. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  60. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  61. package/dist/src/ui/components/StatusBar.js +7 -0
  62. package/dist/src/ui/components/StatusBar.js.map +1 -0
  63. package/dist/src/ui/components/index.d.ts +7 -0
  64. package/dist/src/ui/components/index.d.ts.map +1 -0
  65. package/dist/src/ui/components/index.js +7 -0
  66. package/dist/src/ui/components/index.js.map +1 -0
  67. package/dist/src/validation/error-formatter.d.ts +21 -0
  68. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  69. package/dist/src/validation/error-formatter.js +98 -0
  70. package/dist/src/validation/error-formatter.js.map +1 -0
  71. package/dist/src/validation/index.d.ts +10 -0
  72. package/dist/src/validation/index.d.ts.map +1 -0
  73. package/dist/src/validation/index.js +10 -0
  74. package/dist/src/validation/index.js.map +1 -0
  75. package/dist/src/validation/json-validator.d.ts +25 -0
  76. package/dist/src/validation/json-validator.d.ts.map +1 -0
  77. package/dist/src/validation/json-validator.js +173 -0
  78. package/dist/src/validation/json-validator.js.map +1 -0
  79. package/dist/src/validation/schema.d.ts +353 -0
  80. package/dist/src/validation/schema.d.ts.map +1 -0
  81. package/dist/src/validation/schema.js +57 -0
  82. package/dist/src/validation/schema.js.map +1 -0
  83. package/dist/src/validation/suggestions.d.ts +25 -0
  84. package/dist/src/validation/suggestions.d.ts.map +1 -0
  85. package/dist/src/validation/suggestions.js +144 -0
  86. package/dist/src/validation/suggestions.js.map +1 -0
  87. package/dist/src/validation/types.d.ts +40 -0
  88. package/dist/src/validation/types.d.ts.map +1 -0
  89. package/dist/src/validation/types.js +5 -0
  90. package/dist/src/validation/types.js.map +1 -0
  91. package/dist/src/validation/yaml-validator.d.ts +25 -0
  92. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  93. package/dist/src/validation/yaml-validator.js +177 -0
  94. package/dist/src/validation/yaml-validator.js.map +1 -0
  95. package/package.json +5 -3
@@ -0,0 +1,166 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(gh api:*)",
5
+ "WebFetch(domain:platform.claude.com)",
6
+ "Bash(git init:*)",
7
+ "Bash(mkdir:*)",
8
+ "Bash(npm run typecheck:*)",
9
+ "Bash(npm view:*)",
10
+ "WebSearch",
11
+ "Bash(commerce --help)",
12
+ "Bash(done)",
13
+ "Bash(commerce product:*)",
14
+ "Bash(commerce order:*)",
15
+ "Bash(commerce i18n:*)",
16
+ "Bash(google-ads:*)",
17
+ "Bash(scout --help:*)",
18
+ "Bash(tree:*)",
19
+ "Bash(cloc:*)",
20
+ "Bash(npm run build:*)",
21
+ "Bash(git restore:*)",
22
+ "Bash(gh repo view:*)",
23
+ "Bash(mv:*)",
24
+ "Bash(rmdir:*)",
25
+ "Bash(git add:*)",
26
+ "Bash(git commit:*)",
27
+ "Bash(git push)",
28
+ "Bash(timeout 5 npm run optima:*)",
29
+ "Bash(npm install:*)",
30
+ "Bash(cat:*)",
31
+ "Bash(gh issue create:*)",
32
+ "Bash(npx tsx:*)",
33
+ "Bash(timeout 30 npx tsx:*)",
34
+ "Bash(git push origin feature/ask-user-question)",
35
+ "Bash(node:*)",
36
+ "Bash(npm version:*)",
37
+ "Bash(git push:*)",
38
+ "Bash(npm publish:*)",
39
+ "Bash(pkill:*)",
40
+ "Bash(git -C /Users/verypro/optima-agent log --oneline --all -- \".claude/\")",
41
+ "Bash(wc:*)",
42
+ "Bash(grep:*)",
43
+ "Bash(find:*)",
44
+ "Bash(commerce collection --help:*)",
45
+ "Bash(commerce collection update --help:*)",
46
+ "Bash(commerce collection set-cover:*)",
47
+ "Bash(commerce collection get --help:*)",
48
+ "Bash(commerce collection list --help:*)",
49
+ "Bash(commerce collection create --help:*)",
50
+ "Bash(commerce collection remove-products:*)",
51
+ "Bash(commerce collection list-products:*)",
52
+ "Bash(commerce --version:*)",
53
+ "Bash(bi-cli --version:*)",
54
+ "Bash(commerce homepage create --help:*)",
55
+ "Bash(commerce homepage reorder --help:*)",
56
+ "Bash(commerce homepage delete --help:*)",
57
+ "Bash(commerce homepage update-images:*)",
58
+ "Bash(commerce homepage update-collections:*)",
59
+ "Bash(commerce homepage update-target:*)",
60
+ "Bash(commerce homepage switch-template:*)",
61
+ "Bash(commerce inventory:*)",
62
+ "Bash(commerce merchant:*)",
63
+ "Bash(commerce review:*)",
64
+ "Bash(commerce product-page:*)",
65
+ "Bash(bi-cli:*)",
66
+ "Bash(comfy:*)",
67
+ "Bash(scout search:*)",
68
+ "Bash(scout product:*)",
69
+ "Bash(commerce homepage create-collections:*)",
70
+ "Bash(commerce homepage create-featured:*)",
71
+ "Bash(commerce homepage create-collection-products:*)",
72
+ "Bash(commerce homepage create-banner:*)",
73
+ "Bash(xargs -I {} sh -c 'echo \"\"\"\"=== {} ===\"\"\"\"; head -3 /Users/verypro/optima-agent/.claude/skills/{}/SKILL.md | grep \"\"\"\"name:\"\"\"\"')",
74
+ "Bash(ls:*)",
75
+ "Bash(gh issue view:*)",
76
+ "Bash(npx markdownlint-cli:*)",
77
+ "Bash(chmod:*)",
78
+ "Bash(npm whoami:*)",
79
+ "Bash(tsx test-scripts/test-headless-progress.ts:*)",
80
+ "Bash(DEBUG_STREAM=1 node dist/bin/optima.js:*)",
81
+ "Bash(git describe:*)",
82
+ "WebFetch(domain:github.com)",
83
+ "Bash(./scripts/test-headless.sh:*)",
84
+ "Bash(./scripts/test-headless-simple.sh:*)",
85
+ "Bash(env)",
86
+ "Bash(gh pr list:*)",
87
+ "Bash(gh pr view:*)",
88
+ "Bash(gh pr diff:*)",
89
+ "Bash(optima --version:*)",
90
+ "Bash(optima agent headless:*)",
91
+ "Bash(optima headless:*)",
92
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless.sh:*)",
93
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless-simple.sh:*)",
94
+ "Bash(tee:*)",
95
+ "Bash(CONV_ID=\"conv-1\":*)",
96
+ "Bash(echo:*)",
97
+ "Bash(scout tiktok trending --help:*)",
98
+ "Bash(scout tiktok trending:*)",
99
+ "Bash(git checkout:*)",
100
+ "Bash(npm test:*)",
101
+ "Bash(git tag:*)",
102
+ "Bash(/private/tmp/claude/-Users-verypro-optima-agent/68a9ac2c-def2-44e1-b42b-e53bd9022ab6/scratchpad/test-canUseTool.sh)",
103
+ "Bash(optima --help:*)",
104
+ "Bash(npx @optima-chat/ads-cli:*)",
105
+ "Bash(head:*)",
106
+ "Bash(git pull:*)",
107
+ "Bash(pnpm build:*)",
108
+ "Skill(read-code)",
109
+ "Bash(npm run cli:*)",
110
+ "Bash(scout:*)",
111
+ "WebFetch(domain:docs.scrapecreators.com)",
112
+ "WebFetch(domain:scrapecreators.com)",
113
+ "Bash(gh auth status:*)",
114
+ "Bash(optima-agent:*)",
115
+ "Bash(python3:*)",
116
+ "Bash(python3 -c \" import sys content = sys.stdin.read\\(\\) # Find flushMessageQueueSync idx = content.find\\(''flushMessageQueueSync''\\) # Get context around it lines = content.split\\(''\\\\n''\\) for i, line in enumerate\\(lines\\): if ''flushMessageQueueSync'' in line and ''private'' in line: for j in range\\(i, min\\(i+20, len\\(lines\\)\\)\\): print\\(f''{j+1}: {lines[j]}''\\) break \")",
117
+ "Bash(optima:*)",
118
+ "WebFetch(domain:www.npmjs.com)",
119
+ "WebFetch(domain:registry.npmjs.org)",
120
+ "WebFetch(domain:zod.dev)",
121
+ "Bash(npm ls:*)",
122
+ "Bash(NODE_DEBUG=child_process npx tsx:*)",
123
+ "Bash(DEBUG_CLAUDE_AGENT_SDK=1 npx tsx:*)",
124
+ "Bash(CLAUDECODE= npx tsx:*)",
125
+ "Bash(env:*)",
126
+ "Bash(gh release:*)",
127
+ "Bash(npm info:*)",
128
+ "Bash(gh run:*)",
129
+ "Bash(gtimeout 90:*)",
130
+ "Bash(sentinel:*)",
131
+ "Bash(gh pr:*)",
132
+ "Bash(git fetch:*)",
133
+ "Bash(git log:*)",
134
+ "Bash(npm bin:*)",
135
+ "Bash(git status:*)",
136
+ "Bash(browser-cli --version && browser-cli --help)",
137
+ "Bash(browser-cli status:*)",
138
+ "Bash(browser-cli launch:*)",
139
+ "Bash(browser-cli screenshot:*)",
140
+ "Bash(browser-cli --version)",
141
+ "Bash(browser-cli close:*)",
142
+ "Bash(npm update:*)",
143
+ "Bash(node -e \"console.log\\(require\\('./node_modules/@optima-chat/browser-cli/package.json'\\).version\\)\")",
144
+ "WebFetch(domain:raw.githubusercontent.com)",
145
+ "Bash(aws ecs:*)",
146
+ "Bash(aws ecr:*)",
147
+ "Bash(gh search:*)",
148
+ "Bash(npx tsc:*)",
149
+ "Bash(find /Users/verypro/optima-agent -path */node_modules -prune -o -type f \\\\\\(-name *comfy* -o -name *gen* \\\\\\) -print)",
150
+ "Bash(export PATH=\"/usr/local/bin:$PATH\")",
151
+ "Bash(pnpm add:*)",
152
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/max-rounds-hit)",
153
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/budget-almost-spent)",
154
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/two-active-campaigns)",
155
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/brand-only)",
156
+ "Bash(pnpm vitest:*)",
157
+ "Bash(pnpm test:*)",
158
+ "Bash(pnpm --filter @optima-scout/backend test --reporter=verbose backend/src/routes/outreach/__tests__/lock.test.ts backend/src/routes/outreach/__tests__/inbound.test.ts)",
159
+ "Bash(npx vitest:*)",
160
+ "Bash(DATABASE_URL=postgres://optima_scout:optima_scout_dev@localhost:7293/optima_scout pnpm --filter @optima-scout/backend test)",
161
+ "Bash(pnpm --filter @optima-scout/backend exec vitest run src/routes/outreach/__tests__/inbound.test.ts)"
162
+ ],
163
+ "deny": [],
164
+ "ask": []
165
+ }
166
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "skills": [
3
+ "ingesting-sources",
4
+ "initializing-kb",
5
+ "linting-the-wiki",
6
+ "querying-the-wiki",
7
+ "updating-related-pages"
8
+ ]
9
+ }
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: ingesting-sources
3
+ description: "将新素材收录到知识库。当用户说'收录这篇文章'、'把这个加到知识库'时使用。"
4
+ ---
5
+
6
+ # Ingesting Sources
7
+
8
+ 把原始材料做第一次落库,进入持续维护的 wiki 结构。产物不只是摘要,而是一页来源页,以及一份"还有哪些页面需要随之更新"的映射。
9
+
10
+ ## 启动 SOP
11
+
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
20
+
21
+ ## Ingest 流程
22
+
23
+ 1. 在 `~/kb/<slug>/raw/` 中定位来源文件
24
+ 2. 仔细阅读来源,提取主要论点、证据、实体和开放问题
25
+ 3. 在 `~/kb/<slug>/wiki/sources/` 中创建或更新对应页面
26
+ 4. 列出哪些 entity、overview 和 analysis 页面受到影响
27
+ 5. 如果任务范围包含来源页之外的更新,交给 updating-related-pages 处理,或执行一次有边界的相关页更新
28
+ 6. 如果这个来源是首次进入 wiki,更新 `~/kb/<slug>/index.md` 和 `~/kb/<slug>/log.md`
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] ingest: <来源名>"`
31
+
32
+ ## 来源页内容
33
+
34
+ 来源页应至少包含:
35
+
36
+ - 来源标题
37
+ - 简短摘要
38
+ - 关键论点
39
+ - 关键证据或观察
40
+ - 相关实体、主题或概念
41
+ - 对既有理解产生的冲突、修正或压力
42
+ - 指向受影响页面的链接
43
+
44
+ ## 抽取规则
45
+
46
+ - 将来源明确表达的内容与综合推断区分开
47
+ - 不要把大段原文直接复制进 wiki
48
+ - 优先写成简洁、可链接、之后可更新的陈述
49
+ - 当来源含混或不完整时,显式记录不确定性
50
+ - 遇到冲突要记录,不要静默抹平
51
+
52
+ ## 何时创建相关页面
53
+
54
+ 出现下列情况时应建议新建页面:
55
+
56
+ - 某个人、组织、产品或概念很重要,但还没有稳定页面
57
+ - 来源引入了一个新的 recurring topic
58
+ - 来源实质性改变了某个既有 overview
59
+ - 形成的综合结果已经明显值得进入 `wiki/analyses/`
60
+
61
+ ## 最小交付标准
62
+
63
+ 一次成功的 ingest 至少应留下:
64
+
65
+ - 一页可用的 `wiki/sources/` 页面
66
+ - 一份清晰的受影响页面列表
67
+ - 足够明确的结构,使下一步 update 很自然
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: initializing-kb
3
+ description: "创建新知识库或初始化 ~/kb/ 工作空间。当用户说'建个知识库'、'我想整理XX的知识'时使用。"
4
+ ---
5
+
6
+ # Initializing KB
7
+
8
+ 创建一个基于 Markdown 的知识库。主要产物是 `~/kb/<slug>/` 目录和其中的 `AGENTS.md`。
9
+
10
+ ## 核心:~/kb/ 工作目录
11
+
12
+ 所有知识库都在 `~/kb/` 下,每个知识库一个子目录。
13
+
14
+ ```text
15
+ ~/kb/
16
+ ├── REGISTRY.md
17
+ ├── PROGRESS.md
18
+ ├── <slug>/
19
+ │ ├── AGENTS.md
20
+ │ ├── index.md
21
+ │ ├── log.md
22
+ │ ├── raw/
23
+ │ └── wiki/
24
+ │ ├── overview/
25
+ │ ├── entities/
26
+ │ ├── sources/
27
+ │ └── analyses/
28
+ └── .git/
29
+ ```
30
+
31
+ ## 启动 SOP
32
+
33
+ 1. `ls ~/kb/REGISTRY.md`
34
+ - 不存在 → 初始化根目录(见下方"首次初始化")
35
+ - 存在 → 读 `REGISTRY.md`,了解已有的知识库
36
+ 2. 询问用户要创建什么主题的知识库
37
+
38
+ ## 首次初始化
39
+
40
+ 如果 `~/kb/` 不存在:
41
+
42
+ 1. `mkdir -p ~/kb`
43
+ 2. 创建 `~/kb/REGISTRY.md`:
44
+
45
+ ```markdown
46
+ # 知识库注册表
47
+
48
+ | slug | 主题 | 状态 | 创建日期 | 说明 |
49
+ |------|------|------|----------|------|
50
+ ```
51
+
52
+ 3. 创建 `~/kb/PROGRESS.md`:
53
+
54
+ ```markdown
55
+ # 知识库工作日志
56
+ ```
57
+
58
+ 4. `cd ~/kb && git init && git add -A && git commit -m "init kb workspace"`
59
+
60
+ ## 创建知识库
61
+
62
+ 1. 询问用户知识库主题
63
+ 2. 从主题生成 kebab-case slug 建议(不带 `-kb` 后缀)
64
+ 3. 校验 slug:
65
+ - 匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
66
+ - 不与 `REGISTRY.md` 已有 slug 重复
67
+ - 让用户确认或修改
68
+ 4. `mkdir -p ~/kb/<slug>`
69
+ 5. 检查当前素材(如果用户指定了已有目录或文件)
70
+ 6. 确定所需的最小页面类型集合
71
+ 7. 创建 `AGENTS.md`(见下方"AGENTS.md 内容")
72
+ 8. 创建 `index.md`、`log.md`、`raw/`、`wiki/overview/`、`wiki/entities/`、`wiki/sources/`、`wiki/analyses/`
73
+ 9. 追加 `~/kb/REGISTRY.md` 新行
74
+ 10. `cd ~/kb && git add -A && git commit -m "[<slug>] init: <主题>"`
75
+
76
+ ## AGENTS.md 内容
77
+
78
+ 至少应包含:
79
+
80
+ - 仓库目标
81
+ - `raw/` 的 source-of-truth 规则
82
+ - 页面类型及其职责
83
+ - ingest 工作流
84
+ - query 工作流
85
+ - lint 工作流
86
+ - 编辑规则
87
+ - 命名约定
88
+ - 何时应新建页面,而不是继续扩写旧页
89
+ - agent 修改后的输出要求
90
+
91
+ ## 页面模型
92
+
93
+ 默认页面职责:
94
+
95
+ - `wiki/sources/`:每个来源一页
96
+ - `wiki/entities/`:每个跨多个来源反复出现的稳定实体或概念一页
97
+ - `wiki/overview/`:每个主题或认知领域一页
98
+ - `wiki/analyses/`:长期有效的答案、比较、综合或决策记录
99
+
100
+ 避免混淆这些角色。
101
+
102
+ ## 命名规则
103
+
104
+ - 来源页:`YYYY-MM-DD-short-source-name.md`
105
+ - 分析页:`YYYY-MM-DD-short-analysis-name.md`
106
+ - 实体页:`kebab-case-entity-name.md`
107
+ - 综述页:`kebab-case-topic-name.md`
108
+
109
+ ## 好的结果
110
+
111
+ 一个好的 schema 应该让这些决策变得容易:
112
+
113
+ - 新来源应该落到哪里
114
+ - 一个概念什么时候值得拥有独立实体页
115
+ - 一个高价值答案应该写回哪里
116
+ - 冲突信息应如何呈现
117
+ - 之后如何再次找到这些页面