dsh-scout 0.8.0
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.
- package/LICENSE +21 -0
- package/README.en.md +90 -0
- package/README.md +181 -0
- package/cordis.patch.yml +3 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +624 -0
- package/dist/model.d.ts +122 -0
- package/dist/model.js +564 -0
- package/docs/dsh-scout-product-contract.md +108 -0
- package/docs/fixtures/dsh-scout/snapmaker-hr-head.json +92 -0
- package/package.json +63 -0
- package/scripts/profile-smoke.mjs +101 -0
- package/tests/model.test.mjs +1356 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MaxHou-infinity
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# dsh-scout · 司察 (Scout)
|
|
2
|
+
|
|
3
|
+
[](https://github.com/MaxHou-infinity/dsh-scout/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](package.json)
|
|
7
|
+
[](tests/model.test.mjs)
|
|
8
|
+
[](README.md)
|
|
9
|
+
|
|
10
|
+
**司察(Scout)** — evidence-driven company & job due-diligence plugin for [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness).
|
|
11
|
+
|
|
12
|
+
`dsh-scout` helps an agent answer a concrete question:
|
|
13
|
+
|
|
14
|
+
> Is this company and role worth taking to the next round, and what must I verify in the interview?
|
|
15
|
+
|
|
16
|
+
The plugin keeps facts, reported information, inference, unknowns, sources, and next actions separate. It starts conservatively at `VERIFY` until the company identity and high-impact claims are supported.
|
|
17
|
+
|
|
18
|
+
## Naming
|
|
19
|
+
|
|
20
|
+
- **Scout** — a scout is sent ahead to reconnoiter a company and a role before you commit: background check, due diligence, evidence gathering, interview prep. The English package and repository name stays `dsh-scout` for stable install references.
|
|
21
|
+
- **司察** (sī-chá) — Chinese name: "司" echoes *scout*, "察" means to examine and reconnoiter, capturing the core function of evidence-driven company & role due diligence.
|
|
22
|
+
|
|
23
|
+
## Current scope
|
|
24
|
+
|
|
25
|
+
This repository contains the first runnable, session-isolated slice:
|
|
26
|
+
|
|
27
|
+
- `scout_start`: create an in-memory diligence case.
|
|
28
|
+
- `scout_add_source`: register a source.
|
|
29
|
+
- `scout_ingest`: batch-register collected research results (auto-infers source type and evidence level per URL, optionally drafting a claim per item; individual failures or rejected claims are isolated without aborting the batch).
|
|
30
|
+
- `scout_search`: run a web search through the DSH web provider and auto-register the result URLs as sources (type and evidence level inferred per URL).
|
|
31
|
+
- `scout_add_claim`: attach an evidence-bounded claim.
|
|
32
|
+
- `scout_verify_identity`: confirm the legal entity from an `E3` source.
|
|
33
|
+
- `scout_verify_claim`: promote a claim while retaining its prior evidence state.
|
|
34
|
+
- `scout_report`: render the current Markdown report (evidence summary counts, impact-sorted key evidence/risks/role hypotheses, a **verification checklist**, URL-linked source list, and interview questions).
|
|
35
|
+
- `scout_questions`: derive a deduplicated, prioritized interview question list from the case (up to 12 items).
|
|
36
|
+
- `scout_compare`: render a side-by-side comparison report for two to five cases (decisions, identity status, verified conclusions, open risks, and merged interview questions).
|
|
37
|
+
- `scout_export`: persist a case as the durable **five-file export** (`case.json`, `sources.json`, `claims.json`, `events.jsonl`, `report.md`) into a target directory (`targetDir` is optional; defaults to `<scoutDir>/<caseId>`).
|
|
38
|
+
- `scout_import`: restore a case from a five-file export directory and recompute its decision.
|
|
39
|
+
|
|
40
|
+
The first case fixture is [Snapmaker HR Head](docs/fixtures/dsh-scout/snapmaker-hr-head.json). Its historical material is deliberately marked as `E1` and is not treated as current verification.
|
|
41
|
+
|
|
42
|
+
Case state lives in memory by default and is isolated by DSH agent/session identity; `scout_export` / `scout_import` make a case durable across sessions through the five-file format with a replayable `events.jsonl`. Configurable storage is available via plugin config (`scoutDir` / `autoPersist`); `scout_ingest` handles batch source registration from collected search/page results and can draft claims from each item; `scout_search` runs the DSH web provider directly and auto-registers result sources; `scout_compare` renders side-by-side case comparisons. This repository does not yet claim the full product contract is complete.
|
|
43
|
+
|
|
44
|
+
## Development
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
pnpm install
|
|
48
|
+
pnpm test
|
|
49
|
+
pnpm run check:release
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The tests cover the conservative decision default, evidence-level constraints, identity verification, session isolation, report rendering, export/import round-trips, auto-persist, question generation, and tool cleanup on unload. `check:release` additionally packs the plugin, installs it into an isolated temporary DSH profile, verifies `--dump-config`, checks the mounted tools, and observes the Cordis unload disposer. The gate uses `DSH_BIN` or a local `dsh` binary when available; otherwise it downloads the exact official CLI version `0.1.0-rc.6` through `npx`.
|
|
53
|
+
|
|
54
|
+
## Install into a DSH profile
|
|
55
|
+
|
|
56
|
+
The package is an installable DSH bundle:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
dsh plugin --profile scout-demo add github:MaxHou-infinity/dsh-scout#<commit>
|
|
60
|
+
dsh --profile scout-demo --dump-config
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Git installs fetch source and run `prepare`. pnpm may require an explicit `allowBuilds` entry for `dsh-scout`; only allow a pinned source you have reviewed. The current package targets `@deepseek-ai/dsh-tools` `0.1.0-rc.6` and `@deepseek-ai/cordis` `4.0.x`.
|
|
64
|
+
|
|
65
|
+
## Configuration (optional)
|
|
66
|
+
|
|
67
|
+
Configure `dsh-scout` in the DSH profile's `cordis.patch.yml`:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
- id: dsh-scout
|
|
71
|
+
config:
|
|
72
|
+
scoutDir: /path/to/scout-cases # default export dir; cases land in <scoutDir>/<caseId>/
|
|
73
|
+
autoPersist: true # write the five files after every mutation (default false)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- Without `scoutDir`, `scout_export` with no `targetDir` writes to `./dsh-scout/<caseId>/`;
|
|
77
|
+
- With `autoPersist: true`, every `scout_start` / `scout_add_source` / `scout_ingest` / `scout_search` / `scout_add_claim` / `scout_verify_*` persists automatically; a failed write does not break the main flow.
|
|
78
|
+
|
|
79
|
+
## Design boundaries
|
|
80
|
+
|
|
81
|
+
- Its built-in `scout_search` only turns search results into registered sources; it does not replace dedicated browser or MCP providers for deep retrieval.
|
|
82
|
+
- It does not send applications, emails, or personal identity data to third parties.
|
|
83
|
+
- It does not turn funding, company self-description, or a job posting into verified success claims.
|
|
84
|
+
- It is not legal, investment, or medical advice.
|
|
85
|
+
|
|
86
|
+
See [the product contract](docs/dsh-scout-product-contract.md) for the full MVP boundary and acceptance criteria.
|
|
87
|
+
|
|
88
|
+
## Community
|
|
89
|
+
|
|
90
|
+
This is an independent community plugin for DeepSeek Harness. The repository uses the `dsh-plugin`, `deepseek-harness`, `due-diligence`, `company-research`, `job-research`, `hr-tech`, and `evidence-based` topics for discovery.
|
package/README.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# dsh-scout · 司察(Scout)
|
|
2
|
+
|
|
3
|
+
[](https://github.com/MaxHou-infinity/dsh-scout/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](package.json)
|
|
7
|
+
[](tests/model.test.mjs)
|
|
8
|
+
[](README.en.md)
|
|
9
|
+
|
|
10
|
+
**司察(Scout)** —— 面向 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness) 的**证据驱动型公司与岗位尽调 / 背调插件**。
|
|
11
|
+
|
|
12
|
+
一句话说清楚:**它让 AI 帮你回答——"这家公司和这个岗位,值得进入下一轮吗?面试中还有哪些事项必须核验?"** 并且,每一个结论都挂靠真实的来源,绝不把"公司自述"或"融资新闻"当成已经核实的事实。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 为什么需要它?(它解决什么痛点)
|
|
17
|
+
|
|
18
|
+
假设你收到一个面试邀约或 Offer:
|
|
19
|
+
|
|
20
|
+
- 招聘 JD 说公司"全球第一、估值百亿"——**这是公司的宣传口径,不是事实**;
|
|
21
|
+
- 媒体报道说"融资 20 亿美元"——**可能只是媒体转述,甚至已被公司否认**;
|
|
22
|
+
- 你需要在面试前判断:公司主体真实吗?岗位的汇报线、授权、薪资靠谱吗?**该问哪些问题**?
|
|
23
|
+
|
|
24
|
+
司察(dsh-scout)把这件事做成一条可复现的工作流:**收集来源 → 登记证据 → 添加结论 → 核验主体 → 生成带证据边界的尽调报告**。报告明确区分「已核验」「待核验」「未知」,并直接给出面试行动清单。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 它的心智模型:证据等级(核心概念)
|
|
29
|
+
|
|
30
|
+
所有结论(claim)都受**证据等级**约束,等级上限由它所引用的来源决定:
|
|
31
|
+
|
|
32
|
+
| 等级 | 含义 | 例子 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| **E0** | 无来源 / 模型推断 | 没有来源支撑的猜测,只能标 `unknown` 或 `needs_verification` |
|
|
35
|
+
| **E1** | 用户提供 | 你自己从内部渠道拿到的信息 |
|
|
36
|
+
| **E2** | 权威第三方 | 独立媒体、招聘平台(BOSS/猎聘)、工商聚合库(天眼查/爱企查)、维基百科 |
|
|
37
|
+
| **E3** | 官方一手 | 国家企业信用信息公示系统(gsxt.gov.cn)、监管公告、官方备案 |
|
|
38
|
+
|
|
39
|
+
**四条纪律(插件强制,不可绕过):**
|
|
40
|
+
|
|
41
|
+
1. 一条主张的 `evidenceLevel` **不能超过**它引用的最强来源(E1 来源撑不起 E3 结论);
|
|
42
|
+
2. **没有来源**的高影响结论,只能标记为 `unknown` 或 `needs_verification`;
|
|
43
|
+
3. **主体核验**(scout_verify_identity)必须挂接 E3 官方登记来源,否则拒绝执行;
|
|
44
|
+
4. 决策默认**保守**:只要主体未核验、或有阻断级结论未核实,就保持 `VERIFY`,不会假装"已通过"。
|
|
45
|
+
|
|
46
|
+
> 这保证了:**证据不足时,报告会诚实地告诉你"还没核实",而不是给你一个夸大的结论。**
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 一个案例(case)的生命周期
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
scout_start 创建案例(默认决策 VERIFY)
|
|
54
|
+
│
|
|
55
|
+
scout_search 调用 Web Provider 搜索,结果自动登记为来源
|
|
56
|
+
│
|
|
57
|
+
scout_ingest 批量登记采集结果(可随来源自动登记主张)
|
|
58
|
+
│
|
|
59
|
+
scout_add_source 登记来源(sourceType + evidenceLevel)
|
|
60
|
+
│
|
|
61
|
+
scout_add_claim 添加结论(受证据边界约束)
|
|
62
|
+
│
|
|
63
|
+
scout_verify_identity 用 E3 官方源核验公司主体(可选但强烈建议)
|
|
64
|
+
│
|
|
65
|
+
scout_verify_claim 用更强证据把结论提升为 verified(保留历史)
|
|
66
|
+
│
|
|
67
|
+
scout_report / scout_questions 生成报告 / 派生面试问题
|
|
68
|
+
│
|
|
69
|
+
scout_compare 多个案例并排对比(决策/主体/风险/问题)
|
|
70
|
+
│
|
|
71
|
+
scout_export / scout_import 落盘持久化(五文件),换会话可恢复
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 快速上手(一段完整示例)
|
|
75
|
+
|
|
76
|
+
以"判断某公司 HR 岗位是否值得推进"为例,Agent 会这样工作:
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
① scout_start(caseId=acme-hr, companyName=某科技公司, roleTitle=HRBP, location=深圳)
|
|
80
|
+
② 搜索公司工商信息 → scout_add_source(sourceId=s1, sourceType=company_registry/…, evidenceLevel=E2)
|
|
81
|
+
③ 抓取官方招聘 JD → scout_add_source(sourceId=s2, sourceType=company_official, evidenceLevel=E2)
|
|
82
|
+
④ 提炼职责/资格/薪资 → scout_add_claim(claimId=c1, status=verified, evidenceLevel=E2, …)
|
|
83
|
+
没有来源支撑的高影响项(如"汇报线")→ status=unknown / needs_verification
|
|
84
|
+
⑤ 尝试 gsxt 官方核验 → scout_verify_identity(…)
|
|
85
|
+
⑥ scout_report → 生成报告
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
生成的报告包含:
|
|
89
|
+
|
|
90
|
+
- **判断**:`PROCEED` / `VERIFY` / `STOP`(附理由)
|
|
91
|
+
- **Key supporting evidence**:最有力的已核验结论
|
|
92
|
+
- **Blocking or unresolved risks**:阻断推进的风险与未知项
|
|
93
|
+
- **Verification checklist**:所有待核验的阻断/重要事项 + 各自的下一步动作(直接当面试行动清单用)
|
|
94
|
+
- **Claim ledger**:全部结论台账(状态/证据等级/影响/来源/置信说明)
|
|
95
|
+
- **Sources**:带 URL 的来源清单(可点击回溯)
|
|
96
|
+
- **Interview questions**:建议的面试反问
|
|
97
|
+
|
|
98
|
+
## 工具清单
|
|
99
|
+
|
|
100
|
+
| 工具 | 作用 |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `scout_start` | 创建尽调案例 |
|
|
103
|
+
| `scout_add_source` | 登记信息来源(含证据等级) |
|
|
104
|
+
| `scout_ingest` | 批量登记采集结果(自动推断来源类型/证据等级,可随来源一键登记主张草稿) |
|
|
105
|
+
| `scout_search` | 调用 DSH Web Provider 搜索并自动登记结果来源(type/evidence 按 URL 推断) |
|
|
106
|
+
| `scout_add_claim` | 添加证据受限的主张 |
|
|
107
|
+
| `scout_verify_identity` | 用 E3 官方源核验法定主体 |
|
|
108
|
+
| `scout_verify_claim` | 用更强证据提升主张为 verified |
|
|
109
|
+
| `scout_report` | 渲染当前 Markdown 报告 |
|
|
110
|
+
| `scout_questions` | 从案例派生去重、按优先级排序的面试问题清单(上限 12 条) |
|
|
111
|
+
| `scout_compare` | 2–5 个案例的并排对比报告(决策/主体/关键结论/风险/面试问题) |
|
|
112
|
+
| `scout_export` | 持久化五文件导出(case/sources/claims/events/report) |
|
|
113
|
+
| `scout_import` | 从导出目录恢复案例并重算决策 |
|
|
114
|
+
|
|
115
|
+
## 安装到 DSH Profile
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
dsh plugin --profile scout-demo add github:MaxHou-infinity/dsh-scout#<commit>
|
|
119
|
+
dsh --profile scout-demo --dump-config # 验证工具挂载
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
要求:Node ≥ 22.19;面向 `@deepseek-ai/dsh-tools` `0.1.0-rc.6` 与 `@deepseek-ai/cordis` `4.0.x`。Git 安装会运行 `prepare`,pnpm 可能需要为 `dsh-scout` 显式添加 `allowBuilds`(只放行你审查过的固定版本)。
|
|
123
|
+
|
|
124
|
+
## 配置(可选)
|
|
125
|
+
|
|
126
|
+
在 DSH profile 的 `cordis.patch.yml` 中为 `dsh-scout` 配置:
|
|
127
|
+
|
|
128
|
+
```yaml
|
|
129
|
+
- id: dsh-scout
|
|
130
|
+
config:
|
|
131
|
+
scoutDir: /path/to/scout-cases # 默认导出目录;case 落在 <scoutDir>/<caseId>/
|
|
132
|
+
autoPersist: true # 每次变更后自动写五文件(默认 false)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- `scoutDir` 未配置时,`scout_export` 省略 `targetDir` 会写到 `./dsh-scout/<caseId>/`;
|
|
136
|
+
- `autoPersist: true` 时,每次 `scout_start` / `scout_add_source` / `scout_ingest` / `scout_search` / `scout_add_claim` / `scout_verify_*` 后自动落盘;写失败不影响主流程。
|
|
137
|
+
|
|
138
|
+
## 数据持久化(v0.2 / v0.3)
|
|
139
|
+
|
|
140
|
+
案例默认在内存中、按会话隔离;`scout_export` 把案例写为五个文件:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
case.json 案例主体(含决策状态)
|
|
144
|
+
sources.json 来源清单
|
|
145
|
+
claims.json 结论台账
|
|
146
|
+
events.jsonl 可回放事件流(case_started / claim_added / …)
|
|
147
|
+
report.md 当前报告快照
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
`scout_import` 可从导出目录恢复案例并重新计算决策——换会话、换机器都能接着尽调。
|
|
151
|
+
|
|
152
|
+
## 何时不要用(设计边界)
|
|
153
|
+
|
|
154
|
+
- 它内置的 `scout_search` 仅做搜索到来源的登记;**不替代**专用浏览器或 MCP Provider 的深度抓取;
|
|
155
|
+
- 它**不会**替你把融资信息、公司自述或招聘启事当成已核实的事实;
|
|
156
|
+
- 它**不构成**法律、投资或医疗建议;
|
|
157
|
+
- 主体核验依赖 E3 官方源,若 gsxt 等无法访问,报告会如实标记"待核验"。
|
|
158
|
+
|
|
159
|
+
完整 MVP 边界与验收标准见[产品契约](docs/dsh-scout-product-contract.md);首个示例案例见 [Snapmaker HR Head](docs/fixtures/dsh-scout/snapmaker-hr-head.json)。
|
|
160
|
+
|
|
161
|
+
## 开发与测试
|
|
162
|
+
|
|
163
|
+
```sh
|
|
164
|
+
pnpm install
|
|
165
|
+
pnpm test # 32 个测试:决策默认值/证据约束/主体核验/会话隔离/报告渲染/导出导入往返/自动持久化/面试问题/采集→主张流转
|
|
166
|
+
pnpm run check:release
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 路线图
|
|
170
|
+
|
|
171
|
+
- ✅ v0.1:证据纪律、三态决策、结构化报告、会话隔离
|
|
172
|
+
- ✅ v0.2:五文件持久化导出 + 事件流 + 导入恢复
|
|
173
|
+
- ✅ v0.3:可配置存储(`scoutDir` / `autoPersist`)+ 面试问题生成(`scout_questions`)
|
|
174
|
+
- ✅ v0.4:信息采集登记(`scout_ingest`:批量登记搜索结果/抓取页面,自动推断来源类型与证据等级)
|
|
175
|
+
- ✅ v0.5:公司/岗位对比(`scout_compare`:多案例并排对比报告,合并面试问题)
|
|
176
|
+
- ✅ v0.6:采集→主张流转(`scout_ingest` 支持 claim 草稿:登记来源的同时自动添加主张)
|
|
177
|
+
- ✅ v0.7:Provider 深度集成(`scout_search`:DSH Web Provider 搜索,结果自动登记为来源)
|
|
178
|
+
|
|
179
|
+
## 社区
|
|
180
|
+
|
|
181
|
+
面向 DeepSeek Harness 的独立社区插件(Topic:`dsh-plugin`、`deepseek-harness`、`due-diligence`、`company-research`、`job-research`、`hr-tech`、`evidence-based`)。欢迎 Issues / PR。
|
package/cordis.patch.yml
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
export declare const name = "dsh-scout";
|
|
3
|
+
export declare const inject: string[];
|
|
4
|
+
export interface ScoutConfig {
|
|
5
|
+
/** Default directory for case exports; case files land under `<scoutDir>/<caseId>/`. */
|
|
6
|
+
scoutDir?: string;
|
|
7
|
+
/** Persist the five-file export after every mutation when `scoutDir` is set. */
|
|
8
|
+
autoPersist?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function apply(ctx: Context, config?: ScoutConfig): void;
|
|
11
|
+
export * from './model.js';
|