Initial Dever 0.0.1

This commit is contained in:
Codex committed 2026-11-03 03:32:07 +00:00
commit 81233d098c
1479 files changed
+163782

No files matched your search

@@ -0,0 +1,12 @@
{
"database": { "default": { "type": "sqlite", "path": "data/jobs.db" } },
"runtime": { "mode": "worker", "shutdown_ms": 30000 },
"job": {
"workers": 1,
"poll_ms": 1000,
"lease_ms": 60000,
"retry_base_ms": 1000,
"retry_max_ms": 300000
},
"log": { "level": "info" }
}
@@ -0,0 +1,9 @@
# 归档任务
按请求键入队任务并保存归档记录。
- [归档命令](doc/api.md)
- [业务操作](doc/app.md)
- [任务](doc/job.md)
- [数据结构](doc/model.md)
- [调用流程](link.md)
@@ -0,0 +1,3 @@
cmd submit = app.submit
cmd total = app.total
@@ -0,0 +1,21 @@
type Request {
key: Text
title: Text
}
submit(input: Request) (id: Id) {
id = dever.job.enqueue(job.store, input, input.key)
}
store(input: Request) () {
stored = model.create(
{
request_key = input.key
title = input.title
}
)
}
total() (count: Int) {
count = model.count()
}
@@ -0,0 +1,9 @@
# 归档命令
## report.archive.api.submit
使用请求键入队归档任务。
## report.archive.api.total
读取归档记录数。
@@ -0,0 +1,17 @@
# 业务操作
## report.archive.Request
归档请求的幂等键和标题。
## report.archive.submit
使用 input.key 入队归档任务,返回任务编号;相同键不会重复入队。
## report.archive.store
保存请求键和标题,供归档 Job 调用。
## report.archive.total
返回已保存的归档记录数。
@@ -0,0 +1,5 @@
# 任务
## report.archive.job.store
执行归档,最多执行 3 次(含首次),单次期限 30 秒。
@@ -0,0 +1,5 @@
# 数据结构
## report.archive.model.Archive
归档记录,请求键唯一。
@@ -0,0 +1,5 @@
database default
job store(input: app.Request) () retry(3) timeout(30000) {
app.store(input)
}
@@ -0,0 +1,206 @@
<!-- Generated by dever inspect --links. Do not edit. -->
<!-- source-sha256: eb439b9c77c2bf6e0d55e26f5ad1b2a024bc2783baebddb3756d892621724e0c -->
# report.archive
按求值顺序展示调用、分支和任务调度,包含 API 与自动 REST 入口。点击节点打开源码;双框为调用,虚线为调度或错误路径。外部库和驱动不展开。
图不是某次运行的日志,分句和 Adapter 按输入或配置选择。修改源码后运行 `dever inspect . --links`。
## 入口
- CMD [report.archive.api.submit](api.dever#L1) → [report.archive.submit](app.dever#L6)
- CMD [report.archive.api.total](api.dever#L3) → [report.archive.total](app.dever#L19)
- Job [report.archive.job.store](job.dever#L3)
## 外部调用方
当前加载的源码中没有已收录的外部调用。
## 能力与内部调用
### report.archive.Request
定义:[app.dever:1:1](app.dever#L1,1)
没有已收录的下游调用。
### report.archive.api.submit
定义:[api.dever:1:1](api.dever#L1,1)
<a id="flow-e67830c6d0f7d77d-1"></a>
```mermaid
flowchart TD
n0(["report.archive.api.submit"])
click n0 href "api.dever#L1,14" "打开源码"
n1[["report.archive.submit"]]
click n1 href "api.dever#L1,14" "打开源码"
n2(["返回命令结果;未捕获错误终止命令"])
n0 --> n1
n1 --> n2
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| report.archive.submit | [api.dever:1:14](api.dever#L1,14) | [report.archive.submit](link.md#flow-efc65eed6c9089ab-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.submit](app.dever#L6) | 领域内 | CMD 绑定 | [api.dever:1:14](api.dever#L1,14) |
### report.archive.api.total
定义:[api.dever:3:1](api.dever#L3,1)
<a id="flow-72cad6bf19cb8c40-1"></a>
```mermaid
flowchart TD
n0(["report.archive.api.total"])
click n0 href "api.dever#L3,13" "打开源码"
n1[["report.archive.total"]]
click n1 href "api.dever#L3,13" "打开源码"
n2(["返回命令结果;未捕获错误终止命令"])
n0 --> n1
n1 --> n2
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| report.archive.total | [api.dever:3:13](api.dever#L3,13) | [report.archive.total](link.md#flow-b00d0e9bba4b635b-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.total](app.dever#L19) | 领域内 | CMD 绑定 | [api.dever:3:13](api.dever#L3,13) |
### report.archive.job.store
定义:[job.dever:3:1](job.dever#L3,1)
<a id="flow-3208caa5c17a4976-1"></a>
```mermaid
flowchart TD
n0(["store"])
click n0 href "job.dever#L3,1" "打开源码"
n1(["返回"])
n3[["report.archive.store"]]
click n3 href "job.dever#L4,3" "打开源码"
n0 --> n3
n3 --> n1
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| report.archive.store | [job.dever:4:3](job.dever#L4,3) | [report.archive.store](link.md#flow-73a6995d7ee43f96-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.store](app.dever#L10) | 领域内 | 调用 | [job.dever:4:3](job.dever#L4,3) |
### report.archive.model.Archive
定义:[model.dever:1:1](model.dever#L1,1)
没有已收录的下游调用。
### report.archive.store
定义:[app.dever:10:1](app.dever#L10,1)
<a id="flow-73a6995d7ee43f96-1"></a>
```mermaid
flowchart TD
n0(["store"])
click n0 href "app.dever#L10,1" "打开源码"
n1(["返回"])
n3["report.archive.model.create"]
click n3 href "app.dever#L11,12" "打开源码"
n4["赋值 stored"]
click n4 href "app.dever#L11,12" "打开源码"
n0 --> n3
n3 --> n4
n4 --> n1
```
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.model.create](model.dever#L1) | 领域内 | 内建操作 | [app.dever:11:12](app.dever#L11,12) |
### report.archive.submit
定义:[app.dever:6:1](app.dever#L6,1)
<a id="flow-efc65eed6c9089ab-1"></a>
```mermaid
flowchart TD
n0(["submit"])
click n0 href "app.dever#L6,1" "打开源码"
n1(["返回"])
n3["持久化任务入队"]
click n3 href "app.dever#L7,8" "打开源码"
n4[["Job:report.archive.job.store"]]
click n4 href "app.dever#L7,8" "打开源码"
n5["赋值 id"]
click n5 href "app.dever#L7,8" "打开源码"
n0 --> n3
n3 -.->|"由 Worker 后续调度,不等待执行"| n4
n3 --> n5
n5 --> n1
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| Job:report.archive.job.store | [app.dever:7:8](app.dever#L7,8) | [report.archive.job.store](link.md#flow-3208caa5c17a4976-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.job.store](job.dever#L3) | 领域内 | 入队 | [app.dever:7:26](app.dever#L7,26) |
### report.archive.total
定义:[app.dever:19:1](app.dever#L19,1)
<a id="flow-b00d0e9bba4b635b-1"></a>
```mermaid
flowchart TD
n0(["total"])
click n0 href "app.dever#L19,1" "打开源码"
n1(["返回"])
n3["report.archive.model.count"]
click n3 href "app.dever#L20,11" "打开源码"
n4["赋值 count"]
click n4 href "app.dever#L20,11" "打开源码"
n0 --> n3
n3 --> n4
n4 --> n1
```
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [report.archive.model.count](model.dever#L1) | 领域内 | 内建操作 | [app.dever:20:11](app.dever#L20,11) |
@@ -0,0 +1,4 @@
type Archive {
request_key: Text unique
title: Text
}
@@ -0,0 +1,12 @@
queued() () {
request = app.Request {
key = "test-report"
title = "Report"
}
first_id = app.submit(request)
assertEq(app.submit(request), first_id)
assertEq(dever.test.drainJobs(5), 1)
assertEq(app.total(), 1)
dever.test.advanceClock(1000)
assertEq(dever.test.drainJobs(5), 0)
}