@univerjs-pro/collaboration-worktree-service 1.0.0-insiders.20260808-70eefdd → 1.0.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/README.md +170 -0
- package/README.zh-CN.md +169 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +121 -69
- package/dist/index.mjs +1 -1
- package/package.json +4 -7
package/README.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# @univerjs-pro/collaboration-worktree-service
|
|
2
|
+
|
|
3
|
+
English | [简体中文](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
A network-agnostic Univer Worktree Service that provides collaboratively editable drafts, freezing, merge evaluation, and per-Unit merge for one or more Units.
|
|
6
|
+
|
|
7
|
+
Worktree isolates draft changesets by `(worktreeID, unitID)`, reuses the trunk `UniverCollabService` OT, Unit-data handling, and submission engine, and does not change the existing changeset structure.
|
|
8
|
+
|
|
9
|
+
When using Worktree Client, `UniverCollabWorktreeEndpoint` calls Worktree Service. Calling the Service APIs below directly is an advanced integration.
|
|
10
|
+
|
|
11
|
+
## Installation and creation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add \
|
|
15
|
+
@univerjs-pro/collaboration-service \
|
|
16
|
+
@univerjs-pro/collaboration-worktree-service \
|
|
17
|
+
@univerjs-pro/collaboration-worktree-endpoint \
|
|
18
|
+
@univerjs-pro/collaboration-database-sqlite \
|
|
19
|
+
@univerjs-pro/collaboration-worktree-database-sqlite
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
const trunkDatabase = new SQLiteDatabaseAdapter({ filename });
|
|
24
|
+
const worktreeDatabase = new SQLiteWorktreeDatabaseAdapter({ filename });
|
|
25
|
+
|
|
26
|
+
const collabService = new UniverCollabService({
|
|
27
|
+
dbAdapter: trunkDatabase,
|
|
28
|
+
});
|
|
29
|
+
const worktreeService = new UniverCollabWorktreeService({
|
|
30
|
+
trunk: {
|
|
31
|
+
service: collabService,
|
|
32
|
+
dbAdapter: trunkDatabase,
|
|
33
|
+
},
|
|
34
|
+
dbAdapter: worktreeDatabase,
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The trunk and Worktree Adapters may use the same SQLite file, but remain two independent contracts and lifecycle objects. All collaboration packages must use matching versions from the same release cohort.
|
|
39
|
+
|
|
40
|
+
Next, create `UniverCollabWorktreeEndpoint` and register it on the same Transport as the trunk Endpoint.
|
|
41
|
+
|
|
42
|
+
## Worktree middleware
|
|
43
|
+
|
|
44
|
+
Worktree middleware is independent of trunk Service middleware:
|
|
45
|
+
|
|
46
|
+
| Action | When it runs | Visible fields | Retry semantics | Typical uses |
|
|
47
|
+
| --- | --- | --- | --- | --- |
|
|
48
|
+
| `readWorktreeData` | After Worktree Request creation, before reading the Adapter | `userID`, `customData`, `request` | Once per API call | Worktree visibility and management-read ACL |
|
|
49
|
+
| `createWorktree` | After Request creation, before creating Worktree | `userID`, `customData`, `request` | Once per call | Creation permission, quota, discoverability scope |
|
|
50
|
+
| `addWorktreeUnit` | After Request creation, before adding a trunk Unit | `userID`, `customData`, `request` | Once per call | Unit read/edit permission |
|
|
51
|
+
| `createWorktreeUnit` | After preparing the initial snapshot, before creating a draft Unit | `userID`, `customData`, `request` | Once per call | New-Unit type, quota, creation permission |
|
|
52
|
+
| `markWorktreeReady` | After Request creation, before Adapter freezes each Unit's current draft revision | `userID`, `customData`, `request` | Once per call | Ready permission and review rules |
|
|
53
|
+
| `reopenWorktree` | After Request creation, before Adapter returns to draft | `userID`, `customData`, `request` | Once per call | Reopen permission |
|
|
54
|
+
| `discardWorktree` | After Request creation, before Adapter discard | `userID`, `customData`, `request` | Once per call | Discard permission and audit |
|
|
55
|
+
| `mergeWorktree` | After Request creation, before starting or continuing per-Unit merge | `userID`, `memberID`, `customData`, `request` | Once per merge call; internal Unit submission retries do not repeat it | Formal merge permission |
|
|
56
|
+
| `readUnitData` | After Worktree Unit Request creation, before reading draft data | `userID`, `customData`, `request` | Once per API call | Draft Unit read ACL, merge-preview reads |
|
|
57
|
+
| `submitChangeset` | After draft submission Request creation, before idempotency and OT | `userID`, `memberID`, `customData`, `request` | Once per logical submission; database revision conflicts do not repeat it | Draft edit ACL, size limits |
|
|
58
|
+
| `applyChangeset` | After OT aligns changeset to current revision, before applying it to pending Unit state | `userID`, `memberID`, `customData`, `request`, `changeset`, `currentRevision`, `attempt` | Repeated after database revision conflict | Authorization and validation of aligned mutations |
|
|
59
|
+
| `commitChangeset` | After applying changeset to pending Unit state, before Adapter checks revision and writes | `userID`, `memberID`, `customData`, `request`, `changeset`, `expectedHeadRevision`, `attempt` | Repeated after database revision conflict | Final revision checks and metrics |
|
|
60
|
+
|
|
61
|
+
`applyChangeset` and `commitChangeset` must be retry-safe and cannot perform non-reversible side effects. A final merge into trunk still enters the trunk Service's own middleware.
|
|
62
|
+
|
|
63
|
+
## Advanced integration: call Worktree Service directly
|
|
64
|
+
|
|
65
|
+
Every call explicitly supplies the current user; no stateful Worktree handle needs to be opened or bound first:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
const context = {
|
|
69
|
+
userID: user.userId,
|
|
70
|
+
customData: { tenantID, traceID },
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
await worktreeService.createWorktree(
|
|
74
|
+
{ worktreeID, units: [unitID] },
|
|
75
|
+
context
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
await worktreeService.markReady({ worktreeID }, context);
|
|
79
|
+
|
|
80
|
+
const result = await worktreeService.mergeWorktree(
|
|
81
|
+
{ worktreeID },
|
|
82
|
+
{ ...context, memberID }
|
|
83
|
+
);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Regular lifecycle and read methods need only `userID`. `submitChangeset()` and `mergeWorktree()` also need `memberID` because they may be associated with an online collaboration submission. When using the frontend SDK through Worktree Endpoint, Endpoint supplies the online Session's `memberID`. Applications calling these methods directly supply one themselves; the Service only passes the string through.
|
|
87
|
+
|
|
88
|
+
`customData` belongs only to the current call. It can hold tenant, trace, or ACL query caches and is not automatically persisted into Worktree or changesets.
|
|
89
|
+
|
|
90
|
+
A retry of the same draft submission keeps `unitID/type/sid/reqId`; its `baseRev` may advance only through confirmed changesets ordered before it and must not pass its own confirmed revision. After reading and validating `(baseRev, draftHead]` history, the Service checks for a duplicate before OT and `applyChangeset`. The Database Adapter only serializes instance races with revision CAS; a losing attempt reloads and finds the submission in the new history.
|
|
91
|
+
|
|
92
|
+
## Common APIs
|
|
93
|
+
|
|
94
|
+
- `createWorktree()` / `getWorktree()`: create and read a Worktree.
|
|
95
|
+
- `addUnit()`: add an existing trunk Unit to a Worktree.
|
|
96
|
+
- `setUnitRemoved({ worktreeID, unitID, removed })`: reversibly remove a Unit from draft content merge.
|
|
97
|
+
- `createUnitFromSnapshot()` / `createUnitFromData()`: create a Worktree-local Unit.
|
|
98
|
+
- `getUnitLoadData()` / `getChangesets()`: read draft collaboration data.
|
|
99
|
+
- `submitChangeset()`: submit a draft changeset.
|
|
100
|
+
- `markReady()` / `reopenWorktree()` / `discardWorktree()`: advance or terminate the lifecycle.
|
|
101
|
+
- `evaluateWorktreeUnitMerge()`: generate a merge evaluation or preview for one Unit.
|
|
102
|
+
- `mergeWorktree()`: merge Worktree Units into trunk one by one.
|
|
103
|
+
|
|
104
|
+
## Lifecycle
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
create → draft → ready → merging → merged
|
|
108
|
+
↑ │
|
|
109
|
+
└ reopen┘
|
|
110
|
+
|
|
111
|
+
draft/ready → discarded
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- Only `draft` accepts further changesets.
|
|
115
|
+
- `markReady()` freezes each Unit's current draft revision.
|
|
116
|
+
- `reopenWorktree()` permits `ready → draft`.
|
|
117
|
+
- `mergeWorktree()` merges one Unit at a time into trunk.
|
|
118
|
+
- Multi-Unit merge is not atomic across Units; display each Unit's `mergeResult`.
|
|
119
|
+
|
|
120
|
+
A Worktree can reference an existing trunk Unit or create a Worktree-only Unit through `createUnitFromData()`. After merge, a new Unit is created in trunk at revision `1`; draft changeset history is not copied.
|
|
121
|
+
|
|
122
|
+
## Permission boundary
|
|
123
|
+
|
|
124
|
+
Worktree middleware and trunk Service middleware are independent. Protect the Worktree and final trunk writes separately: check visibility in `readWorktreeData`, draft edit rights in `submitChangeset`, and formal merge rights in `mergeWorktree`. Merging into trunk still executes trunk Service authorization middleware.
|
|
125
|
+
|
|
126
|
+
A merge preview reuses read permission and does not grant formal merge permission. Worktree discoverability scope also cannot replace current Unit ACL checks.
|
|
127
|
+
|
|
128
|
+
## Merge evaluation
|
|
129
|
+
|
|
130
|
+
`evaluateWorktreeUnitMerge()` is used only in `ready` and may return:
|
|
131
|
+
|
|
132
|
+
- `preview`: trunk advanced and a static merged-result snapshot was generated.
|
|
133
|
+
- `conflict`: Worktree changes cannot be automatically merged into current trunk through OT.
|
|
134
|
+
- `not-behind`: trunk has not advanced past the revision recorded when Worktree was created.
|
|
135
|
+
- `already-merged`: this Unit completed in a previous partial merge.
|
|
136
|
+
- `not-applicable`: a Worktree-created Unit has no initial trunk revision.
|
|
137
|
+
|
|
138
|
+
Evaluation does not submit a changeset or change Worktree state. Formal merge always uses trunk state at execution time.
|
|
139
|
+
|
|
140
|
+
## Limitations and disposal
|
|
141
|
+
|
|
142
|
+
Whole-Worktree deletion, rollback/reset, History, cleanup of referenced trunk history, and periodic draft snapshots are not currently provided. Shutdown order is Worktree Service → trunk Service → both Adapters:
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
await worktreeService.dispose();
|
|
146
|
+
await collabService.dispose();
|
|
147
|
+
await worktreeDatabase.dispose();
|
|
148
|
+
await trunkDatabase.dispose();
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Reviewed Unit removal
|
|
152
|
+
|
|
153
|
+
`setUnitRemoved({ worktreeID, unitID, removed: true }, context)` records a
|
|
154
|
+
removal intent in an editable draft. Use `removed: false` to undo it while the
|
|
155
|
+
draft is editable. Removal preserves draft history, blocks draft writes, and
|
|
156
|
+
is frozen by `markReady`. A Unit with a terminal merge result cannot be changed.
|
|
157
|
+
|
|
158
|
+
Merge records `mergeResult.status: "removed"` and never publishes that Unit's
|
|
159
|
+
draft content. A removed Worktree-created Unit is never created in trunk. An
|
|
160
|
+
existing trunk Unit remains intact: the application owns any directory removal,
|
|
161
|
+
Trash policy, authorization, and durable recovery after observing the terminal
|
|
162
|
+
removal result. SDK removal is not a trunk delete API. A removed Unit has no
|
|
163
|
+
content merge preview (`not-applicable`, reason `removed-unit`).
|
|
164
|
+
|
|
165
|
+
The `setWorktreeUnitRemoved` middleware runs once before the atomic Adapter
|
|
166
|
+
update. Its context exposes `userID`, the call's `customData`, and the exact
|
|
167
|
+
request (`worktreeID`, `unitID`, `removed`). Use it for draft access and removal
|
|
168
|
+
policy checks; idempotent retries still run middleware. The
|
|
169
|
+
`worktreeUnitRemovalChanged` event fires after a changed intent is persisted;
|
|
170
|
+
no-op retries do not emit a duplicate event.
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# @univerjs-pro/collaboration-worktree-service
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
无网络依赖的 Univer Worktree Service,为一个或多个 Unit 提供可协同编辑的 draft、冻结、
|
|
6
|
+
合入评估和逐 Unit merge。
|
|
7
|
+
|
|
8
|
+
Worktree 以 `(worktreeID, unitID)` 隔离 draft changesets,复用 trunk
|
|
9
|
+
`UniverCollabService` 的 OT、Unit 数据处理和提交引擎,不修改现有 changeset 结构。
|
|
10
|
+
|
|
11
|
+
使用 Worktree Client 时,由 `UniverCollabWorktreeEndpoint` 调用 Worktree Service;应用
|
|
12
|
+
直接调用下面的 Service API 属于高级集成。
|
|
13
|
+
|
|
14
|
+
## 安装与创建
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm add \
|
|
18
|
+
@univerjs-pro/collaboration-service \
|
|
19
|
+
@univerjs-pro/collaboration-worktree-service \
|
|
20
|
+
@univerjs-pro/collaboration-worktree-endpoint \
|
|
21
|
+
@univerjs-pro/collaboration-database-sqlite \
|
|
22
|
+
@univerjs-pro/collaboration-worktree-database-sqlite
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const trunkDatabase = new SQLiteDatabaseAdapter({ filename });
|
|
27
|
+
const worktreeDatabase = new SQLiteWorktreeDatabaseAdapter({ filename });
|
|
28
|
+
|
|
29
|
+
const collabService = new UniverCollabService({
|
|
30
|
+
dbAdapter: trunkDatabase,
|
|
31
|
+
});
|
|
32
|
+
const worktreeService = new UniverCollabWorktreeService({
|
|
33
|
+
trunk: {
|
|
34
|
+
service: collabService,
|
|
35
|
+
dbAdapter: trunkDatabase,
|
|
36
|
+
},
|
|
37
|
+
dbAdapter: worktreeDatabase,
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
trunk 和 Worktree Adapter 可以使用同一个 SQLite 文件,但仍是两个独立契约和生命周期
|
|
42
|
+
对象。全部协同包必须使用同一 release cohort 的匹配版本。
|
|
43
|
+
|
|
44
|
+
接着创建 `UniverCollabWorktreeEndpoint`,并与 trunk Endpoint 注册到同一个
|
|
45
|
+
Transport。
|
|
46
|
+
|
|
47
|
+
## Worktree middleware
|
|
48
|
+
|
|
49
|
+
Worktree middleware 与 trunk Service middleware 相互独立:
|
|
50
|
+
|
|
51
|
+
| Action | 触发时机 | 可见字段 | 重试语义 | 典型用途 |
|
|
52
|
+
| --- | --- | --- | --- | --- |
|
|
53
|
+
| `readWorktreeData` | Worktree Request 创建后、读 Adapter 前 | `userID`、`customData`、`request` | 每次 API 调用一次 | Worktree 可见性和管理读取 ACL |
|
|
54
|
+
| `createWorktree` | Request 创建后、创建 Worktree 前 | `userID`、`customData`、`request` | 每次调用一次 | 创建权限、配额和可发现范围 |
|
|
55
|
+
| `addWorktreeUnit` | Request 创建后、加入 trunk Unit 前 | `userID`、`customData`、`request` | 每次调用一次 | Unit 读取/编辑权限 |
|
|
56
|
+
| `createWorktreeUnit` | 初始 snapshot 准备后、创建 draft Unit 前 | `userID`、`customData`、`request` | 每次调用一次 | 新 Unit 类型、配额和创建权限 |
|
|
57
|
+
| `markWorktreeReady` | Request 创建后、Adapter 冻结各 Unit 当前 draft revision 前 | `userID`、`customData`、`request` | 每次调用一次 | ready 权限和评审规则 |
|
|
58
|
+
| `reopenWorktree` | Request 创建后、Adapter 切回 draft 前 | `userID`、`customData`、`request` | 每次调用一次 | reopen 权限 |
|
|
59
|
+
| `discardWorktree` | Request 创建后、Adapter discard 前 | `userID`、`customData`、`request` | 每次调用一次 | discard 权限和审计 |
|
|
60
|
+
| `mergeWorktree` | Request 创建后、开始或继续逐 Unit merge 前 | `userID`、`memberID`、`customData`、`request` | 每次 merge 调用一次;内部 Unit 提交重试不重复该 action | 正式合入权限 |
|
|
61
|
+
| `readUnitData` | Worktree Unit Request 创建后、读取 draft 数据前 | `userID`、`customData`、`request` | 每次 API 调用一次 | draft Unit 读取 ACL、合入预览读取 |
|
|
62
|
+
| `submitChangeset` | draft 提交 Request 创建后、幂等与 OT 前 | `userID`、`memberID`、`customData`、`request` | 每次逻辑提交一次;数据库 revision 冲突重试时不重复 | draft 编辑 ACL、大小限制 |
|
|
63
|
+
| `applyChangeset` | changeset 已通过 OT 与当前 revision 对齐、应用到待提交 Unit 状态前 | `userID`、`memberID`、`customData`、`request`、`changeset`、`currentRevision`、`attempt` | 数据库 revision 冲突后重复 | 对齐后 mutation 的授权和校验 |
|
|
64
|
+
| `commitChangeset` | changeset 已应用到待提交 Unit 状态、Adapter 检查 revision 并写入前 | `userID`、`memberID`、`customData`、`request`、`changeset`、`expectedHeadRevision`、`attempt` | 数据库 revision 冲突后重复 | 最终 revision 检查和指标 |
|
|
65
|
+
|
|
66
|
+
`applyChangeset` 和 `commitChangeset` 必须可重试,不能执行不可回滚副作用。Worktree 最终
|
|
67
|
+
合入 trunk 时仍会进入 trunk Service 自己的 middleware。
|
|
68
|
+
|
|
69
|
+
## 高级集成:直接使用 Worktree Service API
|
|
70
|
+
|
|
71
|
+
每次调用都显式传入当前用户,不需要先打开或绑定一个有状态的 Worktree handle:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const context = {
|
|
75
|
+
userID: user.userId,
|
|
76
|
+
customData: { tenantID, traceID },
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
await worktreeService.createWorktree(
|
|
80
|
+
{ worktreeID, units: [unitID] },
|
|
81
|
+
context
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
await worktreeService.markReady({ worktreeID }, context);
|
|
85
|
+
|
|
86
|
+
const result = await worktreeService.mergeWorktree(
|
|
87
|
+
{ worktreeID },
|
|
88
|
+
{ ...context, memberID }
|
|
89
|
+
);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
普通生命周期和读取方法只需要 `userID`。`submitChangeset()` 与 `mergeWorktree()` 还需要
|
|
93
|
+
`memberID`,因为它们可能关联一次在线协同提交。通过 Worktree Endpoint 使用前端 SDK
|
|
94
|
+
时,Endpoint 会提供在线 Session 的 `memberID`;应用直接调用这两个方法时自行传入,
|
|
95
|
+
Service 只透传该字符串。
|
|
96
|
+
|
|
97
|
+
`customData` 只属于本次调用,可用于 tenant、trace 或 ACL 查询缓存,不会自动持久化到
|
|
98
|
+
Worktree 或 changeset。
|
|
99
|
+
|
|
100
|
+
重试同一个 draft submission 时保持 `unitID/type/sid/reqId`;`baseRev` 只能越过排在它
|
|
101
|
+
之前的 confirmed changesets,不能越过自身 confirmed revision。Service 在读取并验证
|
|
102
|
+
`(baseRev, draftHead]` history 后、执行 OT 和 `applyChangeset` 前检查重复提交;Database
|
|
103
|
+
Adapter 只用 revision CAS 串行化多实例竞态,失败方 reload 后从新 history 命中 submission。
|
|
104
|
+
|
|
105
|
+
## 常用 API
|
|
106
|
+
|
|
107
|
+
- `createWorktree()` / `getWorktree()`:创建和读取 Worktree。
|
|
108
|
+
- `addUnit()`:把已有 trunk Unit 加入 Worktree。
|
|
109
|
+
- `createUnitFromSnapshot()` / `createUnitFromData()`:创建 Worktree 本地 Unit。
|
|
110
|
+
- `getUnitLoadData()` / `getChangesets()`:读取 draft 协同数据。
|
|
111
|
+
- `submitChangeset()`:提交 draft changeset。
|
|
112
|
+
- `markReady()` / `reopenWorktree()` / `discardWorktree()`:推进或终止生命周期。
|
|
113
|
+
- `evaluateWorktreeUnitMerge()`:生成单个 Unit 的合入评估或预览。
|
|
114
|
+
- `mergeWorktree()`:把 Worktree 中的 Unit 逐个合入 trunk。
|
|
115
|
+
|
|
116
|
+
## 生命周期
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
create → draft → ready → merging → merged
|
|
120
|
+
↑ │
|
|
121
|
+
└ reopen┘
|
|
122
|
+
|
|
123
|
+
draft/ready → discarded
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- 只有 `draft` 可以继续提交 changeset。
|
|
127
|
+
- `markReady()` 冻结每个 Unit 当前的 draft revision。
|
|
128
|
+
- `reopenWorktree()` 允许 `ready → draft`。
|
|
129
|
+
- `mergeWorktree()` 逐 Unit 合入 trunk。
|
|
130
|
+
- 多 Unit merge 不保证跨 Unit 原子性,应展示每个 Unit 的 `mergeResult`。
|
|
131
|
+
|
|
132
|
+
Worktree 可以引用已有 trunk Unit,也可以通过 `createUnitFromData()` 创建只存在于
|
|
133
|
+
Worktree 的新 Unit。新 Unit merge 后以 revision `1` 在 trunk 创建,不复制 draft
|
|
134
|
+
changeset 历史。
|
|
135
|
+
|
|
136
|
+
## 权限边界
|
|
137
|
+
|
|
138
|
+
Worktree middleware 与 trunk Service middleware 相互独立。应用应分别保护 Worktree
|
|
139
|
+
本身和最终 trunk 写入。例如在 `readWorktreeData` 检查可见性,在 `submitChangeset`
|
|
140
|
+
检查 draft 编辑权,在 `mergeWorktree` 检查正式合入权;合入 trunk 时仍会执行 trunk
|
|
141
|
+
Service 自己的权限 middleware。
|
|
142
|
+
|
|
143
|
+
合入预览复用读取权限,不代表用户拥有正式 merge 权限。Worktree 的可发现范围也不能替代
|
|
144
|
+
实时的 Unit ACL 检查。
|
|
145
|
+
|
|
146
|
+
## 合入评估
|
|
147
|
+
|
|
148
|
+
`evaluateWorktreeUnitMerge()` 只在 `ready` 状态使用,可能返回:
|
|
149
|
+
|
|
150
|
+
- `preview`:trunk 已前进,并生成静态合入结果 snapshot。
|
|
151
|
+
- `conflict`:Worktree 修改无法通过 OT 自动合入当前 trunk。
|
|
152
|
+
- `not-behind`:trunk 自创建 Worktree 时记录的 revision 后没有前进。
|
|
153
|
+
- `already-merged`:该 Unit 已在之前的部分 merge 中完成。
|
|
154
|
+
- `not-applicable`:Worktree 内新建 Unit,没有对应的初始 trunk revision。
|
|
155
|
+
|
|
156
|
+
评估不会提交 changeset,也不会改变 Worktree 状态;正式 merge 始终以执行时的 trunk
|
|
157
|
+
为准。
|
|
158
|
+
|
|
159
|
+
## 限制与资源释放
|
|
160
|
+
|
|
161
|
+
当前不提供 Worktree 删除、回滚/重置、History、Worktree 引用的 trunk 历史清理或周期性
|
|
162
|
+
draft snapshot。停止顺序为 Worktree Service → trunk Service → 两个 Adapter:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
await worktreeService.dispose();
|
|
166
|
+
await collabService.dispose();
|
|
167
|
+
await worktreeDatabase.dispose();
|
|
168
|
+
await trunkDatabase.dispose();
|
|
169
|
+
```
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object['defineProperty'](exports,Symbol['toStringTag'],{'value':'Module'});let e=require('node:crypto'),t=require('node:util'),n=require('@univerjs-pro/collaboration-service'),r=require('@univerjs/protocol');var i=class extends Error{['code'];['retryable'];['details'];constructor(_0x445cf2,_0x6e4f4a,_0x1f9e07={}){super(_0x6e4f4a,{'cause':_0x1f9e07['cause']}),this['name']='WorktreeError',this['code']=_0x445cf2,this['retryable']=_0x1f9e07['retryable']??!0x1,_0x1f9e07['details']!==void 0x0&&(this['details']=_0x1f9e07['details']);}},a=class{['_worktreeID'];['_trunk'];['_worktree'];constructor(_0x170bbd,_0x5e5121,_0x528e5b){this['_worktreeID']=_0x170bbd,this['_trunk']=_0x5e5121,this['_worktree']=_0x528e5b;}async['getUnit'](_0x5e7ef7,_0x3dc597){let _0xa7349a=await this['_worktree']['getWorktreeUnit'](_0x5e7ef7,this['_worktreeID'],_0x3dc597);return _0xa7349a?{'unitID':_0xa7349a['unitID'],'type':_0xa7349a['type'],'headRevision':_0xa7349a['draftHeadRevision']}:null;}async['getSnapshot'](_0x1b7bf3,_0x3c5fc8,_0x45727c){let _0xe12e8f=await this['_getUnitRecord'](_0x1b7bf3,_0x3c5fc8);if(!_0xe12e8f)return null;let _0x2a39b9=_0x45727c?.['revision'],_0x2318c1=_0x2a39b9===void 0x0||_0x2a39b9===0x0?_0xe12e8f['draftHeadRevision']:Math['min'](_0x2a39b9,_0xe12e8f['draftHeadRevision']);if(_0xe12e8f['source']==='worktree')return(await this['_worktree']['getUnitSeed'](_0x1b7bf3,this['_worktreeID'],_0x3c5fc8))?.['snapshot']??null;let _0x1205a9=o(_0xe12e8f);return this['_trunk']['getSnapshot'](_0x1b7bf3,_0x3c5fc8,{'revision':Math['min'](_0x2318c1,_0x1205a9)});}async['getChangesets'](_0x1cd0d1,_0xeeda6d,_0x546f9a){let _0x4e0f8b=await this['_getUnitRecord'](_0x1cd0d1,_0xeeda6d);if(!_0x4e0f8b)return{'changesets':[],'latestRevision':0x0};let _0x245927=_0x546f9a['to']===0x0?_0x4e0f8b['draftHeadRevision']:Math['min'](_0x546f9a['to'],_0x4e0f8b['draftHeadRevision']);if(_0x4e0f8b['source']==='worktree')return{'changesets':[...(_0x546f9a['from']<_0x245927?await this['_worktree']['getDraftChangesets'](_0x1cd0d1,this['_worktreeID'],_0xeeda6d,{'from':Math['max'](_0x546f9a['from'],0x1),'to':_0x245927}):{'changesets':[]})['changesets']],'latestRevision':_0x4e0f8b['draftHeadRevision']};let _0x3e9e6e=o(_0x4e0f8b),_0x4a3440=Math['min'](_0x245927,_0x3e9e6e),_0x3fb424=_0x546f9a['from']<_0x4a3440?await this['_trunk']['getChangesets'](_0x1cd0d1,_0xeeda6d,{'from':_0x546f9a['from'],'to':_0x4a3440}):{'changesets':[]},_0x349fe6=Math['max'](_0x546f9a['from'],_0x3e9e6e),_0x61a22f=_0x349fe6<_0x245927?await this['_worktree']['getDraftChangesets'](_0x1cd0d1,this['_worktreeID'],_0xeeda6d,{'from':_0x349fe6,'to':_0x245927}):{'changesets':[]};return{'changesets':[..._0x3fb424['changesets'],..._0x61a22f['changesets']],'latestRevision':_0x4e0f8b['draftHeadRevision']};}['getSubmission'](_0x47e468,_0x2614a6,_0x45bf5c,_0x5de6fa){return this['_worktree']['getDraftSubmission'](_0x47e468,this['_worktreeID'],_0x2614a6,_0x45bf5c,_0x5de6fa);}async['createUnit'](_0x1cd3f6,_0x355b32){switch((await this['_worktree']['createUnit'](_0x1cd3f6,{'unit':{'worktreeID':this['_worktreeID'],'unitID':_0x355b32['record']['unitID'],'type':_0x355b32['record']['type'],'source':'worktree','draftHeadRevision':0x1},'seed':{'snapshot':_0x355b32['snapshot'],..._0x355b32['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0x355b32['sheetBlocks']}}}))['status']){case'created':return{'status':'created','record':_0x355b32['record']};case'already-created':return{'status':'already-exists','record':_0x355b32['record']};case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20'+this['_worktreeID']+'\x20does\x20not\x20exist');case'unit-exists':throw new n['CollabError']('INVALID_REQUEST','Unit\x20'+_0x355b32['record']['unitID']+'\x20already\x20exists\x20in\x20the\x20Worktree');case'status-mismatch':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20'+this['_worktreeID']+'\x20is\x20not\x20editable');}}['deleteUnits'](_0x4c39f8,_0x5b5d69){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20delete\x20Units\x20through\x20a\x20Worktree\x20draft'));}['recoverUnits'](_0xa35d9e,_0x3e61a9){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20recover\x20Units\x20through\x20a\x20Worktree\x20draft'));}async['commitChangeset'](_0x34c031,_0xbb78a7){let _0x5a0272=await this['_worktree']['commitDraftChangeset'](_0x34c031,{'worktreeID':this['_worktreeID'],'expectedHeadRevision':_0xbb78a7['expectedHeadRevision'],'changeset':_0xbb78a7['changeset']});switch(_0x5a0272['status']){case'committed':case'already-committed':case'revision-mismatch':return _0x5a0272;case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20or\x20Worktree\x20Unit\x20does\x20not\x20exist');case'not-editable':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20is\x20'+_0x5a0272['worktreeStatus']);case'unit-frozen':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20Unit\x20has\x20already\x20been\x20merged');}}['saveSnapshot'](_0x1d2b7b,_0x7afcfc){return Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20draft\x20snapshots\x20are\x20disabled'));}async['getSheetBlock'](_0x5714c1,_0x247eae,_0x5a0611){let _0x1c12f5=await this['_getUnitRecord'](_0x5714c1,_0x247eae);return _0x1c12f5?_0x1c12f5['source']==='worktree'?(await this['_worktree']['getUnitSeed'](_0x5714c1,this['_worktreeID'],_0x247eae))?.['sheetBlocks']?.['find'](_0x1cd78e=>_0x1cd78e['id']===_0x5a0611)??null:this['_trunk']['getSheetBlock'](_0x5714c1,_0x247eae,_0x5a0611):null;}['_getUnitRecord'](_0x40a781,_0x5e9fa8){return this['_worktree']['getWorktreeUnit'](_0x40a781,this['_worktreeID'],_0x5e9fa8);}};function o(_0x202ca3){if(_0x202ca3['source']!=='trunk'||!Number['isSafeInteger'](_0x202ca3['baselineTrunkRevision'])||_0x202ca3['baselineTrunkRevision']<0x1)throw new n['CollabError']('ADAPTER_FAILURE','Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x202ca3['baselineTrunkRevision'];}async function s(_0x2b4e30){let _0x58a941=new n['UniverUnitRuntime']({'dbAdapter':_0x2b4e30['dbAdapter'],..._0x2b4e30['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x2b4e30['runtime']['maxLoadedUnits']},..._0x2b4e30['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x2b4e30['runtime']['idleTimeoutMs']}});try{let _0x52b788=await _0x58a941['ensureUnit'](_0x2b4e30['context'],_0x2b4e30['unitID'],_0x2b4e30['type']);try{if(_0x52b788['revision']!==_0x2b4e30['expectedRevision'])throw c('Unit\x20Runtime\x20did\x20not\x20reach\x20the\x20frozen\x20Worktree\x20revision');let _0x5edebd=await _0x58a941['createSnapshot'](_0x52b788);if(_0x5edebd['snapshot']['unitID']!==_0x2b4e30['unitID']||_0x5edebd['snapshot']['type']!==_0x2b4e30['type']||_0x5edebd['snapshot']['rev']!==_0x2b4e30['expectedRevision'])throw c('Unit\x20Runtime\x20returned\x20an\x20invalid\x20Worktree\x20snapshot');return _0x5edebd;}finally{_0x58a941['releaseUnit'](_0x52b788);}}finally{await _0x58a941['dispose']();}}function c(_0x1eab59){return new n['CollabError']('ADAPTER_FAILURE',_0x1eab59,{'retryable':!0x0});}async function l(_0x395c2e){let _0x54fa5f=new n['UniverUnitRuntime']({'dbAdapter':_0x395c2e['dbAdapter'],..._0x395c2e['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x395c2e['runtime']['maxLoadedUnits']},..._0x395c2e['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x395c2e['runtime']['idleTimeoutMs']}});try{let _0x416dd5=u(_0x54fa5f,_0x395c2e),_0x5774fa=await _0x54fa5f['ensureUnit'](_0x395c2e['context'],_0x395c2e['unitID'],_0x395c2e['type']);try{if(_0x5774fa['revision']!==_0x395c2e['trunkHeadRevision'])throw new n['CollabError']('REVISION_MISMATCH','Trunk\x20changed\x20while\x20materializing\x20Worktree\x20merge\x20preview',{'retryable':!0x0});if(await _0x54fa5f['applyChangeset'](_0x395c2e['context'],_0x5774fa,_0x416dd5),_0x5774fa['revision']!==_0x416dd5['revision'])throw new n['CollabError']('INTERNAL_ERROR','Preview\x20Runtime\x20did\x20not\x20reach\x20the\x20merge\x20candidate\x20revision',{'retryable':!0x0});return await _0x54fa5f['createSnapshot'](_0x5774fa);}finally{_0x54fa5f['releaseUnit'](_0x5774fa);}}finally{await _0x54fa5f['dispose']();}}function u(_0x1a7143,_0x4b53de){let _0xc6c7d4={...structuredClone(_0x4b53de['original']),'userID':_0x4b53de['session']['userId'],'memberID':_0x4b53de['session']['memberId'],'revision':_0x4b53de['original']['baseRev']+0x1},_0x2b39cd=_0x1a7143['changesetTransformer']['parseClient'](_0xc6c7d4);return{..._0x1a7143['changesetTransformer']['transform'](_0x2b39cd,_0x4b53de['trunkHistory']),'unitID':_0x4b53de['original']['unitID'],'type':_0x4b53de['original']['type'],'baseRev':_0x4b53de['trunkHeadRevision'],'revision':_0x4b53de['trunkHeadRevision']+0x1,'userID':_0x4b53de['session']['userId'],'memberID':_0x4b53de['session']['memberId'],'sid':_0x4b53de['original']['sid'],'reqId':_0x4b53de['original']['reqId']};}var d=class{['_middlewares']=new Map();['use'](_0x39d2db,_0x1448fc){let _0x61a50e=this['_middlewares']['get'](_0x39d2db)??[],_0x52e5f0=_0x1448fc;_0x61a50e['push'](_0x52e5f0),this['_middlewares']['set'](_0x39d2db,_0x61a50e);let _0x521123=!0x1;return{'dispose':()=>{if(_0x521123)return;_0x521123=!0x0;let _0x1f8f1c=_0x61a50e['indexOf'](_0x52e5f0);_0x1f8f1c>=0x0&&_0x61a50e['splice'](_0x1f8f1c,0x1);}};}async['run'](_0x537e5b,_0x4145af,_0x6c8988){let _0x39dda3=[...this['_middlewares']['get'](_0x537e5b)??[]],_0x31cf99=async _0x315007=>{let _0x58b513=_0x39dda3[_0x315007];if(!_0x58b513){await _0x6c8988();return;}let _0x43e4d6=!0x1,_0x4a8d6a,_0x3f8056=()=>{if(_0x43e4d6)throw Error('Middleware\x20for\x20action\x20'+String(_0x537e5b)+'\x20called\x20next()\x20more\x20than\x20once');return _0x43e4d6=!0x0,_0x4a8d6a=_0x31cf99(_0x315007+0x1),_0x4a8d6a;};try{await _0x58b513(_0x4145af,_0x3f8056);}catch(_0x5ae5ef){if(_0x4a8d6a)try{await _0x4a8d6a;}catch{}throw _0x5ae5ef;}if(!_0x43e4d6)throw Error('Middleware\x20for\x20action\x20'+String(_0x537e5b)+'\x20completed\x20without\x20calling\x20next()');await _0x4a8d6a;};await _0x31cf99(0x0);}['clear'](){this['_middlewares']['clear']();}};function f(_0x2681a8){return _0x2681a8['customData']??Object['create'](null);}function p(_0xe12381,_0xd2b2f0){return{'worktreeID':_0xe12381['worktreeID'],'units':_0xe12381['units']??[],'customData':f(_0xd2b2f0)};}function m(_0xacc0ef,_0x55a90f){return{'worktreeID':_0xacc0ef['worktreeID'],'customData':f(_0x55a90f)};}function h(_0x443555,_0x11d724){return{'worktreeID':_0x443555['worktreeID'],'unitID':_0x443555['unitID'],'customData':f(_0x11d724)};}function g(_0x175f31,_0x15a350){return{'worktreeID':_0x175f31['worktreeID'],'customData':f(_0x15a350)};}function _(_0x1840f8,_0x355b91){return{'worktreeID':_0x1840f8['worktreeID'],'customData':f(_0x355b91)};}function v(_0x5bb1d4,_0x35e26f){return{'worktreeID':_0x5bb1d4['worktreeID'],'customData':f(_0x35e26f)};}function y(_0x1d4142,_0x31d08f){return{'worktreeID':_0x1d4142['worktreeID'],'customData':f(_0x31d08f)};}function b(_0x3d67d2,_0x1a1202){return{'worktreeID':_0x3d67d2['worktreeID'],'unitID':_0x3d67d2['unitID'],'customData':f(_0x1a1202)};}var x=class{['_onListenerError'];['_listeners']=new Map();constructor(_0x38ef61){this['_onListenerError']=_0x38ef61;}['on'](_0x37cfd2,_0x85489f){let _0x4c35a2=this['_listeners']['get'](_0x37cfd2)??[],_0x39b976=_0x85489f;_0x4c35a2['push'](_0x39b976),this['_listeners']['set'](_0x37cfd2,_0x4c35a2);let _0x5a4ac3=!0x1;return{'dispose':()=>{if(_0x5a4ac3)return;_0x5a4ac3=!0x0;let _0x5af51f=_0x4c35a2['indexOf'](_0x39b976);_0x5af51f>=0x0&&_0x4c35a2['splice'](_0x5af51f,0x1);}};}async['emit'](_0x2adf54,_0x363356){for(let _0x276596 of[...this['_listeners']['get'](_0x2adf54)??[]])try{await _0x276596(_0x363356);}catch(_0x2a32f0){try{this['_onListenerError'](_0x2a32f0);}catch{}}}['clear'](){this['_listeners']['clear']();}},S=class{['_state']='running';['_activeCalls']=0x0;['_resolveDrain'];['_disposePromise'];get['state'](){return this['_state'];}['run'](_0x410d3c){return this['_state']==='running'?(this['_activeCalls']+=0x1,Promise['resolve']()['then'](_0x410d3c)['finally'](()=>{--this['_activeCalls'],this['_activeCalls']===0x0&&(this['_resolveDrain']?.(),this['_resolveDrain']=void 0x0);})):Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_state'],{'retryable':!0x0}));}['dispose'](_0x2eb10f){return this['_disposePromise']?this['_disposePromise']:(this['_state']='disposing',this['_disposePromise']=this['_finishDispose'](_0x2eb10f),this['_disposePromise']);}async['_finishDispose'](_0x409083){this['_activeCalls']>0x0&&await new Promise(_0xaaaaad=>{this['_resolveDrain']=_0xaaaaad;});try{await _0x409083();}finally{this['_state']='disposed';}}},C=new Set([r['UniverType']['UNIVER_SHEET'],r['UniverType']['UNIVER_DOC'],r['UniverType']['UNIVER_SLIDE'],r['UniverType']['UNIVER_BOARD'],r['UniverType']['UNIVER_BASE']]),ee=class{['_trunkService'];['_trunkDbAdapter'];['_dbAdapter'];['_middleware']=new d();['_events'];['_lifecycle']=new S();['_logger'];['_metrics'];['_runtimeOptions'];['_maxRevisionRetries'];['_draftServices']=new Map();constructor(_0xb12520){if(!_0xb12520?.['trunk']?.['service']||!_0xb12520['trunk']['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20trunk\x20service\x20and\x20dbAdapter');if(!_0xb12520['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20a\x20Worktree\x20dbAdapter');if(this['_trunkService']=_0xb12520['trunk']['service'],this['_trunkDbAdapter']=_0xb12520['trunk']['dbAdapter'],this['_dbAdapter']=_0xb12520['dbAdapter'],this['_runtimeOptions']=_0xb12520['runtime'],this['_maxRevisionRetries']=_0xb12520['submitChangeset']?.['maxRevisionRetries'],this['_maxRevisionRetries']!==void 0x0&&(!Number['isSafeInteger'](this['_maxRevisionRetries'])||this['_maxRevisionRetries']<0x0))throw TypeError('submitChangeset.maxRevisionRetries\x20must\x20be\x20a\x20non-negative\x20safe\x20integer');this['_logger']=te(_0xb12520['logger']),this['_metrics']=ne(_0xb12520['metrics']),this['_events']=new x(_0x47ce0c=>{this['_logger']['error']('Worktree\x20Service\x20event\x20listener\x20failed',{'error':$(_0x47ce0c)});});}['use'](_0x3afec6,_0x16a167){return this['_assertRunning'](),this['_middleware']['use'](_0x3afec6,_0x16a167);}['on'](_0x37883b,_0x1871c1){return this['_assertRunning'](),this['_events']['on'](_0x37883b,_0x1871c1);}['createWorktree'](_0x1a75a6,_0x56a155){return this['_call']('createWorktree',async()=>{let _0x5e34e6=p(_0x1a75a6,_0x56a155),_0x360bca;return await this['_middleware']['run']('createWorktree',{'session':_0x56a155['session'],'request':_0x5e34e6},async()=>{w(_0x1a75a6['worktreeID']),D(_0x5e34e6['units']);let _0x434e78={'session':_0x56a155['session'],'request':_0x5e34e6},_0x784e27=await Promise['all'](_0x5e34e6['units']['map'](_0x24069b=>this['_requireTrunkUnit'](_0x434e78,_0x24069b))),_0x282553=await this['_database'](()=>this['_dbAdapter']['createWorktree'](_0x434e78,{'record':{'worktreeID':_0x1a75a6['worktreeID'],'sid':(0x0,e['randomUUID'])(),'status':'draft'},'units':_0x784e27['map'](_0x25feca=>({'worktreeID':_0x1a75a6['worktreeID'],'unitID':_0x25feca['unitID'],'type':_0x25feca['type'],'source':'trunk','baselineTrunkRevision':_0x25feca['headRevision'],'draftHeadRevision':_0x25feca['headRevision']}))})),_0x448a97=R(_0x282553['aggregate'],_0x1a75a6['worktreeID']);if(_0x282553['status']==='already-exists')throw new i('WORKTREE_ALREADY_EXISTS','Worktree\x20'+_0x1a75a6['worktreeID']+'\x20already\x20exists');L(_0x448a97,_0x5e34e6['units']),_0x360bca={'worktree':_0x448a97},await this['_events']['emit']('worktreeCreated',{'session':_0x56a155['session'],'request':_0x5e34e6,'worktree':_0x448a97,'occurredAt':Date['now']()});}),_0x360bca;});}['getWorktree'](_0x425c09,_0x1662c9){return this['_call']('getWorktree',async()=>{let _0x2c2d91=m(_0x425c09,_0x1662c9),_0x328591;return await this['_middleware']['run']('readWorktreeData',{'session':_0x1662c9['session'],'request':_0x2c2d91},async()=>{w(_0x425c09['worktreeID']);let _0x9863f3=await this['_database'](()=>this['_dbAdapter']['getWorktree']({'session':_0x1662c9['session'],'request':_0x2c2d91},_0x425c09['worktreeID']));if(!_0x9863f3)throw Y(_0x425c09['worktreeID']);_0x328591={'worktree':R(_0x9863f3,_0x425c09['worktreeID'])};}),_0x328591;});}['addUnit'](_0x54447d,_0x1ae4f7){return this['_call']('addUnit',async()=>{let _0x5c4e1e=h(_0x54447d,_0x1ae4f7),_0x33c478;return await this['_middleware']['run']('addWorktreeUnit',{'session':_0x1ae4f7['session'],'request':_0x5c4e1e},async()=>{if(w(_0x54447d['worktreeID']),!_0x54447d['unitID'])throw X('unitID\x20is\x20required');let _0x49871e={'session':_0x1ae4f7['session'],'request':_0x5c4e1e},_0x5e2265=await this['_requireTrunkUnit'](_0x49871e,_0x54447d['unitID']),_0x546ae1=await this['_database'](()=>this['_dbAdapter']['addUnit'](_0x49871e,{'unit':{'worktreeID':_0x54447d['worktreeID'],'unitID':_0x5e2265['unitID'],'type':_0x5e2265['type'],'source':'trunk','baselineTrunkRevision':_0x5e2265['headRevision'],'draftHeadRevision':_0x5e2265['headRevision']}}));if(_0x546ae1['status']==='not-found')throw Y(_0x54447d['worktreeID']);let _0x217365=R(_0x546ae1['aggregate'],_0x54447d['worktreeID']);if(_0x546ae1['status']==='status-mismatch')throw new i('WORKTREE_NOT_EDITABLE','Worktree\x20'+_0x54447d['worktreeID']+'\x20is\x20'+_0x217365['status'],{'details':{'status':_0x217365['status']}});if(_0x33c478={'worktree':_0x217365},_0x546ae1['status']==='added'){let _0x342e36=U(_0x217365,_0x54447d['unitID']);await this['_events']['emit']('worktreeUnitAdded',{'session':_0x1ae4f7['session'],'request':_0x5c4e1e,'worktree':_0x217365,'unit':_0x342e36,'occurredAt':Date['now']()});}}),_0x33c478;});}['createUnit'](_0x4e0e27,_0x39012e){return this['_call']('createUnit',async()=>{w(_0x4e0e27['worktreeID']);let _0xe3405d=T(_0x39012e),{worktreeID:_0x1d2abd,..._0x32eb47}=_0x4e0e27;return await this['_draftService'](_0x1d2abd)['createUnit'](_0x32eb47,_0xe3405d),{'worktree':R(await this['_requireWorktreeAggregate']({'session':_0xe3405d['session'],'request':{'worktreeID':_0x1d2abd,'customData':_0xe3405d['customData']}},_0x1d2abd),_0x1d2abd)};});}['createUnitFromData'](_0x39da9b,_0x5dea41){return this['_call']('createUnitFromData',async()=>{w(_0x39da9b['worktreeID']);let _0x370a12=T(_0x5dea41),{worktreeID:_0x4db5be,..._0x3d8008}=_0x39da9b;return await this['_draftService'](_0x4db5be)['createUnitFromData'](_0x3d8008,_0x370a12),{'worktree':R(await this['_requireWorktreeAggregate']({'session':_0x370a12['session'],'request':{'worktreeID':_0x4db5be,'customData':_0x370a12['customData']}},_0x4db5be),_0x4db5be)};});}['markReady'](_0x16a223,_0xbdd8fc){return this['_call']('markReady',async()=>{let _0x41486e=g(_0x16a223,_0xbdd8fc),_0x2fdd26;return await this['_middleware']['run']('markWorktreeReady',{'session':_0xbdd8fc['session'],'request':_0x41486e},async()=>{_0x2fdd26=await this['_transition'](_0x16a223['worktreeID'],_0xbdd8fc['session'],_0x41486e,()=>this['_dbAdapter']['markReady']({'session':_0xbdd8fc['session'],'request':_0x41486e},_0x16a223['worktreeID']));}),_0x2fdd26;});}['reopenWorktree'](_0x4f5cf1,_0x2ff11c){return this['_call']('reopenWorktree',async()=>{let _0x145fd7=_(_0x4f5cf1,_0x2ff11c),_0x4e5bd3;return await this['_middleware']['run']('reopenWorktree',{'session':_0x2ff11c['session'],'request':_0x145fd7},async()=>{_0x4e5bd3=await this['_transition'](_0x4f5cf1['worktreeID'],_0x2ff11c['session'],_0x145fd7,()=>this['_dbAdapter']['reopenWorktree']({'session':_0x2ff11c['session'],'request':_0x145fd7},_0x4f5cf1['worktreeID']));}),_0x4e5bd3;});}['discardWorktree'](_0x171cf3,_0x356cbe){return this['_call']('discardWorktree',async()=>{let _0x6f4ded=v(_0x171cf3,_0x356cbe),_0x214452;return await this['_middleware']['run']('discardWorktree',{'session':_0x356cbe['session'],'request':_0x6f4ded},async()=>{_0x214452=await this['_transition'](_0x171cf3['worktreeID'],_0x356cbe['session'],_0x6f4ded,()=>this['_dbAdapter']['discardWorktree']({'session':_0x356cbe['session'],'request':_0x6f4ded},_0x171cf3['worktreeID']));}),_0x214452;});}['mergeWorktree'](_0x3d9b11,_0x519add){return this['_call']('mergeWorktree',async()=>{let _0x18342=y(_0x3d9b11,_0x519add),_0x5a6ba5;return await this['_middleware']['run']('mergeWorktree',{'session':_0x519add['session'],'request':_0x18342},async()=>{w(_0x3d9b11['worktreeID']);let _0x53dea6={'session':_0x519add['session'],'request':_0x18342},_0x59b226=await this['_database'](()=>this['_dbAdapter']['startOrResumeMerge'](_0x53dea6,_0x3d9b11['worktreeID']));if(_0x59b226['status']==='not-found')throw Y(_0x3d9b11['worktreeID']);let _0x1cc7b6=_0x59b226['aggregate'],_0x19e9e0=R(_0x1cc7b6,_0x3d9b11['worktreeID']);if(_0x59b226['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x3d9b11['worktreeID']+'\x20cannot\x20merge\x20from\x20'+_0x19e9e0['status'],{'details':{'status':_0x19e9e0['status']}});if(_0x59b226['status']==='already-merged'){_0x5a6ba5={'worktree':_0x19e9e0};return;}_0x59b226['status']==='started'&&await this['_events']['emit']('worktreeStatusChanged',{'session':_0x519add['session'],'request':_0x18342,'worktree':_0x19e9e0,'previousStatus':'ready','status':'merging','occurredAt':Date['now']()});for(let _0x4c7032 of _0x1cc7b6['units']){if(J(_0x4c7032['mergeResult']))continue;let _0x21943a=await this['_mergeUnit'](_0x53dea6,_0x1cc7b6['worktree']['sid'],_0x4c7032,_0x519add),_0x3ea080=await this['_database'](()=>this['_dbAdapter']['recordUnitMergeResult'](_0x53dea6,{'worktreeID':_0x3d9b11['worktreeID'],'unitID':_0x4c7032['unitID'],'readyDraftHeadRevision':O(_0x4c7032),'mergeResult':_0x21943a}));if(_0x3ea080['status']==='not-found')throw Y(_0x3d9b11['worktreeID']);if(_0x3ea080['status']==='stale-merge'){if(_0x1cc7b6=await this['_requireWorktreeAggregate'](_0x53dea6,_0x3d9b11['worktreeID']),_0x19e9e0=R(_0x1cc7b6,_0x3d9b11['worktreeID']),_0x1cc7b6['worktree']['status']!=='merging')break;continue;}if(_0x3ea080['status']!=='recorded'&&_0x3ea080['status']!=='already-recorded')throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20result\x20status');_0x1cc7b6=_0x3ea080['aggregate'],_0x19e9e0=R(_0x1cc7b6,_0x3d9b11['worktreeID']),_0x3ea080['status']==='recorded'&&await this['_events']['emit']('worktreeUnitMergeResultRecorded',{'session':_0x519add['session'],'request':_0x18342,'worktree':_0x19e9e0,'unit':U(_0x19e9e0,_0x4c7032['unitID']),'occurredAt':Date['now']()});}if(_0x1cc7b6['worktree']['status']==='merging'){let _0x5e2946=await this['_database'](()=>this['_dbAdapter']['finishMerge'](_0x53dea6,_0x3d9b11['worktreeID']));if(_0x5e2946['status']==='not-found')throw Y(_0x3d9b11['worktreeID']);if(_0x1cc7b6=_0x5e2946['aggregate'],_0x19e9e0=R(_0x1cc7b6,_0x3d9b11['worktreeID']),_0x5e2946['status']==='transitioned')await this['_events']['emit']('worktreeStatusChanged',{'session':_0x519add['session'],'request':_0x18342,'worktree':_0x19e9e0,'previousStatus':_0x5e2946['previousStatus'],'status':_0x19e9e0['status'],'occurredAt':Date['now']()});else{if(_0x5e2946['status']==='status-mismatch'&&_0x19e9e0['status']!=='ready'&&_0x19e9e0['status']!=='merged')throw new i('WORKTREE_STALE_MERGE','Worktree\x20'+_0x3d9b11['worktreeID']+'\x20merge\x20was\x20superseded',{'retryable':!0x0,'details':{'status':_0x19e9e0['status']}});}}_0x5a6ba5={'worktree':_0x19e9e0};}),_0x5a6ba5;});}['evaluateWorktreeUnitMerge'](_0x25fb44,_0x486fcc){return this['_call']('evaluateWorktreeUnitMerge',async()=>{let _0x315974=b(_0x25fb44,_0x486fcc),_0x1fb9c0;return await this['_middleware']['run']('readUnitData',{'session':_0x486fcc['session'],'request':_0x315974},async()=>{if(w(_0x25fb44['worktreeID']),!_0x25fb44['unitID'])throw X('unitID\x20is\x20required');let _0x5046cb={'session':_0x486fcc['session'],'request':_0x315974},_0x5f0057=await this['_requireWorktreeAggregate'](_0x5046cb,_0x25fb44['worktreeID']);if(_0x5f0057['worktree']['status']!=='ready')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x25fb44['worktreeID']+'\x20cannot\x20preview\x20from\x20'+_0x5f0057['worktree']['status'],{'details':{'status':_0x5f0057['worktree']['status']}});let _0x5f26d2=_0x5f0057['units']['find'](_0x2be56e=>_0x2be56e['unitID']===_0x25fb44['unitID']);if(!_0x5f26d2)throw new i('WORKTREE_UNIT_NOT_FOUND','Unit\x20'+_0x25fb44['unitID']+'\x20does\x20not\x20exist\x20in\x20Worktree\x20'+_0x25fb44['worktreeID']);if(_0x5f26d2['source']==='worktree'){_0x1fb9c0={'status':'not-applicable','reason':'worktree-created-unit','worktreeID':_0x25fb44['worktreeID'],'unitID':_0x25fb44['unitID']};return;}if(J(_0x5f26d2['mergeResult'])){_0x1fb9c0={'status':'already-merged','worktreeID':_0x25fb44['worktreeID'],'unitID':_0x25fb44['unitID'],'mergeResult':q(_0x5f26d2['mergeResult'])};return;}let _0x3c8832=B(_0x5f26d2),_0x203fad=O(_0x5f26d2),_0x3e786a={'session':_0x486fcc['session'],'customData':_0x315974['customData']},_0x675c1c=await this['_trunkService']['getUnit']({'unitID':_0x5f26d2['unitID'],'type':_0x5f26d2['type'],'revision':0x0},_0x3e786a);if(_0x675c1c['headRevision']===_0x3c8832){_0x1fb9c0={'status':'not-behind','worktreeID':_0x25fb44['worktreeID'],'unitID':_0x25fb44['unitID']};return;}if(_0x675c1c['headRevision']<_0x3c8832)throw Z('Trunk\x20head\x20is\x20behind\x20the\x20Worktree\x20baseline');let _0xf21762=k(_0x5f26d2,_0x203fad,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x5046cb,_0x5f26d2['worktreeID'],_0x5f26d2['unitID'],{'from':_0x3c8832,'to':_0x203fad}))),_0x7fe60c=await this['_trunkService']['getChangesets']({'unitID':_0x5f26d2['unitID'],'type':_0x5f26d2['type'],'from':_0x3c8832,'to':_0x675c1c['headRevision']},_0x3e786a);try{let _0x2ab0f7={'context':_0x5046cb,'dbAdapter':this['_trunkDbAdapter'],'unitID':_0x5f26d2['unitID'],'type':_0x5f26d2['type'],...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}},_0x486be9=_0x203fad===_0x3c8832?await s({..._0x2ab0f7,'expectedRevision':_0x675c1c['headRevision']}):await l({..._0x2ab0f7,'trunkHeadRevision':_0x675c1c['headRevision'],'original':A(_0x5f0057['worktree']['sid'],_0x5f26d2,_0x203fad,_0xf21762,_0x486fcc['session']),'trunkHistory':_0x7fe60c['changesets'],'session':_0x486fcc['session']});_0x1fb9c0={'status':'preview','worktreeID':_0x25fb44['worktreeID'],'unitID':_0x25fb44['unitID'],'preview':_0x486be9};}catch(_0x1502f2){if(_0x1502f2 instanceof n['CollabError']&&_0x1502f2['code']==='OT_CONFLICT'){_0x1fb9c0={'status':'conflict','worktreeID':_0x25fb44['worktreeID'],'unitID':_0x25fb44['unitID'],'error':M(_0x1502f2)};return;}throw _0x1502f2;}}),_0x1fb9c0;});}['getUnit'](_0x36177e,_0x994a3e){return this['_call']('getUnit',()=>(w(_0x36177e['worktreeID']),this['_draftService'](_0x36177e['worktreeID'])['getUnit']({'unitID':_0x36177e['unitID'],'type':_0x36177e['type'],'revision':_0x36177e['revision']},_0x994a3e)));}['getChangesets'](_0x598914,_0x48c5fa){return this['_call']('getChangesets',()=>(w(_0x598914['worktreeID']),this['_draftService'](_0x598914['worktreeID'])['getChangesets']({'unitID':_0x598914['unitID'],'type':_0x598914['type'],'from':_0x598914['from'],'to':_0x598914['to']},_0x48c5fa)));}['getSheetBlock'](_0x59e6a7,_0x5cb96d){return this['_call']('getSheetBlock',()=>(w(_0x59e6a7['worktreeID']),this['_draftService'](_0x59e6a7['worktreeID'])['getSheetBlock']({'unitID':_0x59e6a7['unitID'],'type':_0x59e6a7['type'],'blockID':_0x59e6a7['blockID']},_0x5cb96d)));}['submitChangeset'](_0x41afe2,_0x442352){return this['_call']('submitChangeset',()=>(w(_0x41afe2['worktreeID']),this['_draftService'](_0x41afe2['worktreeID'])['submitChangeset']({'changeset':_0x41afe2['changeset']},_0x442352)));}['dispose'](){return this['_lifecycle']['dispose'](async()=>{this['_middleware']['clear'](),this['_events']['clear']();let _0x4eebbc=[...this['_draftServices']['values']()];this['_draftServices']['clear'](),await Promise['all'](_0x4eebbc['map'](_0x1889b1=>_0x1889b1['dispose']()));});}['_draftService'](_0x485fca){let _0x21325b=this['_draftServices']['get'](_0x485fca);if(_0x21325b)return _0x21325b;let _0x184811=new n['UniverCollabService']({'dbAdapter':new a(_0x485fca,this['_trunkDbAdapter'],this['_dbAdapter']),'snapshotPolicy':!0x1,...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']},...this['_maxRevisionRetries']===void 0x0?{}:{'submitChangeset':{'maxRevisionRetries':this['_maxRevisionRetries']}},'logger':this['_logger'],'metrics':this['_metrics']});return _0x184811['use']('createUnit',(_0x5edc69,_0x551681)=>{let _0x3524d1=E(_0x5edc69['request'],_0x485fca);return this['_middleware']['run']('createWorktreeUnit',{'session':_0x5edc69['session'],'request':_0x3524d1},_0x551681);}),_0x184811['use']('readUnitData',(_0x4918ca,_0x5a0770)=>{let _0x3527ea=E(_0x4918ca['request'],_0x485fca);return this['_middleware']['run']('readUnitData',{'session':_0x4918ca['session'],'request':_0x3527ea},_0x5a0770);}),_0x184811['use']('submitChangeset',(_0x115dd6,_0x3b8075)=>{let _0x4e4e6d=E(_0x115dd6['request'],_0x485fca);return this['_middleware']['run']('submitChangeset',{'session':_0x115dd6['session'],'request':_0x4e4e6d},_0x3b8075);}),_0x184811['use']('applyChangeset',(_0x132d90,_0x466485)=>{let _0x35798e=E(_0x132d90['request'],_0x485fca);return this['_middleware']['run']('applyChangeset',{'session':_0x132d90['session'],'request':_0x35798e,'attempt':_0x132d90['attempt'],'currentRevision':_0x132d90['currentRevision'],'changeset':_0x132d90['changeset']},_0x466485);}),_0x184811['use']('commitChangeset',(_0x590ecc,_0x36af9c)=>{let _0x24aadc=E(_0x590ecc['request'],_0x485fca);return this['_middleware']['run']('commitChangeset',{'session':_0x590ecc['session'],'request':_0x24aadc,'attempt':_0x590ecc['attempt'],'expectedHeadRevision':_0x590ecc['expectedHeadRevision'],'changeset':_0x590ecc['changeset']},_0x36af9c);}),_0x184811['on']('changesetCommitted',_0x297a18=>{let _0x21a5b5=E(_0x297a18['request'],_0x485fca);return this['_events']['emit']('changesetCommitted',{'session':_0x297a18['session'],'request':_0x21a5b5,'changeset':_0x297a18['changeset'],'committedAt':_0x297a18['committedAt']});}),_0x184811['on']('unitCreated',async _0x2e4de8=>{let _0x148d3d=E(_0x2e4de8['request'],_0x485fca),_0x84f98f=R(await this['_requireWorktreeAggregate']({'session':_0x2e4de8['session'],'request':_0x148d3d},_0x485fca),_0x485fca);await this['_events']['emit']('worktreeUnitCreated',{'session':_0x2e4de8['session'],'request':_0x148d3d,'worktree':_0x84f98f,'unit':U(_0x84f98f,_0x2e4de8['record']['unitID']),'occurredAt':_0x2e4de8['createdAt']});}),this['_draftServices']['set'](_0x485fca,_0x184811),_0x184811;}async['_mergeUnit'](_0x4e57cd,_0x2eb213,_0x163b9b,_0x4f2a8f){try{if(_0x163b9b['source']==='worktree')return await this['_mergeCreatedUnit'](_0x4e57cd,_0x163b9b,_0x4f2a8f);let _0x175727=B(_0x163b9b),_0x45806a=O(_0x163b9b);if(_0x45806a===_0x175727)return{'status':'unchanged'};let _0x303edc=k(_0x163b9b,_0x45806a,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x4e57cd,_0x163b9b['worktreeID'],_0x163b9b['unitID'],{'from':_0x175727,'to':_0x45806a}))),_0x4c852c=await this['_trunkService']['submitChangeset']({'changeset':A(_0x2eb213,_0x163b9b,_0x45806a,_0x303edc,_0x4f2a8f['session'])},{'session':_0x4f2a8f['session'],'customData':_0x4e57cd['request']['customData']});return _0x4c852c['status']==='committed'||_0x4c852c['status']==='already-committed'?{'status':'merged','trunkRevision':_0x4c852c['changeset']['revision']}:j('error'in _0x4c852c?_0x4c852c['error']:Error('Trunk\x20merge\x20failed'));}catch(_0x21f119){return j(_0x21f119);}}async['_mergeCreatedUnit'](_0x40de7f,_0x56bba0,_0x19c023){let _0x1c7e5a=O(_0x56bba0),_0x54667f=await this['_database'](()=>this['_dbAdapter']['getUnitMergeArtifact'](_0x40de7f,_0x56bba0['worktreeID'],_0x56bba0['unitID']));if(!_0x54667f){let _0x53160b=await s({'context':_0x40de7f,'dbAdapter':new a(_0x56bba0['worktreeID'],this['_trunkDbAdapter'],this['_dbAdapter']),'unitID':_0x56bba0['unitID'],'type':_0x56bba0['type'],'expectedRevision':_0x1c7e5a,...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}});if(!await this['_database'](()=>this['_dbAdapter']['getUnitSeed'](_0x40de7f,_0x56bba0['worktreeID'],_0x56bba0['unitID'])))throw Z('Worktree-created\x20Unit\x20seed\x20is\x20missing');let _0x540085=await this['_database'](()=>this['_dbAdapter']['saveUnitMergeArtifact'](_0x40de7f,{'worktreeID':_0x56bba0['worktreeID'],'unitID':_0x56bba0['unitID'],'artifact':{'readyDraftHeadRevision':_0x1c7e5a,'unit':{'snapshot':H(_0x53160b['snapshot']),..._0x53160b['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0x53160b['sheetBlocks']}}}}));if(_0x540085['status']==='not-found')throw Y(_0x56bba0['worktreeID']);if(_0x540085['status']==='stale-merge')throw new i('WORKTREE_STALE_MERGE','Worktree\x20Unit\x20changed\x20while\x20saving\x20its\x20merge\x20artifact',{'retryable':!0x0});if(!('artifact'in _0x540085))throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20artifact\x20result');_0x54667f=_0x540085['artifact'];}if(!_0x54667f)throw Z('Worktree\x20Unit\x20merge\x20artifact\x20is\x20missing');V(_0x56bba0,_0x1c7e5a,_0x54667f);let _0xca1e09=_0x54667f['unit'];if(await this['_trunkService']['createUnit'](_0xca1e09,{'session':_0x19c023['session'],'customData':_0x40de7f['request']['customData']}),!await this['_matchesCreatedTrunkUnit'](_0x40de7f,_0x56bba0,_0xca1e09))throw new P('Trunk\x20Unit\x20'+_0x56bba0['unitID']+'\x20already\x20exists\x20with\x20different\x20content');return{'status':'merged','trunkRevision':0x1};}async['_matchesCreatedTrunkUnit'](_0x25b49b,_0x2c851e,_0x5d077c){let _0x128adf=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x25b49b,_0x2c851e['unitID']));if(!_0x128adf||_0x128adf['type']!==_0x2c851e['type']||_0x128adf['headRevision']<0x1||!F(await this['_database'](()=>this['_trunkDbAdapter']['getSnapshot'](_0x25b49b,_0x2c851e['unitID'],{'revision':0x1})),_0x5d077c['snapshot']))return!0x1;for(let _0x33584c of _0x5d077c['sheetBlocks']??[])if(!F(await this['_database'](()=>this['_trunkDbAdapter']['getSheetBlock'](_0x25b49b,_0x2c851e['unitID'],_0x33584c['id'])),_0x33584c))return!0x1;return!0x0;}async['_requireWorktreeAggregate'](_0x2e8211,_0x36f370){let _0x2bf8d6=await this['_database'](()=>this['_dbAdapter']['getWorktree'](_0x2e8211,_0x36f370));if(!_0x2bf8d6)throw Y(_0x36f370);return R(_0x2bf8d6,_0x36f370),_0x2bf8d6;}async['_transition'](_0xe7bd8d,_0x3fde43,_0x3a6f9e,_0x148311){w(_0xe7bd8d);let _0x14c2ba=await this['_database'](_0x148311);if(_0x14c2ba['status']==='not-found')throw Y(_0xe7bd8d);let _0x15b2a7=R(_0x14c2ba['aggregate'],_0xe7bd8d);if(_0x14c2ba['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0xe7bd8d+'\x20cannot\x20transition\x20from\x20'+_0x15b2a7['status'],{'details':{'status':_0x15b2a7['status']}});return _0x14c2ba['status']==='transitioned'&&await this['_events']['emit']('worktreeStatusChanged',{'session':_0x3fde43,'request':_0x3a6f9e,'worktree':_0x15b2a7,'previousStatus':_0x14c2ba['previousStatus'],'status':_0x15b2a7['status'],'occurredAt':Date['now']()}),{'worktree':_0x15b2a7};}async['_requireTrunkUnit'](_0x1bc3f4,_0x15a446){let _0x453f7f=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x1bc3f4,_0x15a446));if(!_0x453f7f)throw new n['CollabError']('UNIT_NOT_FOUND','Trunk\x20Unit\x20'+_0x15a446+'\x20does\x20not\x20exist');if(_0x453f7f['unitID']!==_0x15a446||!C['has'](_0x453f7f['type'])||!Number['isSafeInteger'](_0x453f7f['headRevision'])||_0x453f7f['headRevision']<0x1)throw Z('Trunk\x20Database\x20returned\x20invalid\x20Unit\x20metadata');return _0x453f7f;}async['_database'](_0x65497b){try{return await _0x65497b();}catch(_0x29cee2){throw _0x29cee2 instanceof n['CollabError']||_0x29cee2 instanceof i?_0x29cee2:Z('Database\x20Adapter\x20failed',_0x29cee2);}}async['_call'](_0x382b5e,_0x465f17){try{return this['_metrics']['increment']('collaboration.worktree.service.call',{'operation':_0x382b5e}),await this['_lifecycle']['run'](_0x465f17);}catch(_0x5dfeed){throw _0x5dfeed instanceof n['CollabError']||_0x5dfeed instanceof i?_0x5dfeed:(this['_logger']['error']('Worktree\x20Service\x20operation\x20failed',{'operation':_0x382b5e,'error':$(_0x5dfeed)}),new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20failed',{'retryable':!0x0,'cause':_0x5dfeed}));}}['_assertRunning'](){if(this['_lifecycle']['state']!=='running')throw new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_lifecycle']['state'],{'retryable':!0x0});}};function w(_0x2a3bf2){if(!_0x2a3bf2)throw X('worktreeID\x20is\x20required');}function T(_0x1d4933){return{..._0x1d4933,'customData':_0x1d4933['customData']??Object['create'](null)};}function E(_0x2e8ceb,_0x18a522){let _0x178b15=_0x2e8ceb;if(_0x178b15['worktreeID']!==void 0x0){if(_0x178b15['worktreeID']!==_0x18a522)throw new n['CollabError']('INTERNAL_ERROR','Draft\x20Request\x20is\x20bound\x20to\x20a\x20different\x20Worktree',{'retryable':!0x0});return _0x178b15;}return Object['defineProperty'](_0x2e8ceb,'worktreeID',{'value':_0x18a522,'enumerable':!0x0,'configurable':!0x1,'writable':!0x1}),_0x2e8ceb;}function D(_0x10ed24){if(_0x10ed24['some'](_0x59da22=>!_0x59da22))throw X('Initial\x20Unit\x20IDs\x20cannot\x20be\x20empty');if(new Set(_0x10ed24)['size']!==_0x10ed24['length'])throw X('Initial\x20Unit\x20IDs\x20must\x20be\x20unique');}function O(_0x26c108){let _0xcf5e92=_0x26c108['readyDraftHeadRevision'],_0x52abd2=_0x26c108['source']==='trunk'?B(_0x26c108):0x1;if(_0xcf5e92===void 0x0||!Number['isSafeInteger'](_0xcf5e92)||_0xcf5e92<_0x52abd2)throw Z('Merging\x20Worktree\x20Unit\x20has\x20no\x20valid\x20frozen\x20draft\x20head');return _0xcf5e92;}function k(_0x442243,_0x18d651,_0x44a22c){let _0x389919=B(_0x442243);if(_0x44a22c['latestRevision']===void 0x0||_0x44a22c['latestRevision']<_0x18d651)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20no\x20longer\x20readable');let _0x15db2e=_0x389919+0x1,_0x29d880=[];for(let _0x452b71 of _0x44a22c['changesets']){if(_0x452b71['unitID']!==_0x442243['unitID']||_0x452b71['type']!==_0x442243['type']||_0x452b71['baseRev']!==_0x15db2e-0x1||_0x452b71['revision']!==_0x15db2e)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20not\x20contiguous');_0x29d880['push'](...structuredClone(_0x452b71['mutations'])),_0x15db2e+=0x1;}if(_0x15db2e-0x1!==_0x18d651)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20incomplete');return _0x29d880;}function A(_0x8084af,_0x51d218,_0x580c11,_0x15ce53,_0xe9bfe5){let _0x4d19c8=B(_0x51d218);return{'unitID':_0x51d218['unitID'],'type':_0x51d218['type'],'baseRev':_0x4d19c8,'revision':_0x4d19c8+0x1,'userID':_0xe9bfe5['userId'],'memberID':_0xe9bfe5['memberId'],'sid':_0x8084af,'reqId':_0x580c11-_0x4d19c8,'mutations':_0x15ce53};}function j(_0x148264){let _0x4ae525=M(_0x148264);return _0x148264 instanceof N||_0x148264 instanceof P||_0x148264 instanceof n['CollabError']&&_0x148264['code']==='OT_CONFLICT'?{'status':'conflict','error':_0x4ae525}:{'status':'failed','error':_0x4ae525};}function M(_0x1092a7){return _0x1092a7 instanceof N?{'code':'WORKTREE_DRAFT_HISTORY_INVALID','message':_0x1092a7['message'],'retryable':!0x0}:_0x1092a7 instanceof P?{'code':'WORKTREE_CREATE_CONFLICT','message':_0x1092a7['message'],'retryable':!0x1}:_0x1092a7 instanceof n['CollabError']||_0x1092a7 instanceof i?{'code':_0x1092a7['code'],'message':_0x1092a7['message'],'retryable':_0x1092a7['retryable']}:{'code':'INTERNAL_ERROR','message':_0x1092a7 instanceof Error?_0x1092a7['message']:'Merge\x20failed','retryable':!0x0};}var N=class extends Error{constructor(_0xd27bb5){super(_0xd27bb5),this['name']='FrozenDraftConflict';}},P=class extends Error{constructor(_0x3c513d){super(_0x3c513d),this['name']='WorktreeCreateConflict';}};function F(_0xa0ae7d,_0x1847f3){return(0x0,t['isDeepStrictEqual'])(I(_0xa0ae7d),I(_0x1847f3));}function I(_0x5e024a){if(_0x5e024a!==void 0x0)return JSON['parse'](JSON['stringify'](_0x5e024a,(_0x3b922c,_0xe84938)=>_0xe84938 instanceof Uint8Array?{'__univerCollaborationBinary':[..._0xe84938]}:_0xe84938));}function L(_0x203df1,_0x3fac33){let _0x237854=new Set(_0x203df1['units']['map'](({unitID:_0x5d6c8d})=>_0x5d6c8d));if(_0x237854['size']!==_0x3fac33['length']||_0x3fac33['some'](_0x596730=>!_0x237854['has'](_0x596730)))throw Z('Database\x20returned\x20incomplete\x20initial\x20Worktree\x20Units');}function R(_0x52ba02,_0x170d93){let {worktree:_0x5bf7fd,units:_0x52778e}=_0x52ba02;if(_0x5bf7fd['worktreeID']!==_0x170d93||!_0x5bf7fd['sid']||!W(_0x5bf7fd['status']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20metadata');let _0x413d1e=new Set(),_0x2e25b5=_0x52778e['map'](_0x1172af=>{let _0x15bcf5=_0x1172af['source']==='trunk'&&Number['isSafeInteger'](_0x1172af['baselineTrunkRevision'])&&_0x1172af['baselineTrunkRevision']>=0x1&&_0x1172af['draftHeadRevision']>=_0x1172af['baselineTrunkRevision']||_0x1172af['source']==='worktree'&&_0x1172af['baselineTrunkRevision']===void 0x0&&_0x1172af['draftHeadRevision']>=0x1;if(_0x1172af['worktreeID']!==_0x170d93||!_0x1172af['unitID']||_0x413d1e['has'](_0x1172af['unitID'])||!C['has'](_0x1172af['type'])||!_0x15bcf5||!Number['isSafeInteger'](_0x1172af['draftHeadRevision'])||_0x1172af['readyDraftHeadRevision']!==void 0x0&&_0x1172af['readyDraftHeadRevision']!==_0x1172af['draftHeadRevision']||_0x1172af['mergeResult']!==void 0x0&&_0x1172af['readyDraftHeadRevision']===void 0x0||!G(_0x1172af['mergeResult']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20Unit\x20metadata');return _0x413d1e['add'](_0x1172af['unitID']),z(_0x1172af);});if(_0x5bf7fd['status']==='merged'&&_0x2e25b5['some'](({mergeResult:_0x4df046})=>!J(_0x4df046)))throw Z('Merged\x20Worktree\x20contains\x20an\x20incomplete\x20Unit');return{'worktreeID':_0x5bf7fd['worktreeID'],'status':_0x5bf7fd['status'],'units':_0x2e25b5};}function z(_0x45f26f){return{'unitID':_0x45f26f['unitID'],'type':_0x45f26f['type'],'source':_0x45f26f['source'],..._0x45f26f['baselineTrunkRevision']===void 0x0?{}:{'baselineTrunkRevision':_0x45f26f['baselineTrunkRevision']},'draftHeadRevision':_0x45f26f['draftHeadRevision'],..._0x45f26f['readyDraftHeadRevision']===void 0x0?{}:{'readyDraftHeadRevision':_0x45f26f['readyDraftHeadRevision']},..._0x45f26f['mergeResult']===void 0x0?{}:{'mergeResult':K(_0x45f26f['mergeResult'])}};}function B(_0x56eb93){if(_0x56eb93['source']!=='trunk'||!Number['isSafeInteger'](_0x56eb93['baselineTrunkRevision'])||_0x56eb93['baselineTrunkRevision']<0x1)throw Z('Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x56eb93['baselineTrunkRevision'];}function V(_0x2cb652,_0x15a5eb,_0x26395d){if(_0x26395d['readyDraftHeadRevision']!==_0x15a5eb||_0x26395d['unit']['snapshot']['unitID']!==_0x2cb652['unitID']||_0x26395d['unit']['snapshot']['type']!==_0x2cb652['type']||_0x26395d['unit']['snapshot']['rev']!==0x1)throw Z('Database\x20returned\x20an\x20invalid\x20Worktree\x20Unit\x20merge\x20artifact');}function H(_0x508c2a){let _0x12f63d={..._0x508c2a,'rev':0x1};return _0x508c2a['workbook']?{..._0x12f63d,'workbook':{..._0x508c2a['workbook'],'rev':0x1}}:_0x508c2a['doc']?{..._0x12f63d,'doc':{..._0x508c2a['doc'],'rev':0x1}}:_0x508c2a['slide']?{..._0x12f63d,'slide':{..._0x508c2a['slide'],'rev':0x1}}:_0x508c2a['board']?{..._0x12f63d,'board':{..._0x508c2a['board'],'rev':0x1}}:_0x12f63d;}function U(_0x588816,_0x2cae97){let _0xc2b910=_0x588816['units']['find'](_0x16c55a=>_0x16c55a['unitID']===_0x2cae97);if(!_0xc2b910)throw Z('Database\x20omitted\x20the\x20added\x20Worktree\x20Unit');return _0xc2b910;}function W(_0x34eaae){return _0x34eaae==='draft'||_0x34eaae==='ready'||_0x34eaae==='merging'||_0x34eaae==='merged'||_0x34eaae==='discarded';}function G(_0x509e3f){return _0x509e3f===void 0x0?!0x0:!_0x509e3f||typeof _0x509e3f!='object'||!('status'in _0x509e3f)?!0x1:_0x509e3f['status']==='unchanged'?!0x0:_0x509e3f['status']==='merged'&&'trunkRevision'in _0x509e3f?typeof _0x509e3f['trunkRevision']=='number'&&Number['isSafeInteger'](_0x509e3f['trunkRevision'])&&_0x509e3f['trunkRevision']>=0x1:_0x509e3f['status']!=='conflict'&&_0x509e3f['status']!=='failed'||!('error'in _0x509e3f)||!_0x509e3f['error']||typeof _0x509e3f['error']!='object'||!('code'in _0x509e3f['error'])||!('message'in _0x509e3f['error'])||!('retryable'in _0x509e3f['error'])?!0x1:typeof _0x509e3f['error']['code']=='string'&&!!_0x509e3f['error']['code']&&typeof _0x509e3f['error']['message']=='string'&&!!_0x509e3f['error']['message']&&typeof _0x509e3f['error']['retryable']=='boolean';}function K(_0x4bbf9e){return _0x4bbf9e['status']==='merged'?{'status':'merged','trunkRevision':_0x4bbf9e['trunkRevision']}:_0x4bbf9e['status']==='unchanged'?{'status':'unchanged'}:{'status':_0x4bbf9e['status'],'error':{'code':_0x4bbf9e['error']['code'],'message':_0x4bbf9e['error']['message'],'retryable':_0x4bbf9e['error']['retryable']}};}function q(_0x4218cc){if(_0x4218cc?.['status']==='merged')return{'status':'merged','trunkRevision':_0x4218cc['trunkRevision']};if(_0x4218cc?.['status']==='unchanged')return{'status':'unchanged'};throw Z('Worktree\x20Unit\x20merge\x20result\x20is\x20not\x20terminal');}function J(_0x3e1b8b){return _0x3e1b8b?.['status']==='merged'||_0x3e1b8b?.['status']==='unchanged';}function Y(_0x540b37){return new i('WORKTREE_NOT_FOUND','Worktree\x20'+_0x540b37+'\x20does\x20not\x20exist');}function X(_0x4695d4){return new n['CollabError']('INVALID_REQUEST',_0x4695d4);}function Z(_0x282dcd,_0xd3001b){return new n['CollabError']('ADAPTER_FAILURE',_0x282dcd,{'retryable':!0x0,..._0xd3001b===void 0x0?{}:{'cause':_0xd3001b}});}function te(_0x24b0f1){return _0x24b0f1?{'debug':(..._0x545d79)=>Q(()=>_0x24b0f1['debug'](..._0x545d79)),'info':(..._0x105955)=>Q(()=>_0x24b0f1['info'](..._0x105955)),'warn':(..._0x5c2893)=>Q(()=>_0x24b0f1['warn'](..._0x5c2893)),'error':(..._0xfdcce5)=>Q(()=>_0x24b0f1['error'](..._0xfdcce5))}:{'debug':()=>void 0x0,'info':()=>void 0x0,'warn':()=>void 0x0,'error':()=>void 0x0};}function ne(_0x6f561f){return _0x6f561f?{'increment':(..._0x2910be)=>Q(()=>_0x6f561f['increment'](..._0x2910be)),'observe':(..._0x121e44)=>Q(()=>_0x6f561f['observe'](..._0x121e44))}:{'increment':()=>void 0x0,'observe':()=>void 0x0};}function Q(_0x1c051c){try{_0x1c051c();}catch{}}function $(_0x5d4a0f){return _0x5d4a0f instanceof Error?_0x5d4a0f['message']:String(_0x5d4a0f);}exports['UniverCollabWorktreeService']=ee,exports['WorktreeError']=i;
|
|
1
|
+
Object['defineProperty'](exports,Symbol['toStringTag'],{'value':'Module'});let e=require('node:crypto'),t=require('node:util'),n=require('@univerjs-pro/collaboration-service'),r=require('@univerjs/protocol');var i=class extends Error{['code'];['retryable'];['details'];constructor(_0x9fd380,_0x8d3888,_0x5312ae={}){super(_0x8d3888,{'cause':_0x5312ae['cause']}),this['name']='WorktreeError',this['code']=_0x9fd380,this['retryable']=_0x5312ae['retryable']??!0x1,_0x5312ae['details']!==void 0x0&&(this['details']=_0x5312ae['details']);}},a=class{['_worktreeID'];['_trunk'];['_worktree'];constructor(_0x18050a,_0xfac114,_0x29e1e3){this['_worktreeID']=_0x18050a,this['_trunk']=_0xfac114,this['_worktree']=_0x29e1e3;}async['getUnit'](_0x2571f3,_0x388623){let _0x350c0f=await this['_worktree']['getWorktreeUnit'](_0x2571f3,this['_worktreeID'],_0x388623);return _0x350c0f?{'unitID':_0x350c0f['unitID'],'type':_0x350c0f['type'],'headRevision':_0x350c0f['draftHeadRevision'],'creatorID':_0x350c0f['creatorID'],'createdAt':_0x350c0f['createdAt']}:null;}async['getSnapshot'](_0x231c49,_0x49f2d1,_0x105993){let _0x59f116=await this['_getUnitRecord'](_0x231c49,_0x49f2d1);if(!_0x59f116)return null;let _0x48a03e=_0x105993?.['revision'],_0x1df7fb=_0x48a03e===void 0x0?_0x59f116['draftHeadRevision']:Math['min'](_0x48a03e,_0x59f116['draftHeadRevision']);if(_0x59f116['source']==='worktree')return _0x1df7fb<0x1?null:(await this['_worktree']['getUnitSeed'](_0x231c49,this['_worktreeID'],_0x49f2d1))?.['snapshot']??null;let _0xd45b9b=o(_0x59f116);return this['_trunk']['getSnapshot'](_0x231c49,_0x49f2d1,{'revision':Math['min'](_0x1df7fb,_0xd45b9b)});}async['getSnapshotInfo'](_0x566170,_0x55db66,_0x24161b){let _0x1c52ed=await this['_getUnitRecord'](_0x566170,_0x55db66);if(!_0x1c52ed)return null;let _0x372cef=_0x24161b?.['revision'],_0x2d4c16=_0x372cef===void 0x0?_0x1c52ed['draftHeadRevision']:Math['min'](_0x372cef,_0x1c52ed['draftHeadRevision']);return _0x1c52ed['source']==='worktree'?_0x2d4c16>=0x1?{'unitID':_0x1c52ed['unitID'],'type':_0x1c52ed['type'],'rev':0x1}:null:this['_trunk']['getSnapshotInfo'](_0x566170,_0x55db66,{'revision':Math['min'](_0x2d4c16,o(_0x1c52ed))});}async['getChangesets'](_0x2f4be5,_0xab8f26,_0x4abafb){let _0x1eac34=await this['_getUnitRecord'](_0x2f4be5,_0xab8f26);if(!_0x1eac34)return null;if(_0x1eac34['source']==='worktree')return this['_worktree']['getDraftChangesets'](_0x2f4be5,this['_worktreeID'],_0xab8f26,_0x4abafb);let _0xa2c4a8=o(_0x1eac34),_0x4501e3=Math['min'](_0x4abafb['to']??_0xa2c4a8,_0xa2c4a8),_0x5e34fd=_0x4abafb['from']<_0x4501e3?await this['_trunk']['getChangesets'](_0x2f4be5,_0xab8f26,{'from':_0x4abafb['from'],'to':_0x4501e3}):[];if(_0x5e34fd===null)return null;let _0x7ba6b0=Math['max'](_0x4abafb['from'],_0xa2c4a8),_0x2824d2=_0x4abafb['to']===void 0x0||_0x7ba6b0<_0x4abafb['to']?await this['_worktree']['getDraftChangesets'](_0x2f4be5,this['_worktreeID'],_0xab8f26,{..._0x4abafb,'from':_0x7ba6b0}):[];return _0x2824d2===null?null:[..._0x5e34fd,..._0x2824d2];}async['createUnit'](_0x3f7484,_0x48dc0a){let _0x148032=await this['_worktree']['createUnit'](_0x3f7484,{'unit':{'worktreeID':this['_worktreeID'],'unitID':_0x48dc0a['record']['unitID'],'type':_0x48dc0a['record']['type'],'source':'worktree','draftHeadRevision':0x1,'creatorID':_0x48dc0a['record']['creatorID'],'createdAt':_0x48dc0a['record']['createdAt']},'seed':{'snapshot':_0x48dc0a['snapshot'],..._0x48dc0a['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0x48dc0a['sheetBlocks']}}});switch(_0x148032['status']){case'created':return{'status':'created','record':_0x48dc0a['record']};case'already-created':{let _0x58918d=_0x148032['aggregate']['units']['find'](_0x174a34=>_0x174a34['unitID']===_0x48dc0a['record']['unitID']);return{'status':'already-exists','record':{'unitID':_0x58918d['unitID'],'type':_0x58918d['type'],'headRevision':_0x58918d['draftHeadRevision'],'creatorID':_0x58918d['creatorID'],'createdAt':_0x58918d['createdAt']}};}case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20'+this['_worktreeID']+'\x20does\x20not\x20exist');case'unit-exists':throw new n['CollabError']('INVALID_REQUEST','Unit\x20'+_0x48dc0a['record']['unitID']+'\x20already\x20exists\x20in\x20the\x20Worktree');case'status-mismatch':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20'+this['_worktreeID']+'\x20is\x20not\x20editable');}}['deleteUnits'](_0x25480c,_0x25b303){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20delete\x20Units\x20through\x20a\x20Worktree\x20draft'));}['recoverUnits'](_0x2c1dab,_0x2780b5){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20recover\x20Units\x20through\x20a\x20Worktree\x20draft'));}async['commitChangeset'](_0x127a6f,_0x3184f6){let _0xe36d5e=await this['_worktree']['commitDraftChangeset'](_0x127a6f,{'worktreeID':this['_worktreeID'],'changeset':_0x3184f6['changeset']});switch(_0xe36d5e['status']){case'committed':case'revision-mismatch':return _0xe36d5e;case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20or\x20Worktree\x20Unit\x20does\x20not\x20exist');case'not-editable':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20is\x20'+_0xe36d5e['worktreeStatus']);case'unit-frozen':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20Unit\x20has\x20already\x20been\x20merged');}}['saveSnapshot'](_0x40ff11,_0x13db2a){return Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20draft\x20snapshots\x20are\x20disabled'));}async['getSheetBlock'](_0x577634,_0x526e5b,_0x1da023){let _0x20662d=await this['_getUnitRecord'](_0x577634,_0x526e5b);return _0x20662d?_0x20662d['source']==='worktree'?(await this['_worktree']['getUnitSeed'](_0x577634,this['_worktreeID'],_0x526e5b))?.['sheetBlocks']?.['find'](_0x3597a9=>_0x3597a9['id']===_0x1da023)??null:this['_trunk']['getSheetBlock'](_0x577634,_0x526e5b,_0x1da023):null;}['_getUnitRecord'](_0x15558f,_0x3a7e33){return this['_worktree']['getWorktreeUnit'](_0x15558f,this['_worktreeID'],_0x3a7e33);}};function o(_0x28f63f){if(_0x28f63f['source']!=='trunk'||!Number['isSafeInteger'](_0x28f63f['baselineTrunkRevision'])||_0x28f63f['baselineTrunkRevision']<0x1)throw new n['CollabError']('ADAPTER_FAILURE','Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x28f63f['baselineTrunkRevision'];}async function s(_0x662d65){let _0x25cb14=new n['UniverUnitRuntime']({'reader':_0x662d65['dbAdapter'],..._0x662d65['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x662d65['runtime']['maxLoadedUnits']},..._0x662d65['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x662d65['runtime']['idleTimeoutMs']}});try{let _0x3fba45=await _0x25cb14['ensureUnit'](_0x662d65['context'],_0x662d65['unitID'],_0x662d65['type']);try{if(_0x3fba45['revision']!==_0x662d65['expectedRevision'])throw c('Unit\x20Runtime\x20did\x20not\x20reach\x20the\x20frozen\x20Worktree\x20revision');let _0x4b34d7=await _0x25cb14['createSnapshot'](_0x3fba45);if(_0x4b34d7['snapshot']['unitID']!==_0x662d65['unitID']||_0x4b34d7['snapshot']['type']!==_0x662d65['type']||_0x4b34d7['snapshot']['rev']!==_0x662d65['expectedRevision'])throw c('Unit\x20Runtime\x20returned\x20an\x20invalid\x20Worktree\x20snapshot');return _0x4b34d7;}finally{_0x25cb14['releaseUnit'](_0x3fba45);}}finally{await _0x25cb14['dispose']();}}function c(_0x460a7f){return new n['CollabError']('ADAPTER_FAILURE',_0x460a7f,{'retryable':!0x0});}async function l(_0x4a9f38){let _0x456a69=new n['UniverUnitRuntime']({'reader':_0x4a9f38['dbAdapter'],..._0x4a9f38['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x4a9f38['runtime']['maxLoadedUnits']},..._0x4a9f38['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x4a9f38['runtime']['idleTimeoutMs']}});try{let _0x337d50=u(_0x456a69,_0x4a9f38),_0x13e131=await _0x456a69['ensureUnit'](_0x4a9f38['context'],_0x4a9f38['unitID'],_0x4a9f38['type']);try{if(_0x13e131['revision']!==_0x4a9f38['trunkHeadRevision'])throw new n['CollabError']('REVISION_MISMATCH','Trunk\x20changed\x20while\x20materializing\x20Worktree\x20merge\x20preview',{'retryable':!0x0});if(await _0x456a69['applyChangeset'](_0x4a9f38['context'],_0x13e131,_0x337d50),_0x13e131['revision']!==_0x337d50['revision'])throw new n['CollabError']('INTERNAL_ERROR','Preview\x20Runtime\x20did\x20not\x20reach\x20the\x20merge\x20candidate\x20revision',{'retryable':!0x0});return await _0x456a69['createSnapshot'](_0x13e131);}finally{_0x456a69['releaseUnit'](_0x13e131);}}finally{await _0x456a69['dispose']();}}function u(_0x13047e,_0x579870){let _0x37233c=_0x13047e['changesetTransformer']['parseClient'](_0x579870['original']);return{..._0x13047e['changesetTransformer']['transform'](_0x37233c,_0x579870['trunkHistory']),'unitID':_0x579870['original']['unitID'],'type':_0x579870['original']['type'],'baseRev':_0x579870['trunkHeadRevision'],'revision':_0x579870['trunkHeadRevision']+0x1,'sid':_0x579870['original']['sid'],'reqId':_0x579870['original']['reqId']};}var d=class{['_middlewares']=new Map();['use'](_0x2d52e0,_0x1cebe6){let _0x5f1914=this['_middlewares']['get'](_0x2d52e0)??[],_0x3fc0ac=_0x1cebe6;_0x5f1914['push'](_0x3fc0ac),this['_middlewares']['set'](_0x2d52e0,_0x5f1914);let _0x3464ff=!0x1;return{'dispose':()=>{if(_0x3464ff)return;_0x3464ff=!0x0;let _0x21cba2=_0x5f1914['indexOf'](_0x3fc0ac);_0x21cba2>=0x0&&_0x5f1914['splice'](_0x21cba2,0x1);}};}async['run'](_0x6c83f2,_0x3a1695,_0x2bf72){let _0x155952=[...this['_middlewares']['get'](_0x6c83f2)??[]],_0x1853e3=async _0x55ed4a=>{let _0x2d9684=_0x155952[_0x55ed4a];if(!_0x2d9684){await _0x2bf72();return;}let _0x3bbe16=!0x1,_0x49d180,_0x16d194=()=>{if(_0x3bbe16)throw Error('Middleware\x20for\x20action\x20'+String(_0x6c83f2)+'\x20called\x20next()\x20more\x20than\x20once');return _0x3bbe16=!0x0,_0x49d180=_0x1853e3(_0x55ed4a+0x1),_0x49d180;};try{await _0x2d9684(_0x3a1695,_0x16d194);}catch(_0x3f69d0){if(_0x49d180)try{await _0x49d180;}catch{}throw _0x3f69d0;}if(!_0x3bbe16)throw Error('Middleware\x20for\x20action\x20'+String(_0x6c83f2)+'\x20completed\x20without\x20calling\x20next()');await _0x49d180;};await _0x1853e3(0x0);}['clear'](){this['_middlewares']['clear']();}};function f(_0x266c66){return{'worktreeID':_0x266c66['worktreeID'],'units':_0x266c66['units']??[]};}function p(_0xeca2a8){return{'worktreeID':_0xeca2a8['worktreeID']};}function m(_0x116d27){return{'worktreeID':_0x116d27['worktreeID'],'unitID':_0x116d27['unitID']};}function ee(_0x689dc0){return{'worktreeID':_0x689dc0['worktreeID']};}function te(_0x4ce618){return{'worktreeID':_0x4ce618['worktreeID']};}function h(_0x7cfb7b){return{'worktreeID':_0x7cfb7b['worktreeID']};}function g(_0xb34d16){return{'worktreeID':_0xb34d16['worktreeID']};}function _(_0x3f1765){return{'worktreeID':_0x3f1765['worktreeID'],'unitID':_0x3f1765['unitID']};}function v(_0x4d7ad7){return{'worktreeID':_0x4d7ad7['worktreeID'],'unitID':_0x4d7ad7['unitID'],'removed':_0x4d7ad7['removed']};}var y=class{['_onListenerError'];['_listeners']=new Map();constructor(_0x4773f6){this['_onListenerError']=_0x4773f6;}['on'](_0x2bcaca,_0x1c3466){let _0x33b41b=this['_listeners']['get'](_0x2bcaca)??[],_0x30f6a6=_0x1c3466;_0x33b41b['push'](_0x30f6a6),this['_listeners']['set'](_0x2bcaca,_0x33b41b);let _0x47b2f2=!0x1;return{'dispose':()=>{if(_0x47b2f2)return;_0x47b2f2=!0x0;let _0x2cfc07=_0x33b41b['indexOf'](_0x30f6a6);_0x2cfc07>=0x0&&_0x33b41b['splice'](_0x2cfc07,0x1);}};}async['emit'](_0xd19a98,_0x26ddbc){for(let _0x21ddac of[...this['_listeners']['get'](_0xd19a98)??[]])try{await _0x21ddac(_0x26ddbc);}catch(_0x59bd71){try{this['_onListenerError'](_0x59bd71);}catch{}}}['clear'](){this['_listeners']['clear']();}},b=class{['_state']='running';['_activeCalls']=0x0;['_resolveDrain'];['_disposePromise'];get['state'](){return this['_state'];}['run'](_0x2fbee5){return this['_state']==='running'?(this['_activeCalls']+=0x1,Promise['resolve']()['then'](_0x2fbee5)['finally'](()=>{--this['_activeCalls'],this['_activeCalls']===0x0&&(this['_resolveDrain']?.(),this['_resolveDrain']=void 0x0);})):Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_state'],{'retryable':!0x0}));}['dispose'](_0x56a39d){return this['_disposePromise']?this['_disposePromise']:(this['_state']='disposing',this['_disposePromise']=this['_finishDispose'](_0x56a39d),this['_disposePromise']);}async['_finishDispose'](_0x14633c){this['_activeCalls']>0x0&&await new Promise(_0x440c82=>{this['_resolveDrain']=_0x440c82;});try{await _0x14633c();}finally{this['_state']='disposed';}}},x=new Set([r['UniverType']['UNIVER_SHEET'],r['UniverType']['UNIVER_DOC'],r['UniverType']['UNIVER_SLIDE'],r['UniverType']['UNIVER_BOARD'],r['UniverType']['UNIVER_BASE']]),ne=class{['_trunkService'];['_trunkDbAdapter'];['_dbAdapter'];['_middleware']=new d();['_events'];['_lifecycle']=new b();['_logger'];['_metrics'];['_runtimeOptions'];['_enableUnitPermissionAnalysis'];['_maxRevisionRetries'];['_draftServices']=new Map();constructor(_0x46245f){if(!_0x46245f?.['trunk']?.['service']||!_0x46245f['trunk']['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20trunk\x20service\x20and\x20dbAdapter');if(!_0x46245f['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20a\x20Worktree\x20dbAdapter');if(this['_trunkService']=_0x46245f['trunk']['service'],this['_trunkDbAdapter']=_0x46245f['trunk']['dbAdapter'],this['_dbAdapter']=_0x46245f['dbAdapter'],this['_runtimeOptions']=_0x46245f['runtime'],this['_enableUnitPermissionAnalysis']=_0x46245f['enableUnitPermissionAnalysis']??!0x1,this['_maxRevisionRetries']=_0x46245f['submitChangeset']?.['maxRevisionRetries'],this['_maxRevisionRetries']!==void 0x0&&(!Number['isSafeInteger'](this['_maxRevisionRetries'])||this['_maxRevisionRetries']<0x0))throw TypeError('submitChangeset.maxRevisionRetries\x20must\x20be\x20a\x20non-negative\x20safe\x20integer');this['_logger']=re(_0x46245f['logger']),this['_metrics']=ie(_0x46245f['metrics']),this['_events']=new y(_0x16e5ac=>{this['_logger']['error']('Worktree\x20Service\x20event\x20listener\x20failed',{'error':$(_0x16e5ac)});});}['use'](_0x3a62c9,_0x3ddd34){return this['_assertRunning'](),this['_middleware']['use'](_0x3a62c9,_0x3ddd34);}['on'](_0x281a43,_0x975667){return this['_assertRunning'](),this['_events']['on'](_0x281a43,_0x975667);}['createWorktree'](_0x12b8f1,_0x401102){return this['_call']('createWorktree',async()=>{let _0x566bb9=C(_0x401102),_0x302cf1=f(_0x12b8f1),_0xbf68b2={..._0x566bb9,'request':_0x302cf1},_0x4bb199;return await this['_middleware']['run']('createWorktree',_0xbf68b2,async()=>{S(_0x12b8f1['worktreeID']),D(_0x302cf1['units']);let _0x52039f=await Promise['all'](_0x302cf1['units']['map'](_0x180f98=>this['_requireTrunkUnit'](_0xbf68b2,_0x180f98))),_0x4e4f5f=await this['_database'](()=>this['_dbAdapter']['createWorktree'](_0xbf68b2,{'record':{'worktreeID':_0x12b8f1['worktreeID'],'sid':(0x0,e['randomUUID'])(),'status':'draft'},'units':_0x52039f['map'](_0x6d03c7=>({'worktreeID':_0x12b8f1['worktreeID'],'unitID':_0x6d03c7['unitID'],'type':_0x6d03c7['type'],'source':'trunk','baselineTrunkRevision':_0x6d03c7['headRevision'],'draftHeadRevision':_0x6d03c7['headRevision'],'creatorID':_0x6d03c7['creatorID'],'createdAt':_0x6d03c7['createdAt']}))})),_0x4de569=R(_0x4e4f5f['aggregate'],_0x12b8f1['worktreeID']);if(_0x4e4f5f['status']==='already-exists')throw new i('WORKTREE_ALREADY_EXISTS','Worktree\x20'+_0x12b8f1['worktreeID']+'\x20already\x20exists');L(_0x4de569,_0x302cf1['units']),_0x4bb199={'worktree':_0x4de569},await this['_events']['emit']('worktreeCreated',{'userID':_0x566bb9['userID'],'customData':_0x566bb9['customData'],'request':_0x302cf1,'worktree':_0x4de569,'occurredAt':Date['now']()});}),_0x4bb199;});}['getWorktree'](_0xd0ed27,_0xfde207){return this['_call']('getWorktree',async()=>{let _0x4e26b3=C(_0xfde207),_0x24cc13=p(_0xd0ed27),_0x20ca5f={..._0x4e26b3,'request':_0x24cc13},_0x235e81;return await this['_middleware']['run']('readWorktreeData',_0x20ca5f,async()=>{S(_0xd0ed27['worktreeID']);let _0x27787a=await this['_database'](()=>this['_dbAdapter']['getWorktree'](_0x20ca5f,_0xd0ed27['worktreeID']));if(!_0x27787a)throw Y(_0xd0ed27['worktreeID']);_0x235e81={'worktree':R(_0x27787a,_0xd0ed27['worktreeID'])};}),_0x235e81;});}['addUnit'](_0x22d4fa,_0x2e5593){return this['_call']('addUnit',async()=>{let _0x3f01c9=C(_0x2e5593),_0xb2133c=m(_0x22d4fa),_0x5e21f6={..._0x3f01c9,'request':_0xb2133c},_0x518da0;return await this['_middleware']['run']('addWorktreeUnit',_0x5e21f6,async()=>{if(S(_0x22d4fa['worktreeID']),!_0x22d4fa['unitID'])throw X('unitID\x20is\x20required');let _0x369421=await this['_requireTrunkUnit'](_0x5e21f6,_0x22d4fa['unitID']),_0x38f97f=await this['_database'](()=>this['_dbAdapter']['addUnit'](_0x5e21f6,{'unit':{'worktreeID':_0x22d4fa['worktreeID'],'unitID':_0x369421['unitID'],'type':_0x369421['type'],'source':'trunk','baselineTrunkRevision':_0x369421['headRevision'],'draftHeadRevision':_0x369421['headRevision'],'creatorID':_0x369421['creatorID'],'createdAt':_0x369421['createdAt']}}));if(_0x38f97f['status']==='not-found')throw Y(_0x22d4fa['worktreeID']);let _0x1affca=R(_0x38f97f['aggregate'],_0x22d4fa['worktreeID']);if(_0x38f97f['status']==='status-mismatch')throw new i('WORKTREE_NOT_EDITABLE','Worktree\x20'+_0x22d4fa['worktreeID']+'\x20is\x20'+_0x1affca['status'],{'details':{'status':_0x1affca['status']}});if(_0x518da0={'worktree':_0x1affca},_0x38f97f['status']==='added'){let _0x3f9e26=U(_0x1affca,_0x22d4fa['unitID']);await this['_events']['emit']('worktreeUnitAdded',{'userID':_0x3f01c9['userID'],'customData':_0x3f01c9['customData'],'request':_0xb2133c,'worktree':_0x1affca,'unit':_0x3f9e26,'occurredAt':Date['now']()});}}),_0x518da0;});}['setUnitRemoved'](_0x3ce2ed,_0xef44c8){return this['_call']('setUnitRemoved',async()=>{let _0x4389fc=C(_0xef44c8),_0x57c9bf=v(_0x3ce2ed),_0x3eaf88={..._0x4389fc,'request':_0x57c9bf},_0x190334;return await this['_middleware']['run']('setWorktreeUnitRemoved',_0x3eaf88,async()=>{if(S(_0x57c9bf['worktreeID']),!_0x57c9bf['unitID']||typeof _0x57c9bf['removed']!='boolean')throw X('unitID\x20and\x20a\x20boolean\x20removed\x20flag\x20are\x20required');let _0x32a354=await this['_database'](()=>this['_dbAdapter']['setUnitRemoved'](_0x3eaf88,_0x57c9bf));if(_0x32a354['status']==='not-found')throw new i('WORKTREE_UNIT_NOT_FOUND','Unit\x20'+_0x57c9bf['unitID']+'\x20does\x20not\x20exist\x20in\x20Worktree\x20'+_0x57c9bf['worktreeID']);if(_0x32a354['status']==='not-editable')throw new i('WORKTREE_NOT_EDITABLE','Unit\x20removal\x20can\x20only\x20change\x20in\x20an\x20editable\x20draft');let _0x36f1ab=R(_0x32a354['aggregate'],_0x57c9bf['worktreeID']);_0x190334={'worktree':_0x36f1ab},_0x32a354['status']==='updated'&&await this['_events']['emit']('worktreeUnitRemovalChanged',{'userID':_0x4389fc['userID'],'customData':_0x4389fc['customData'],'request':_0x57c9bf,'worktree':_0x36f1ab,'unit':U(_0x36f1ab,_0x57c9bf['unitID']),'occurredAt':Date['now']()});}),_0x190334;});}['createUnitFromSnapshot'](_0x3934ad,_0x2a1d74){return this['_call']('createUnitFromSnapshot',async()=>{S(_0x3934ad['worktreeID']);let _0x2d233d=C(_0x2a1d74),{worktreeID:_0x59b8b8,..._0x1fa471}=_0x3934ad;await this['_draftService'](_0x59b8b8)['createUnitFromSnapshot'](_0x1fa471,_0x2d233d);let _0x534b53=p({'worktreeID':_0x59b8b8});return{'worktree':R(await this['_requireWorktreeAggregate']({..._0x2d233d,'request':_0x534b53},_0x59b8b8),_0x59b8b8)};});}['createUnitFromData'](_0x46f26f,_0x1ced37){return this['_call']('createUnitFromData',async()=>{S(_0x46f26f['worktreeID']);let _0x3aba43=C(_0x1ced37),{worktreeID:_0x165e17,..._0x4911a2}=_0x46f26f;await this['_draftService'](_0x165e17)['createUnitFromData'](_0x4911a2,_0x3aba43);let _0x21df38=p({'worktreeID':_0x165e17});return{'worktree':R(await this['_requireWorktreeAggregate']({..._0x3aba43,'request':_0x21df38},_0x165e17),_0x165e17)};});}['markReady'](_0x941d56,_0x340963){return this['_call']('markReady',async()=>{let _0x2fc9f7=C(_0x340963),_0x426fd8=ee(_0x941d56),_0x290728={..._0x2fc9f7,'request':_0x426fd8},_0x83df20;return await this['_middleware']['run']('markWorktreeReady',_0x290728,async()=>{_0x83df20=await this['_transition'](_0x941d56['worktreeID'],_0x2fc9f7,_0x426fd8,()=>this['_dbAdapter']['markReady'](_0x290728,_0x941d56['worktreeID']));}),_0x83df20;});}['reopenWorktree'](_0x47d224,_0x320594){return this['_call']('reopenWorktree',async()=>{let _0x537887=C(_0x320594),_0x1b9356=te(_0x47d224),_0x210930={..._0x537887,'request':_0x1b9356},_0x5d9d0e;return await this['_middleware']['run']('reopenWorktree',_0x210930,async()=>{_0x5d9d0e=await this['_transition'](_0x47d224['worktreeID'],_0x537887,_0x1b9356,()=>this['_dbAdapter']['reopenWorktree'](_0x210930,_0x47d224['worktreeID']));}),_0x5d9d0e;});}['discardWorktree'](_0x4bb0dc,_0x2b7bdf){return this['_call']('discardWorktree',async()=>{let _0x45d5ea=C(_0x2b7bdf),_0x15206f=h(_0x4bb0dc),_0x22ba92={..._0x45d5ea,'request':_0x15206f},_0x5512b9;return await this['_middleware']['run']('discardWorktree',_0x22ba92,async()=>{_0x5512b9=await this['_transition'](_0x4bb0dc['worktreeID'],_0x45d5ea,_0x15206f,()=>this['_dbAdapter']['discardWorktree'](_0x22ba92,_0x4bb0dc['worktreeID']));}),_0x5512b9;});}['mergeWorktree'](_0x3f8a4e,_0x5d5f73){return this['_call']('mergeWorktree',async()=>{let _0x25a837=w(_0x5d5f73),_0x210c2c=g(_0x3f8a4e),_0x5c8e95={..._0x25a837,'request':_0x210c2c},_0x5b57fb;return await this['_middleware']['run']('mergeWorktree',_0x5c8e95,async()=>{S(_0x3f8a4e['worktreeID']);let _0x5e94fb=await this['_database'](()=>this['_dbAdapter']['startOrResumeMerge'](_0x5c8e95,_0x3f8a4e['worktreeID']));if(_0x5e94fb['status']==='not-found')throw Y(_0x3f8a4e['worktreeID']);let _0x57019f=_0x5e94fb['aggregate'],_0x5c6557=R(_0x57019f,_0x3f8a4e['worktreeID']);if(_0x5e94fb['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x3f8a4e['worktreeID']+'\x20cannot\x20merge\x20from\x20'+_0x5c6557['status'],{'details':{'status':_0x5c6557['status']}});if(_0x5e94fb['status']==='already-merged'){_0x5b57fb={'worktree':_0x5c6557};return;}_0x5e94fb['status']==='started'&&await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x25a837['userID'],'customData':_0x25a837['customData'],'request':_0x210c2c,'worktree':_0x5c6557,'previousStatus':'ready','status':'merging','occurredAt':Date['now']()});for(let _0x559d9e of _0x57019f['units']){if(J(_0x559d9e['mergeResult']))continue;let _0x2610ed=await this['_mergeUnit'](_0x5c8e95,_0x57019f['worktree']['sid'],_0x559d9e,_0x25a837),_0x3863c4=await this['_database'](()=>this['_dbAdapter']['recordUnitMergeResult'](_0x5c8e95,{'worktreeID':_0x3f8a4e['worktreeID'],'unitID':_0x559d9e['unitID'],'readyDraftHeadRevision':O(_0x559d9e),'mergeResult':_0x2610ed}));if(_0x3863c4['status']==='not-found')throw Y(_0x3f8a4e['worktreeID']);if(_0x3863c4['status']==='stale-merge'){if(_0x57019f=await this['_requireWorktreeAggregate'](_0x5c8e95,_0x3f8a4e['worktreeID']),_0x5c6557=R(_0x57019f,_0x3f8a4e['worktreeID']),_0x57019f['worktree']['status']!=='merging')break;continue;}if(_0x3863c4['status']!=='recorded'&&_0x3863c4['status']!=='already-recorded')throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20result\x20status');_0x57019f=_0x3863c4['aggregate'],_0x5c6557=R(_0x57019f,_0x3f8a4e['worktreeID']),_0x3863c4['status']==='recorded'&&await this['_events']['emit']('worktreeUnitMergeResultRecorded',{'userID':_0x25a837['userID'],'customData':_0x25a837['customData'],'request':_0x210c2c,'worktree':_0x5c6557,'unit':U(_0x5c6557,_0x559d9e['unitID']),'occurredAt':Date['now']()});}if(_0x57019f['worktree']['status']==='merging'){let _0x279eef=await this['_database'](()=>this['_dbAdapter']['finishMerge'](_0x5c8e95,_0x3f8a4e['worktreeID']));if(_0x279eef['status']==='not-found')throw Y(_0x3f8a4e['worktreeID']);if(_0x57019f=_0x279eef['aggregate'],_0x5c6557=R(_0x57019f,_0x3f8a4e['worktreeID']),_0x279eef['status']==='transitioned')await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x25a837['userID'],'customData':_0x25a837['customData'],'request':_0x210c2c,'worktree':_0x5c6557,'previousStatus':_0x279eef['previousStatus'],'status':_0x5c6557['status'],'occurredAt':Date['now']()});else{if(_0x279eef['status']==='status-mismatch'&&_0x5c6557['status']!=='ready'&&_0x5c6557['status']!=='merged')throw new i('WORKTREE_STALE_MERGE','Worktree\x20'+_0x3f8a4e['worktreeID']+'\x20merge\x20was\x20superseded',{'retryable':!0x0,'details':{'status':_0x5c6557['status']}});}}_0x5b57fb={'worktree':_0x5c6557};}),_0x5b57fb;});}['evaluateWorktreeUnitMerge'](_0x480189,_0x1e77f8){return this['_call']('evaluateWorktreeUnitMerge',async()=>{let _0x5b89d9=C(_0x1e77f8),_0x62e99e=_(_0x480189),_0x86d7c3={..._0x5b89d9,'request':_0x62e99e},_0x3f3632;return await this['_middleware']['run']('readUnitData',_0x86d7c3,async()=>{if(S(_0x480189['worktreeID']),!_0x480189['unitID'])throw X('unitID\x20is\x20required');let _0x558850=await this['_requireWorktreeAggregate'](_0x86d7c3,_0x480189['worktreeID']);if(_0x558850['worktree']['status']!=='ready')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x480189['worktreeID']+'\x20cannot\x20preview\x20from\x20'+_0x558850['worktree']['status'],{'details':{'status':_0x558850['worktree']['status']}});let _0xa242af=_0x558850['units']['find'](_0x3cad4b=>_0x3cad4b['unitID']===_0x480189['unitID']);if(!_0xa242af)throw new i('WORKTREE_UNIT_NOT_FOUND','Unit\x20'+_0x480189['unitID']+'\x20does\x20not\x20exist\x20in\x20Worktree\x20'+_0x480189['worktreeID']);if(_0xa242af['removed']){_0x3f3632={'status':'not-applicable','reason':'removed-unit','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID']};return;}if(_0xa242af['source']==='worktree'){_0x3f3632={'status':'not-applicable','reason':'worktree-created-unit','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID']};return;}if(J(_0xa242af['mergeResult'])){_0x3f3632={'status':'already-merged','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID'],'mergeResult':q(_0xa242af['mergeResult'])};return;}let _0x1c0a3b=B(_0xa242af),_0x1bdc04=O(_0xa242af),_0x3c6943=await this['_trunkService']['getUnitLoadData']({'unitID':_0xa242af['unitID'],'type':_0xa242af['type'],'revision':0x0},_0x5b89d9);if(_0x3c6943['targetRevision']===_0x1c0a3b){_0x3f3632={'status':'not-behind','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID']};return;}if(_0x3c6943['targetRevision']<_0x1c0a3b)throw Z('Trunk\x20head\x20is\x20behind\x20the\x20Worktree\x20baseline');let _0x2bc393=k(_0xa242af,_0x1bdc04,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x86d7c3,_0xa242af['worktreeID'],_0xa242af['unitID'],{'from':_0x1c0a3b,'to':_0x1bdc04}))),_0x4f7439=await this['_trunkService']['getChangesets']({'unitID':_0xa242af['unitID'],'type':_0xa242af['type'],'from':_0x1c0a3b,'to':_0x3c6943['targetRevision']},_0x5b89d9);try{let _0x1c2cb4={'context':_0x86d7c3,'dbAdapter':this['_trunkDbAdapter'],'unitID':_0xa242af['unitID'],'type':_0xa242af['type'],...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}},_0x41312b=_0x1bdc04===_0x1c0a3b?await s({..._0x1c2cb4,'expectedRevision':_0x3c6943['targetRevision']}):await l({..._0x1c2cb4,'trunkHeadRevision':_0x3c6943['targetRevision'],'original':A(_0x558850['worktree']['sid'],_0xa242af,_0x1bdc04,_0x2bc393,{'userID':_0x5b89d9['userID'],'memberID':'worktree-merge-preview'}),'trunkHistory':_0x4f7439['changesets']});_0x3f3632={'status':'preview','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID'],'preview':_0x41312b};}catch(_0x301cee){if(_0x301cee instanceof n['CollabError']&&_0x301cee['code']==='OT_CONFLICT'){_0x3f3632={'status':'conflict','worktreeID':_0x480189['worktreeID'],'unitID':_0x480189['unitID'],'error':M(_0x301cee)};return;}throw _0x301cee;}}),_0x3f3632;});}['getUnitLoadData'](_0x3e5529,_0x2ff82f){return this['_call']('getUnitLoadData',()=>(S(_0x3e5529['worktreeID']),this['_draftService'](_0x3e5529['worktreeID'])['getUnitLoadData']({'unitID':_0x3e5529['unitID'],'type':_0x3e5529['type'],'revision':_0x3e5529['revision']},C(_0x2ff82f))));}['getChangesets'](_0x249711,_0x15772e){return this['_call']('getChangesets',()=>(S(_0x249711['worktreeID']),this['_draftService'](_0x249711['worktreeID'])['getChangesets']({'unitID':_0x249711['unitID'],'type':_0x249711['type'],'from':_0x249711['from'],'to':_0x249711['to']},C(_0x15772e))));}['getSheetBlock'](_0x1795d1,_0x555cef){return this['_call']('getSheetBlock',()=>(S(_0x1795d1['worktreeID']),this['_draftService'](_0x1795d1['worktreeID'])['getSheetBlock']({'unitID':_0x1795d1['unitID'],'type':_0x1795d1['type'],'blockID':_0x1795d1['blockID']},C(_0x555cef))));}['submitChangeset'](_0x1eeb65,_0x1c8274){return this['_call']('submitChangeset',()=>(S(_0x1eeb65['worktreeID']),this['_draftService'](_0x1eeb65['worktreeID'])['submitChangeset']({'changeset':_0x1eeb65['changeset']},w(_0x1c8274))));}['dispose'](){return this['_lifecycle']['dispose'](async()=>{this['_middleware']['clear'](),this['_events']['clear']();let _0x11725a=[...this['_draftServices']['values']()];this['_draftServices']['clear'](),await Promise['all'](_0x11725a['map'](_0x245b8c=>_0x245b8c['dispose']()));});}['_draftService'](_0x1c7c11){let _0x3f4bfa=this['_draftServices']['get'](_0x1c7c11);if(_0x3f4bfa)return _0x3f4bfa;let _0x4e37d5=new n['UniverCollabService']({'dbAdapter':new a(_0x1c7c11,this['_trunkDbAdapter'],this['_dbAdapter']),'snapshotPolicy':!0x1,'enableUnitPermissionAnalysis':this['_enableUnitPermissionAnalysis'],...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']},...this['_maxRevisionRetries']===void 0x0?{}:{'submitChangeset':{'maxRevisionRetries':this['_maxRevisionRetries']}},'logger':this['_logger'],'metrics':this['_metrics']});return _0x4e37d5['use']('createUnit',(_0x286ca9,_0x3d71a0)=>{let _0x62efaf=E(_0x286ca9['request'],_0x1c7c11);return this['_middleware']['run']('createWorktreeUnit',{'userID':_0x286ca9['userID'],'customData':_0x286ca9['customData'],'request':_0x62efaf},_0x3d71a0);}),_0x4e37d5['use']('readUnitData',(_0x46d75d,_0x2d83be)=>{let _0x13e3aa=E(_0x46d75d['request'],_0x1c7c11);return this['_middleware']['run']('readUnitData',{'userID':_0x46d75d['userID'],'customData':_0x46d75d['customData'],'request':_0x13e3aa},_0x2d83be);}),_0x4e37d5['use']('submitChangeset',(_0x50e66c,_0x3ed7a3)=>{let _0x7dca44=E(_0x50e66c['request'],_0x1c7c11);return this['_middleware']['run']('submitChangeset',{'userID':_0x50e66c['userID'],'memberID':_0x50e66c['memberID'],'customData':_0x50e66c['customData'],'request':_0x7dca44},_0x3ed7a3);}),_0x4e37d5['use']('applyChangeset',(_0x24f1ba,_0x186818)=>{let _0x3d0b70=E(_0x24f1ba['request'],_0x1c7c11);return this['_middleware']['run']('applyChangeset',{'userID':_0x24f1ba['userID'],'memberID':_0x24f1ba['memberID'],'customData':_0x24f1ba['customData'],'request':_0x3d0b70,'attempt':_0x24f1ba['attempt'],'currentRevision':_0x24f1ba['currentRevision'],'changeset':_0x24f1ba['changeset']},_0x186818);}),_0x4e37d5['use']('commitChangeset',(_0x498f5b,_0x1f1d26)=>{let _0x6aed05=E(_0x498f5b['request'],_0x1c7c11);return this['_middleware']['run']('commitChangeset',{'userID':_0x498f5b['userID'],'memberID':_0x498f5b['memberID'],'customData':_0x498f5b['customData'],'request':_0x6aed05,'attempt':_0x498f5b['attempt'],'expectedHeadRevision':_0x498f5b['expectedHeadRevision'],'requiredUnitPermissions':_0x498f5b['requiredUnitPermissions'],'changeset':_0x498f5b['changeset']},_0x1f1d26);}),_0x4e37d5['on']('changesetCommitted',_0x4ca888=>{let _0x3703cb=E(_0x4ca888['request'],_0x1c7c11);return this['_events']['emit']('changesetCommitted',{'userID':_0x4ca888['userID'],'memberID':_0x4ca888['memberID'],'customData':_0x4ca888['customData'],'request':_0x3703cb,'changeset':_0x4ca888['changeset'],'requiredUnitPermissions':_0x4ca888['requiredUnitPermissions'],'committedAt':_0x4ca888['committedAt']});}),_0x4e37d5['on']('unitCreated',async _0x4efb7d=>{let _0x554d6e=E(_0x4efb7d['request'],_0x1c7c11),_0x1adfb8=R(await this['_requireWorktreeAggregate']({'userID':_0x4efb7d['userID'],'customData':_0x4efb7d['customData'],'request':_0x554d6e},_0x1c7c11),_0x1c7c11);await this['_events']['emit']('worktreeUnitCreated',{'userID':_0x4efb7d['userID'],'customData':_0x4efb7d['customData'],'request':_0x554d6e,'worktree':_0x1adfb8,'unit':U(_0x1adfb8,_0x4efb7d['record']['unitID']),'occurredAt':_0x4efb7d['createdAt']});}),this['_draftServices']['set'](_0x1c7c11,_0x4e37d5),_0x4e37d5;}async['_mergeUnit'](_0x37df53,_0x24ba9f,_0x4b3d78,_0x376ab7){try{if(_0x4b3d78['removed'])return{'status':'removed'};if(_0x4b3d78['source']==='worktree')return await this['_mergeCreatedUnit'](_0x37df53,_0x4b3d78,_0x376ab7);let _0x8763f4=B(_0x4b3d78),_0xd48c9c=O(_0x4b3d78);if(_0xd48c9c===_0x8763f4)return{'status':'unchanged'};let _0x12ed79=k(_0x4b3d78,_0xd48c9c,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x37df53,_0x4b3d78['worktreeID'],_0x4b3d78['unitID'],{'from':_0x8763f4,'to':_0xd48c9c}))),_0xdc1566=await this['_trunkService']['submitChangeset']({'changeset':A(_0x24ba9f,_0x4b3d78,_0xd48c9c,_0x12ed79,_0x376ab7)},_0x376ab7);return _0xdc1566['status']==='committed'||_0xdc1566['status']==='already-committed'?{'status':'merged','trunkRevision':_0xdc1566['changeset']['revision']}:j('error'in _0xdc1566?_0xdc1566['error']:Error('Trunk\x20merge\x20failed'));}catch(_0x260f70){return j(_0x260f70);}}async['_mergeCreatedUnit'](_0x21e63f,_0x3c494c,_0x114d2f){let _0x45eb35=O(_0x3c494c),_0x243474=await this['_database'](()=>this['_dbAdapter']['getUnitMergeArtifact'](_0x21e63f,_0x3c494c['worktreeID'],_0x3c494c['unitID']));if(!_0x243474){let _0x435eef=await s({'context':_0x21e63f,'dbAdapter':new a(_0x3c494c['worktreeID'],this['_trunkDbAdapter'],this['_dbAdapter']),'unitID':_0x3c494c['unitID'],'type':_0x3c494c['type'],'expectedRevision':_0x45eb35,...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}});if(!await this['_database'](()=>this['_dbAdapter']['getUnitSeed'](_0x21e63f,_0x3c494c['worktreeID'],_0x3c494c['unitID'])))throw Z('Worktree-created\x20Unit\x20seed\x20is\x20missing');let _0x5a9950=await this['_database'](()=>this['_dbAdapter']['saveUnitMergeArtifact'](_0x21e63f,{'worktreeID':_0x3c494c['worktreeID'],'unitID':_0x3c494c['unitID'],'artifact':{'readyDraftHeadRevision':_0x45eb35,'unit':{'snapshot':H(_0x435eef['snapshot']),..._0x435eef['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0x435eef['sheetBlocks']}}}}));if(_0x5a9950['status']==='not-found')throw Y(_0x3c494c['worktreeID']);if(_0x5a9950['status']==='stale-merge')throw new i('WORKTREE_STALE_MERGE','Worktree\x20Unit\x20changed\x20while\x20saving\x20its\x20merge\x20artifact',{'retryable':!0x0});if(!('artifact'in _0x5a9950))throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20artifact\x20result');_0x243474=_0x5a9950['artifact'];}if(!_0x243474)throw Z('Worktree\x20Unit\x20merge\x20artifact\x20is\x20missing');V(_0x3c494c,_0x45eb35,_0x243474);let _0x5e98f5=_0x243474['unit'];if(await this['_trunkService']['createUnitFromSnapshot']({'snapshot':_0x5e98f5['snapshot'],'sheetBlocks':[..._0x5e98f5['sheetBlocks']??[]]},_0x114d2f),!await this['_matchesCreatedTrunkUnit'](_0x21e63f,_0x3c494c,_0x5e98f5))throw new P('Trunk\x20Unit\x20'+_0x3c494c['unitID']+'\x20already\x20exists\x20with\x20different\x20content');return{'status':'merged','trunkRevision':0x1};}async['_matchesCreatedTrunkUnit'](_0x4d2f13,_0x1f9e08,_0x428f5e){let _0x597be9=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x4d2f13,_0x1f9e08['unitID']));if(!_0x597be9||_0x597be9['type']!==_0x1f9e08['type']||_0x597be9['headRevision']<0x1||!F(await this['_database'](()=>this['_trunkDbAdapter']['getSnapshot'](_0x4d2f13,_0x1f9e08['unitID'],{'revision':0x1})),_0x428f5e['snapshot']))return!0x1;for(let _0x4462c5 of _0x428f5e['sheetBlocks']??[])if(!F(await this['_database'](()=>this['_trunkDbAdapter']['getSheetBlock'](_0x4d2f13,_0x1f9e08['unitID'],_0x4462c5['id'])),_0x4462c5))return!0x1;return!0x0;}async['_requireWorktreeAggregate'](_0x5eddc7,_0x16b473){let _0x44cf6f=await this['_database'](()=>this['_dbAdapter']['getWorktree'](_0x5eddc7,_0x16b473));if(!_0x44cf6f)throw Y(_0x16b473);return R(_0x44cf6f,_0x16b473),_0x44cf6f;}async['_transition'](_0x2c1b03,_0x5300dc,_0x2b269a,_0x9e1447){S(_0x2c1b03);let _0x40f981=await this['_database'](_0x9e1447);if(_0x40f981['status']==='not-found')throw Y(_0x2c1b03);let _0x51374e=R(_0x40f981['aggregate'],_0x2c1b03);if(_0x40f981['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x2c1b03+'\x20cannot\x20transition\x20from\x20'+_0x51374e['status'],{'details':{'status':_0x51374e['status']}});return _0x40f981['status']==='transitioned'&&await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x5300dc['userID'],'customData':_0x5300dc['customData'],'request':_0x2b269a,'worktree':_0x51374e,'previousStatus':_0x40f981['previousStatus'],'status':_0x51374e['status'],'occurredAt':Date['now']()}),{'worktree':_0x51374e};}async['_requireTrunkUnit'](_0x2b9fef,_0x3a72f4){let _0xcf4f4d=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x2b9fef,_0x3a72f4));if(!_0xcf4f4d)throw new n['CollabError']('UNIT_NOT_FOUND','Trunk\x20Unit\x20'+_0x3a72f4+'\x20does\x20not\x20exist');if(_0xcf4f4d['unitID']!==_0x3a72f4||!x['has'](_0xcf4f4d['type'])||!Number['isSafeInteger'](_0xcf4f4d['headRevision'])||_0xcf4f4d['headRevision']<0x1)throw Z('Trunk\x20Database\x20returned\x20invalid\x20Unit\x20metadata');return _0xcf4f4d;}async['_database'](_0x12eda9){try{return await _0x12eda9();}catch(_0x5701b8){throw _0x5701b8 instanceof n['CollabError']||_0x5701b8 instanceof i?_0x5701b8:Z('Database\x20Adapter\x20failed',_0x5701b8);}}async['_call'](_0x2f0743,_0xd27f6a){try{return this['_metrics']['increment']('collaboration.worktree.service.call',{'operation':_0x2f0743}),await this['_lifecycle']['run'](_0xd27f6a);}catch(_0x2be1f8){throw _0x2be1f8 instanceof n['CollabError']||_0x2be1f8 instanceof i?_0x2be1f8:(this['_logger']['error']('Worktree\x20Service\x20operation\x20failed',{'operation':_0x2f0743,'error':$(_0x2be1f8)}),new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20failed',{'retryable':!0x0,'cause':_0x2be1f8}));}}['_assertRunning'](){if(this['_lifecycle']['state']!=='running')throw new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_lifecycle']['state'],{'retryable':!0x0});}};function S(_0x1bea6b){if(!_0x1bea6b)throw X('worktreeID\x20is\x20required');}function C(_0x123e2f){return T(_0x123e2f),{'userID':_0x123e2f['userID'],'customData':_0x123e2f['customData']??Object['create'](null)};}function w(_0x5b9cfb){if(T(_0x5b9cfb),typeof _0x5b9cfb['memberID']!='string'||_0x5b9cfb['memberID']['length']===0x0)throw X('memberID\x20must\x20be\x20a\x20non-empty\x20string');return{'userID':_0x5b9cfb['userID'],'memberID':_0x5b9cfb['memberID'],'customData':_0x5b9cfb['customData']??Object['create'](null)};}function T(_0x59e0bc){if(!_0x59e0bc||typeof _0x59e0bc!='object')throw X('context\x20must\x20be\x20an\x20object');if(typeof _0x59e0bc['userID']!='string'||_0x59e0bc['userID']['length']===0x0)throw X('userID\x20must\x20be\x20a\x20non-empty\x20string');if(_0x59e0bc['customData']!==void 0x0&&(_0x59e0bc['customData']===null||typeof _0x59e0bc['customData']!='object'||Array['isArray'](_0x59e0bc['customData'])))throw X('customData\x20must\x20be\x20an\x20object');}function E(_0x4d7d0a,_0x2a186b){let _0x3d5d50=_0x4d7d0a;if(_0x3d5d50['worktreeID']!==void 0x0){if(_0x3d5d50['worktreeID']!==_0x2a186b)throw new n['CollabError']('INTERNAL_ERROR','Draft\x20Request\x20is\x20bound\x20to\x20a\x20different\x20Worktree',{'retryable':!0x0});return _0x3d5d50;}return Object['defineProperty'](_0x4d7d0a,'worktreeID',{'value':_0x2a186b,'enumerable':!0x0,'configurable':!0x1,'writable':!0x1}),_0x4d7d0a;}function D(_0x42d9e5){if(_0x42d9e5['some'](_0x2860d2=>!_0x2860d2))throw X('Initial\x20Unit\x20IDs\x20cannot\x20be\x20empty');if(new Set(_0x42d9e5)['size']!==_0x42d9e5['length'])throw X('Initial\x20Unit\x20IDs\x20must\x20be\x20unique');}function O(_0x41ad2c){let _0x3ae430=_0x41ad2c['readyDraftHeadRevision'],_0xafa6d0=_0x41ad2c['source']==='trunk'?B(_0x41ad2c):0x1;if(_0x3ae430===void 0x0||!Number['isSafeInteger'](_0x3ae430)||_0x3ae430<_0xafa6d0)throw Z('Merging\x20Worktree\x20Unit\x20has\x20no\x20valid\x20frozen\x20draft\x20head');return _0x3ae430;}function k(_0xca4543,_0x26ddb0,_0x2a516c){let _0x1c70bf=B(_0xca4543);if(_0x2a516c===null)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20no\x20longer\x20readable');let _0xa81f62=_0x1c70bf+0x1,_0x417c63=[];for(let _0x191958 of _0x2a516c){if(_0x191958['unitID']!==_0xca4543['unitID']||_0x191958['type']!==_0xca4543['type']||_0x191958['baseRev']!==_0xa81f62-0x1||_0x191958['revision']!==_0xa81f62)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20not\x20contiguous');_0x417c63['push'](...structuredClone(_0x191958['mutations'])),_0xa81f62+=0x1;}if(_0xa81f62-0x1!==_0x26ddb0)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20incomplete');return _0x417c63;}function A(_0x3c8886,_0x1bd4ea,_0x2273cf,_0x2e6216,_0x4a8cae){let _0x8aa7f1=B(_0x1bd4ea);return{'unitID':_0x1bd4ea['unitID'],'type':_0x1bd4ea['type'],'baseRev':_0x8aa7f1,'revision':_0x8aa7f1+0x1,'userID':_0x4a8cae['userID'],'memberID':_0x4a8cae['memberID'],'sid':_0x3c8886,'reqId':_0x2273cf-_0x8aa7f1,'mutations':_0x2e6216};}function j(_0x5ab010){let _0x3947e7=M(_0x5ab010);return _0x5ab010 instanceof N||_0x5ab010 instanceof P||_0x5ab010 instanceof n['CollabError']&&_0x5ab010['code']==='OT_CONFLICT'?{'status':'conflict','error':_0x3947e7}:{'status':'failed','error':_0x3947e7};}function M(_0x4a7310){return _0x4a7310 instanceof N?{'code':'WORKTREE_DRAFT_HISTORY_INVALID','message':_0x4a7310['message'],'retryable':!0x0}:_0x4a7310 instanceof P?{'code':'WORKTREE_CREATE_CONFLICT','message':_0x4a7310['message'],'retryable':!0x1}:_0x4a7310 instanceof n['CollabError']||_0x4a7310 instanceof i?{'code':_0x4a7310['code'],'message':_0x4a7310['message'],'retryable':_0x4a7310['retryable']}:{'code':'INTERNAL_ERROR','message':_0x4a7310 instanceof Error?_0x4a7310['message']:'Merge\x20failed','retryable':!0x0};}var N=class extends Error{constructor(_0x531601){super(_0x531601),this['name']='FrozenDraftConflict';}},P=class extends Error{constructor(_0x54bca1){super(_0x54bca1),this['name']='WorktreeCreateConflict';}};function F(_0x1646ca,_0x3d8ada){return(0x0,t['isDeepStrictEqual'])(I(_0x1646ca),I(_0x3d8ada));}function I(_0x3eac18){if(_0x3eac18!==void 0x0)return JSON['parse'](JSON['stringify'](_0x3eac18,(_0x35a86f,_0x2b0149)=>_0x2b0149 instanceof Uint8Array?{'__univerCollaborationBinary':[..._0x2b0149]}:_0x2b0149));}function L(_0x1800f6,_0x39dd05){let _0x53f534=new Set(_0x1800f6['units']['map'](({unitID:_0x493aa4})=>_0x493aa4));if(_0x53f534['size']!==_0x39dd05['length']||_0x39dd05['some'](_0x55fc9d=>!_0x53f534['has'](_0x55fc9d)))throw Z('Database\x20returned\x20incomplete\x20initial\x20Worktree\x20Units');}function R(_0x4d79b0,_0x5b238b){let {worktree:_0x16e2a6,units:_0x32085c}=_0x4d79b0;if(_0x16e2a6['worktreeID']!==_0x5b238b||!_0x16e2a6['sid']||!W(_0x16e2a6['status']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20metadata');let _0x233148=new Set(),_0x10523c=_0x32085c['map'](_0x55609b=>{let _0x1c7964=_0x55609b['source']==='trunk'&&Number['isSafeInteger'](_0x55609b['baselineTrunkRevision'])&&_0x55609b['baselineTrunkRevision']>=0x1&&_0x55609b['draftHeadRevision']>=_0x55609b['baselineTrunkRevision']||_0x55609b['source']==='worktree'&&_0x55609b['baselineTrunkRevision']===void 0x0&&_0x55609b['draftHeadRevision']>=0x1;if(_0x55609b['worktreeID']!==_0x5b238b||!_0x55609b['unitID']||_0x233148['has'](_0x55609b['unitID'])||!x['has'](_0x55609b['type'])||!_0x1c7964||!Number['isSafeInteger'](_0x55609b['draftHeadRevision'])||_0x55609b['readyDraftHeadRevision']!==void 0x0&&_0x55609b['readyDraftHeadRevision']!==_0x55609b['draftHeadRevision']||_0x55609b['mergeResult']!==void 0x0&&_0x55609b['readyDraftHeadRevision']===void 0x0||_0x55609b['removed']!==void 0x0&&typeof _0x55609b['removed']!='boolean'||!G(_0x55609b['mergeResult']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20Unit\x20metadata');return _0x233148['add'](_0x55609b['unitID']),z(_0x55609b);});if(_0x16e2a6['status']==='merged'&&_0x10523c['some'](({mergeResult:_0x1342b6})=>!J(_0x1342b6)))throw Z('Merged\x20Worktree\x20contains\x20an\x20incomplete\x20Unit');return{'worktreeID':_0x16e2a6['worktreeID'],'status':_0x16e2a6['status'],'units':_0x10523c};}function z(_0x17ec2d){return{'unitID':_0x17ec2d['unitID'],'type':_0x17ec2d['type'],'source':_0x17ec2d['source'],..._0x17ec2d['baselineTrunkRevision']===void 0x0?{}:{'baselineTrunkRevision':_0x17ec2d['baselineTrunkRevision']},'draftHeadRevision':_0x17ec2d['draftHeadRevision'],..._0x17ec2d['readyDraftHeadRevision']===void 0x0?{}:{'readyDraftHeadRevision':_0x17ec2d['readyDraftHeadRevision']},..._0x17ec2d['removed']===void 0x0?{}:{'removed':_0x17ec2d['removed']},..._0x17ec2d['mergeResult']===void 0x0?{}:{'mergeResult':K(_0x17ec2d['mergeResult'])}};}function B(_0x5c77a9){if(_0x5c77a9['source']!=='trunk'||!Number['isSafeInteger'](_0x5c77a9['baselineTrunkRevision'])||_0x5c77a9['baselineTrunkRevision']<0x1)throw Z('Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x5c77a9['baselineTrunkRevision'];}function V(_0x2c08e1,_0x3f2fc7,_0x39a4df){if(_0x39a4df['readyDraftHeadRevision']!==_0x3f2fc7||_0x39a4df['unit']['snapshot']['unitID']!==_0x2c08e1['unitID']||_0x39a4df['unit']['snapshot']['type']!==_0x2c08e1['type']||_0x39a4df['unit']['snapshot']['rev']!==0x1)throw Z('Database\x20returned\x20an\x20invalid\x20Worktree\x20Unit\x20merge\x20artifact');}function H(_0x5ceee9){let _0x190bce={..._0x5ceee9,'rev':0x1};return _0x5ceee9['workbook']?{..._0x190bce,'workbook':{..._0x5ceee9['workbook'],'rev':0x1}}:_0x5ceee9['doc']?{..._0x190bce,'doc':{..._0x5ceee9['doc'],'rev':0x1}}:_0x5ceee9['slide']?{..._0x190bce,'slide':{..._0x5ceee9['slide'],'rev':0x1}}:_0x5ceee9['board']?{..._0x190bce,'board':{..._0x5ceee9['board'],'rev':0x1}}:_0x190bce;}function U(_0x412992,_0xa087d7){let _0x521a64=_0x412992['units']['find'](_0x13776f=>_0x13776f['unitID']===_0xa087d7);if(!_0x521a64)throw Z('Database\x20omitted\x20the\x20added\x20Worktree\x20Unit');return _0x521a64;}function W(_0x5258b6){return _0x5258b6==='draft'||_0x5258b6==='ready'||_0x5258b6==='merging'||_0x5258b6==='merged'||_0x5258b6==='discarded';}function G(_0xe01eb5){return _0xe01eb5===void 0x0?!0x0:!_0xe01eb5||typeof _0xe01eb5!='object'||!('status'in _0xe01eb5)?!0x1:_0xe01eb5['status']==='unchanged'||_0xe01eb5['status']==='removed'?!0x0:_0xe01eb5['status']==='merged'&&'trunkRevision'in _0xe01eb5?typeof _0xe01eb5['trunkRevision']=='number'&&Number['isSafeInteger'](_0xe01eb5['trunkRevision'])&&_0xe01eb5['trunkRevision']>=0x1:_0xe01eb5['status']!=='conflict'&&_0xe01eb5['status']!=='failed'||!('error'in _0xe01eb5)||!_0xe01eb5['error']||typeof _0xe01eb5['error']!='object'||!('code'in _0xe01eb5['error'])||!('message'in _0xe01eb5['error'])||!('retryable'in _0xe01eb5['error'])?!0x1:typeof _0xe01eb5['error']['code']=='string'&&!!_0xe01eb5['error']['code']&&typeof _0xe01eb5['error']['message']=='string'&&!!_0xe01eb5['error']['message']&&typeof _0xe01eb5['error']['retryable']=='boolean';}function K(_0x4ce707){return _0x4ce707['status']==='merged'?{'status':'merged','trunkRevision':_0x4ce707['trunkRevision']}:_0x4ce707['status']==='unchanged'||_0x4ce707['status']==='removed'?{'status':_0x4ce707['status']}:{'status':_0x4ce707['status'],'error':{'code':_0x4ce707['error']['code'],'message':_0x4ce707['error']['message'],'retryable':_0x4ce707['error']['retryable']}};}function q(_0x5f0b50){if(_0x5f0b50?.['status']==='merged')return{'status':'merged','trunkRevision':_0x5f0b50['trunkRevision']};if(_0x5f0b50?.['status']==='unchanged')return{'status':'unchanged'};throw Z('Worktree\x20Unit\x20merge\x20result\x20is\x20not\x20terminal');}function J(_0x9ebf47){return _0x9ebf47?.['status']==='merged'||_0x9ebf47?.['status']==='unchanged'||_0x9ebf47?.['status']==='removed';}function Y(_0x2a5908){return new i('WORKTREE_NOT_FOUND','Worktree\x20'+_0x2a5908+'\x20does\x20not\x20exist');}function X(_0x39ba68){return new n['CollabError']('INVALID_REQUEST',_0x39ba68);}function Z(_0x2d014f,_0x2e5733){return new n['CollabError']('ADAPTER_FAILURE',_0x2d014f,{'retryable':!0x0,..._0x2e5733===void 0x0?{}:{'cause':_0x2e5733}});}function re(_0x44740e){return _0x44740e?{'debug':(..._0x321f67)=>Q(()=>_0x44740e['debug'](..._0x321f67)),'info':(..._0x534c09)=>Q(()=>_0x44740e['info'](..._0x534c09)),'warn':(..._0x320774)=>Q(()=>_0x44740e['warn'](..._0x320774)),'error':(..._0x10816b)=>Q(()=>_0x44740e['error'](..._0x10816b))}:{'debug':()=>void 0x0,'info':()=>void 0x0,'warn':()=>void 0x0,'error':()=>void 0x0};}function ie(_0x59379d){return _0x59379d?{'increment':(..._0x11edc5)=>Q(()=>_0x59379d['increment'](..._0x11edc5)),'observe':(..._0x3e23de)=>Q(()=>_0x59379d['observe'](..._0x3e23de))}:{'increment':()=>void 0x0,'observe':()=>void 0x0};}function Q(_0x521cf3){try{_0x521cf3();}catch{}}function $(_0xd73931){return _0xd73931 instanceof Error?_0xd73931['message']:String(_0xd73931);}exports['UniverCollabWorktreeService']=ne,exports['WorktreeError']=i;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CollabContext, CollabMemberContext, CreateUnitFromDataInput, CreateUnitFromSnapshotInput, CreateUnitRequest, CustomData, Disposable, GetChangesetsRequest, GetChangesetsResult, GetSheetBlockRequest, GetSheetBlockResult, GetUnitLoadDataRequest, IDatabaseAdapter, ILogger, IMetrics, IUniverCollabService, JsonObject, Middleware, MiddlewareNext, RequiredUnitPermission, SaveSnapshotInput, SubmitChangesetRequest, SubmitChangesetResult, UnitLoadData } from "@univerjs-pro/collaboration-service";
|
|
2
2
|
import { IChangeset, ISheetBlock, ISnapshot, UniverType } from "@univerjs/protocol";
|
|
3
3
|
|
|
4
4
|
//#region src/model/types.d.ts
|
|
@@ -14,6 +14,8 @@ type WorktreeUnitMergeResult = {
|
|
|
14
14
|
readonly trunkRevision: number;
|
|
15
15
|
} | {
|
|
16
16
|
readonly status: "unchanged";
|
|
17
|
+
} | {
|
|
18
|
+
readonly status: "removed";
|
|
17
19
|
} | {
|
|
18
20
|
readonly status: "conflict";
|
|
19
21
|
readonly error: WorktreeMergeError;
|
|
@@ -34,6 +36,9 @@ interface WorktreeUnitRecord {
|
|
|
34
36
|
readonly baselineTrunkRevision?: number;
|
|
35
37
|
readonly draftHeadRevision: number;
|
|
36
38
|
readonly readyDraftHeadRevision?: number;
|
|
39
|
+
readonly creatorID: string;
|
|
40
|
+
readonly createdAt: number;
|
|
41
|
+
readonly removed?: boolean;
|
|
37
42
|
readonly mergeResult?: WorktreeUnitMergeResult;
|
|
38
43
|
}
|
|
39
44
|
interface WorktreeAggregateRecord {
|
|
@@ -52,13 +57,22 @@ interface WorktreeUnitData {
|
|
|
52
57
|
readonly baselineTrunkRevision?: number;
|
|
53
58
|
readonly draftHeadRevision: number;
|
|
54
59
|
readonly readyDraftHeadRevision?: number;
|
|
60
|
+
readonly removed?: boolean;
|
|
55
61
|
readonly mergeResult?: WorktreeUnitMergeResult;
|
|
56
62
|
}
|
|
57
63
|
//#endregion
|
|
58
64
|
//#region src/database/adapter.d.ts
|
|
65
|
+
interface WorktreeDatabaseContext<TRequest extends object = object> {
|
|
66
|
+
readonly userID: string;
|
|
67
|
+
readonly customData: CustomData;
|
|
68
|
+
readonly request: TRequest;
|
|
69
|
+
}
|
|
70
|
+
interface WorktreeMemberDatabaseContext<TRequest extends object = object> extends WorktreeDatabaseContext<TRequest> {
|
|
71
|
+
readonly memberID: string;
|
|
72
|
+
}
|
|
59
73
|
interface WorktreeRevisionRange {
|
|
60
74
|
readonly from: number;
|
|
61
|
-
readonly to
|
|
75
|
+
readonly to?: number;
|
|
62
76
|
}
|
|
63
77
|
interface CreateWorktreeDatabaseInput {
|
|
64
78
|
readonly record: WorktreeRecord;
|
|
@@ -117,16 +131,12 @@ type CreateWorktreeUnitDatabaseResult = {
|
|
|
117
131
|
};
|
|
118
132
|
interface CommitWorktreeChangesetInput {
|
|
119
133
|
readonly worktreeID: string;
|
|
120
|
-
readonly expectedHeadRevision: number;
|
|
121
134
|
readonly changeset: IChangeset;
|
|
122
135
|
}
|
|
123
136
|
type CommitWorktreeChangesetResult = {
|
|
124
137
|
readonly status: "committed";
|
|
125
138
|
readonly changeset: IChangeset;
|
|
126
139
|
readonly headRevision: number;
|
|
127
|
-
} | {
|
|
128
|
-
readonly status: "already-committed";
|
|
129
|
-
readonly changeset: IChangeset;
|
|
130
140
|
} | {
|
|
131
141
|
readonly status: "revision-mismatch";
|
|
132
142
|
readonly actualHeadRevision: number;
|
|
@@ -170,24 +180,35 @@ type RecordUnitMergeResultResult = {
|
|
|
170
180
|
} | {
|
|
171
181
|
readonly status: "stale-merge" | "not-found";
|
|
172
182
|
};
|
|
183
|
+
interface SetWorktreeUnitRemovedDatabaseInput {
|
|
184
|
+
readonly worktreeID: string;
|
|
185
|
+
readonly unitID: string;
|
|
186
|
+
readonly removed: boolean;
|
|
187
|
+
}
|
|
188
|
+
type SetWorktreeUnitRemovedResult = {
|
|
189
|
+
readonly status: "updated" | "unchanged" | "not-editable";
|
|
190
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
191
|
+
} | {
|
|
192
|
+
readonly status: "not-found";
|
|
193
|
+
};
|
|
173
194
|
interface IWorktreeDatabaseAdapter {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
getUnitSeed(context:
|
|
179
|
-
getUnitMergeArtifact(context:
|
|
180
|
-
createWorktree(context:
|
|
181
|
-
addUnit(context:
|
|
182
|
-
createUnit(context:
|
|
183
|
-
saveUnitMergeArtifact(context:
|
|
184
|
-
commitDraftChangeset(context:
|
|
185
|
-
markReady(context:
|
|
186
|
-
reopenWorktree(context:
|
|
187
|
-
discardWorktree(context:
|
|
188
|
-
startOrResumeMerge(context:
|
|
189
|
-
recordUnitMergeResult(context:
|
|
190
|
-
finishMerge(context:
|
|
195
|
+
setUnitRemoved(context: WorktreeDatabaseContext, input: SetWorktreeUnitRemovedDatabaseInput): Promise<SetWorktreeUnitRemovedResult>;
|
|
196
|
+
getWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeAggregateRecord | null>;
|
|
197
|
+
getWorktreeUnit(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitRecord | null>;
|
|
198
|
+
getDraftChangesets(context: WorktreeDatabaseContext, worktreeID: string, unitID: string, range: WorktreeRevisionRange): Promise<readonly IChangeset[] | null>;
|
|
199
|
+
getUnitSeed(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitSeed | null>;
|
|
200
|
+
getUnitMergeArtifact(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitMergeArtifact | null>;
|
|
201
|
+
createWorktree(context: WorktreeDatabaseContext, input: CreateWorktreeDatabaseInput): Promise<CreateWorktreeDatabaseResult>;
|
|
202
|
+
addUnit(context: WorktreeDatabaseContext, input: AddWorktreeUnitDatabaseInput): Promise<AddWorktreeUnitDatabaseResult>;
|
|
203
|
+
createUnit(context: WorktreeDatabaseContext, input: CreateWorktreeUnitDatabaseInput): Promise<CreateWorktreeUnitDatabaseResult>;
|
|
204
|
+
saveUnitMergeArtifact(context: WorktreeDatabaseContext, input: SaveWorktreeUnitMergeArtifactInput): Promise<SaveWorktreeUnitMergeArtifactResult>;
|
|
205
|
+
commitDraftChangeset(context: WorktreeDatabaseContext, input: CommitWorktreeChangesetInput): Promise<CommitWorktreeChangesetResult>;
|
|
206
|
+
markReady(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
207
|
+
reopenWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
208
|
+
discardWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
209
|
+
startOrResumeMerge(context: WorktreeDatabaseContext, worktreeID: string): Promise<StartMergeResult>;
|
|
210
|
+
recordUnitMergeResult(context: WorktreeDatabaseContext, input: RecordUnitMergeResultInput): Promise<RecordUnitMergeResultResult>;
|
|
211
|
+
finishMerge(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
191
212
|
dispose?(): Promise<void>;
|
|
192
213
|
}
|
|
193
214
|
//#endregion
|
|
@@ -205,7 +226,7 @@ declare class WorktreeError extends Error {
|
|
|
205
226
|
}
|
|
206
227
|
//#endregion
|
|
207
228
|
//#region src/request/request.d.ts
|
|
208
|
-
interface BaseWorktreeRequest
|
|
229
|
+
interface BaseWorktreeRequest {
|
|
209
230
|
readonly worktreeID: string;
|
|
210
231
|
}
|
|
211
232
|
interface CreateWorktreeRequest extends BaseWorktreeRequest {
|
|
@@ -223,18 +244,27 @@ interface MergeWorktreeRequest extends BaseWorktreeRequest {}
|
|
|
223
244
|
interface EvaluateWorktreeUnitMergeRequest extends BaseWorktreeRequest {
|
|
224
245
|
readonly unitID: string;
|
|
225
246
|
}
|
|
226
|
-
interface
|
|
247
|
+
interface GetWorktreeUnitLoadDataRequest extends GetUnitLoadDataRequest, BaseWorktreeRequest {}
|
|
227
248
|
interface GetWorktreeChangesetsRequest extends GetChangesetsRequest, BaseWorktreeRequest {}
|
|
228
249
|
interface GetWorktreeSheetBlockRequest extends GetSheetBlockRequest, BaseWorktreeRequest {}
|
|
229
|
-
type ReadWorktreeUnitDataRequest = EvaluateWorktreeUnitMergeRequest |
|
|
250
|
+
type ReadWorktreeUnitDataRequest = EvaluateWorktreeUnitMergeRequest | GetWorktreeUnitLoadDataRequest | GetWorktreeChangesetsRequest | GetWorktreeSheetBlockRequest;
|
|
230
251
|
interface SubmitWorktreeChangesetRequest extends SubmitChangesetRequest, BaseWorktreeRequest {}
|
|
252
|
+
type WorktreeRequest = CreateWorktreeRequest | GetWorktreeRequest | SetWorktreeUnitRemovedRequest | AddWorktreeUnitRequest | CreateWorktreeUnitRequest | MarkWorktreeReadyRequest | ReopenWorktreeRequest | DiscardWorktreeRequest | MergeWorktreeRequest | ReadWorktreeUnitDataRequest | SubmitWorktreeChangesetRequest;
|
|
253
|
+
interface SetWorktreeUnitRemovedRequest extends BaseWorktreeRequest {
|
|
254
|
+
readonly unitID: string;
|
|
255
|
+
readonly removed: boolean;
|
|
256
|
+
}
|
|
231
257
|
//#endregion
|
|
232
258
|
//#region src/middleware/middleware.d.ts
|
|
233
|
-
type WorktreeMiddlewareAction = "readWorktreeData" | "createWorktree" | "addWorktreeUnit" | "createWorktreeUnit" | "markWorktreeReady" | "reopenWorktree" | "discardWorktree" | "mergeWorktree" | "readUnitData" | "submitChangeset" | "applyChangeset" | "commitChangeset";
|
|
259
|
+
type WorktreeMiddlewareAction = "readWorktreeData" | "createWorktree" | "setWorktreeUnitRemoved" | "addWorktreeUnit" | "createWorktreeUnit" | "markWorktreeReady" | "reopenWorktree" | "discardWorktree" | "mergeWorktree" | "readUnitData" | "submitChangeset" | "applyChangeset" | "commitChangeset";
|
|
234
260
|
type WorktreeMiddlewareNext = MiddlewareNext;
|
|
235
261
|
type WorktreeMiddleware<TContext> = Middleware<TContext>;
|
|
236
262
|
interface BaseWorktreeMiddlewareContext {
|
|
237
|
-
readonly
|
|
263
|
+
readonly userID: string;
|
|
264
|
+
readonly customData: CustomData;
|
|
265
|
+
}
|
|
266
|
+
interface MemberWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
267
|
+
readonly memberID: string;
|
|
238
268
|
}
|
|
239
269
|
interface ReadWorktreeDataMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
240
270
|
readonly request: GetWorktreeRequest;
|
|
@@ -257,28 +287,30 @@ interface ReopenWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext
|
|
|
257
287
|
interface DiscardWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
258
288
|
readonly request: DiscardWorktreeRequest;
|
|
259
289
|
}
|
|
260
|
-
interface MergeWorktreeMiddlewareContext extends
|
|
290
|
+
interface MergeWorktreeMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
261
291
|
readonly request: MergeWorktreeRequest;
|
|
262
292
|
}
|
|
263
293
|
interface ReadWorktreeUnitDataMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
264
294
|
readonly request: ReadWorktreeUnitDataRequest;
|
|
265
295
|
}
|
|
266
|
-
interface SubmitWorktreeChangesetMiddlewareContext extends
|
|
296
|
+
interface SubmitWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
267
297
|
readonly request: SubmitWorktreeChangesetRequest;
|
|
268
298
|
}
|
|
269
|
-
interface ApplyWorktreeChangesetMiddlewareContext extends
|
|
299
|
+
interface ApplyWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
270
300
|
readonly request: SubmitWorktreeChangesetRequest;
|
|
271
301
|
readonly attempt: number;
|
|
272
302
|
readonly currentRevision: number;
|
|
273
303
|
readonly changeset: Readonly<IChangeset>;
|
|
274
304
|
}
|
|
275
|
-
interface CommitWorktreeChangesetMiddlewareContext extends
|
|
305
|
+
interface CommitWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
276
306
|
readonly request: SubmitWorktreeChangesetRequest;
|
|
277
307
|
readonly attempt: number;
|
|
278
308
|
readonly expectedHeadRevision: number;
|
|
279
309
|
readonly changeset: Readonly<IChangeset>;
|
|
310
|
+
readonly requiredUnitPermissions: readonly RequiredUnitPermission[];
|
|
280
311
|
}
|
|
281
312
|
interface WorktreeMiddlewareMap {
|
|
313
|
+
readonly setWorktreeUnitRemoved: Middleware<SetWorktreeUnitRemovedMiddlewareContext>;
|
|
282
314
|
readonly readWorktreeData: Middleware<ReadWorktreeDataMiddlewareContext>;
|
|
283
315
|
readonly createWorktree: Middleware<CreateWorktreeMiddlewareContext>;
|
|
284
316
|
readonly addWorktreeUnit: Middleware<AddWorktreeUnitMiddlewareContext>;
|
|
@@ -292,10 +324,14 @@ interface WorktreeMiddlewareMap {
|
|
|
292
324
|
readonly applyChangeset: Middleware<ApplyWorktreeChangesetMiddlewareContext>;
|
|
293
325
|
readonly commitChangeset: Middleware<CommitWorktreeChangesetMiddlewareContext>;
|
|
294
326
|
}
|
|
327
|
+
interface SetWorktreeUnitRemovedMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
328
|
+
readonly request: SetWorktreeUnitRemovedRequest;
|
|
329
|
+
}
|
|
295
330
|
//#endregion
|
|
296
331
|
//#region src/service/events.d.ts
|
|
297
332
|
interface BaseWorktreeEvent {
|
|
298
|
-
readonly
|
|
333
|
+
readonly userID: string;
|
|
334
|
+
readonly customData: CustomData;
|
|
299
335
|
readonly worktree: WorktreeData;
|
|
300
336
|
readonly occurredAt: number;
|
|
301
337
|
}
|
|
@@ -320,12 +356,16 @@ interface WorktreeUnitMergeResultRecordedEvent extends BaseWorktreeEvent {
|
|
|
320
356
|
readonly unit: WorktreeUnitData;
|
|
321
357
|
}
|
|
322
358
|
interface WorktreeChangesetCommittedEvent {
|
|
323
|
-
readonly
|
|
359
|
+
readonly userID: string;
|
|
360
|
+
readonly memberID: string;
|
|
361
|
+
readonly customData: CustomData;
|
|
324
362
|
readonly request: SubmitWorktreeChangesetRequest;
|
|
325
363
|
readonly changeset: IChangeset;
|
|
364
|
+
readonly requiredUnitPermissions: readonly RequiredUnitPermission[];
|
|
326
365
|
readonly committedAt: number;
|
|
327
366
|
}
|
|
328
367
|
interface WorktreeServiceEventMap {
|
|
368
|
+
readonly worktreeUnitRemovalChanged: WorktreeUnitRemovalChangedEvent;
|
|
329
369
|
readonly worktreeCreated: WorktreeCreatedEvent;
|
|
330
370
|
readonly worktreeUnitAdded: WorktreeUnitAddedEvent;
|
|
331
371
|
readonly worktreeUnitCreated: WorktreeUnitCreatedEvent;
|
|
@@ -333,8 +373,12 @@ interface WorktreeServiceEventMap {
|
|
|
333
373
|
readonly worktreeUnitMergeResultRecorded: WorktreeUnitMergeResultRecordedEvent;
|
|
334
374
|
readonly changesetCommitted: WorktreeChangesetCommittedEvent;
|
|
335
375
|
}
|
|
376
|
+
interface WorktreeUnitRemovalChangedEvent extends BaseWorktreeEvent {
|
|
377
|
+
readonly request: SetWorktreeUnitRemovedRequest;
|
|
378
|
+
readonly unit: WorktreeUnitData;
|
|
379
|
+
}
|
|
336
380
|
//#endregion
|
|
337
|
-
//#region src/
|
|
381
|
+
//#region src/operations/operations.d.ts
|
|
338
382
|
interface WorktreeResult {
|
|
339
383
|
readonly worktree: WorktreeData;
|
|
340
384
|
}
|
|
@@ -349,9 +393,9 @@ interface AddWorktreeUnitInput {
|
|
|
349
393
|
readonly worktreeID: string;
|
|
350
394
|
readonly unitID: string;
|
|
351
395
|
}
|
|
352
|
-
|
|
396
|
+
type CreateWorktreeUnitFromSnapshotInput = CreateUnitFromSnapshotInput & {
|
|
353
397
|
readonly worktreeID: string;
|
|
354
|
-
}
|
|
398
|
+
};
|
|
355
399
|
type CreateWorktreeUnitFromDataInput = CreateUnitFromDataInput & {
|
|
356
400
|
readonly worktreeID: string;
|
|
357
401
|
};
|
|
@@ -399,9 +443,9 @@ type WorktreeUnitMergeEvaluation = {
|
|
|
399
443
|
readonly status: "not-applicable";
|
|
400
444
|
readonly worktreeID: string;
|
|
401
445
|
readonly unitID: string;
|
|
402
|
-
readonly reason: "worktree-created-unit";
|
|
446
|
+
readonly reason: "worktree-created-unit" | "removed-unit";
|
|
403
447
|
};
|
|
404
|
-
interface
|
|
448
|
+
interface GetWorktreeUnitLoadDataInput {
|
|
405
449
|
readonly worktreeID: string;
|
|
406
450
|
readonly unitID: string;
|
|
407
451
|
readonly type: UniverType;
|
|
@@ -424,10 +468,14 @@ interface SubmitWorktreeChangesetInput {
|
|
|
424
468
|
readonly worktreeID: string;
|
|
425
469
|
readonly changeset: IChangeset;
|
|
426
470
|
}
|
|
427
|
-
type GetWorktreeUnitResult = GetUnitResult;
|
|
428
471
|
type GetWorktreeChangesetsResult = GetChangesetsResult;
|
|
429
472
|
type GetWorktreeSheetBlockResult = GetSheetBlockResult;
|
|
430
473
|
type SubmitWorktreeChangesetResult = SubmitChangesetResult;
|
|
474
|
+
interface SetWorktreeUnitRemovedInput {
|
|
475
|
+
readonly worktreeID: string;
|
|
476
|
+
readonly unitID: string;
|
|
477
|
+
readonly removed: boolean;
|
|
478
|
+
}
|
|
431
479
|
//#endregion
|
|
432
480
|
//#region src/service/service.d.ts
|
|
433
481
|
interface UniverCollabWorktreeServiceOptions {
|
|
@@ -436,6 +484,7 @@ interface UniverCollabWorktreeServiceOptions {
|
|
|
436
484
|
readonly dbAdapter: IDatabaseAdapter;
|
|
437
485
|
};
|
|
438
486
|
readonly dbAdapter: IWorktreeDatabaseAdapter;
|
|
487
|
+
readonly enableUnitPermissionAnalysis?: boolean;
|
|
439
488
|
readonly runtime?: {
|
|
440
489
|
readonly maxLoadedUnits?: number;
|
|
441
490
|
readonly idleTimeoutMs?: number;
|
|
@@ -447,21 +496,22 @@ interface UniverCollabWorktreeServiceOptions {
|
|
|
447
496
|
readonly metrics?: IMetrics;
|
|
448
497
|
}
|
|
449
498
|
interface IUniverCollabWorktreeService {
|
|
499
|
+
setUnitRemoved(input: SetWorktreeUnitRemovedInput, context: CollabContext): Promise<WorktreeResult>;
|
|
450
500
|
use<K extends WorktreeMiddlewareAction>(action: K, middleware: WorktreeMiddlewareMap[K]): Disposable;
|
|
451
|
-
createWorktree(input: CreateWorktreeInput,
|
|
452
|
-
getWorktree(input: GetWorktreeInput,
|
|
453
|
-
addUnit(input: AddWorktreeUnitInput,
|
|
454
|
-
|
|
455
|
-
createUnitFromData(input: CreateWorktreeUnitFromDataInput,
|
|
456
|
-
markReady(input: MarkWorktreeReadyInput,
|
|
457
|
-
reopenWorktree(input: ReopenWorktreeInput,
|
|
458
|
-
discardWorktree(input: DiscardWorktreeInput,
|
|
459
|
-
mergeWorktree(input: MergeWorktreeInput,
|
|
460
|
-
evaluateWorktreeUnitMerge(input: EvaluateWorktreeUnitMergeInput,
|
|
461
|
-
|
|
462
|
-
getChangesets(input: GetWorktreeChangesetsInput,
|
|
463
|
-
getSheetBlock(input: GetWorktreeSheetBlockInput,
|
|
464
|
-
submitChangeset(input: SubmitWorktreeChangesetInput,
|
|
501
|
+
createWorktree(input: CreateWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
502
|
+
getWorktree(input: GetWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
503
|
+
addUnit(input: AddWorktreeUnitInput, context: CollabContext): Promise<WorktreeResult>;
|
|
504
|
+
createUnitFromSnapshot(input: CreateWorktreeUnitFromSnapshotInput, context: CollabContext): Promise<WorktreeResult>;
|
|
505
|
+
createUnitFromData(input: CreateWorktreeUnitFromDataInput, context: CollabContext): Promise<WorktreeResult>;
|
|
506
|
+
markReady(input: MarkWorktreeReadyInput, context: CollabContext): Promise<WorktreeResult>;
|
|
507
|
+
reopenWorktree(input: ReopenWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
508
|
+
discardWorktree(input: DiscardWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
509
|
+
mergeWorktree(input: MergeWorktreeInput, context: CollabMemberContext): Promise<WorktreeResult>;
|
|
510
|
+
evaluateWorktreeUnitMerge(input: EvaluateWorktreeUnitMergeInput, context: CollabContext): Promise<WorktreeUnitMergeEvaluation>;
|
|
511
|
+
getUnitLoadData(input: GetWorktreeUnitLoadDataInput, context: CollabContext): Promise<UnitLoadData>;
|
|
512
|
+
getChangesets(input: GetWorktreeChangesetsInput, context: CollabContext): Promise<GetWorktreeChangesetsResult>;
|
|
513
|
+
getSheetBlock(input: GetWorktreeSheetBlockInput, context: CollabContext): Promise<GetWorktreeSheetBlockResult>;
|
|
514
|
+
submitChangeset(input: SubmitWorktreeChangesetInput, context: CollabMemberContext): Promise<SubmitWorktreeChangesetResult>;
|
|
465
515
|
on<K extends keyof WorktreeServiceEventMap>(event: K, listener: (event: WorktreeServiceEventMap[K]) => void | Promise<void>): Disposable;
|
|
466
516
|
dispose(): Promise<void>;
|
|
467
517
|
}
|
|
@@ -475,25 +525,27 @@ declare class UniverCollabWorktreeService implements IUniverCollabWorktreeServic
|
|
|
475
525
|
private readonly _logger;
|
|
476
526
|
private readonly _metrics;
|
|
477
527
|
private readonly _runtimeOptions;
|
|
528
|
+
private readonly _enableUnitPermissionAnalysis;
|
|
478
529
|
private readonly _maxRevisionRetries;
|
|
479
530
|
private readonly _draftServices;
|
|
480
531
|
constructor(options: UniverCollabWorktreeServiceOptions);
|
|
481
532
|
use<K extends WorktreeMiddlewareAction>(action: K, middleware: WorktreeMiddlewareMap[K]): Disposable;
|
|
482
533
|
on<K extends keyof WorktreeServiceEventMap>(event: K, listener: (event: WorktreeServiceEventMap[K]) => void | Promise<void>): Disposable;
|
|
483
|
-
createWorktree(input: CreateWorktreeInput,
|
|
484
|
-
getWorktree(input: GetWorktreeInput,
|
|
485
|
-
addUnit(input: AddWorktreeUnitInput,
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
534
|
+
createWorktree(input: CreateWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
535
|
+
getWorktree(input: GetWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
536
|
+
addUnit(input: AddWorktreeUnitInput, context: CollabContext): Promise<WorktreeResult>;
|
|
537
|
+
setUnitRemoved(input: SetWorktreeUnitRemovedInput, context: CollabContext): Promise<WorktreeResult>;
|
|
538
|
+
createUnitFromSnapshot(input: CreateWorktreeUnitFromSnapshotInput, context: CollabContext): Promise<WorktreeResult>;
|
|
539
|
+
createUnitFromData(input: CreateWorktreeUnitFromDataInput, context: CollabContext): Promise<WorktreeResult>;
|
|
540
|
+
markReady(input: MarkWorktreeReadyInput, context: CollabContext): Promise<WorktreeResult>;
|
|
541
|
+
reopenWorktree(input: ReopenWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
542
|
+
discardWorktree(input: DiscardWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
543
|
+
mergeWorktree(input: MergeWorktreeInput, context: CollabMemberContext): Promise<WorktreeResult>;
|
|
544
|
+
evaluateWorktreeUnitMerge(input: EvaluateWorktreeUnitMergeInput, context: CollabContext): Promise<WorktreeUnitMergeEvaluation>;
|
|
545
|
+
getUnitLoadData(input: GetWorktreeUnitLoadDataInput, context: CollabContext): Promise<UnitLoadData>;
|
|
546
|
+
getChangesets(input: GetWorktreeChangesetsInput, context: CollabContext): Promise<GetWorktreeChangesetsResult>;
|
|
547
|
+
getSheetBlock(input: GetWorktreeSheetBlockInput, context: CollabContext): Promise<GetWorktreeSheetBlockResult>;
|
|
548
|
+
submitChangeset(input: SubmitWorktreeChangesetInput, context: CollabMemberContext): Promise<SubmitWorktreeChangesetResult>;
|
|
497
549
|
dispose(): Promise<void>;
|
|
498
550
|
private _draftService;
|
|
499
551
|
private _mergeUnit;
|
|
@@ -507,4 +559,4 @@ declare class UniverCollabWorktreeService implements IUniverCollabWorktreeServic
|
|
|
507
559
|
private _assertRunning;
|
|
508
560
|
}
|
|
509
561
|
//#endregion
|
|
510
|
-
export { type AddWorktreeUnitDatabaseInput, type AddWorktreeUnitDatabaseResult, type AddWorktreeUnitInput, type AddWorktreeUnitMiddlewareContext, type AddWorktreeUnitRequest, type ApplyWorktreeChangesetMiddlewareContext, type BaseWorktreeMiddlewareContext, type BaseWorktreeRequest, type CommitWorktreeChangesetInput, type CommitWorktreeChangesetMiddlewareContext, type CommitWorktreeChangesetResult, type CreateWorktreeDatabaseInput, type CreateWorktreeDatabaseResult, type CreateWorktreeInput, type CreateWorktreeMiddlewareContext, type CreateWorktreeRequest, type CreateWorktreeUnitDatabaseInput, type CreateWorktreeUnitDatabaseResult, type CreateWorktreeUnitFromDataInput, type
|
|
562
|
+
export { type AddWorktreeUnitDatabaseInput, type AddWorktreeUnitDatabaseResult, type AddWorktreeUnitInput, type AddWorktreeUnitMiddlewareContext, type AddWorktreeUnitRequest, type ApplyWorktreeChangesetMiddlewareContext, type BaseWorktreeMiddlewareContext, type BaseWorktreeRequest, type CommitWorktreeChangesetInput, type CommitWorktreeChangesetMiddlewareContext, type CommitWorktreeChangesetResult, type CreateWorktreeDatabaseInput, type CreateWorktreeDatabaseResult, type CreateWorktreeInput, type CreateWorktreeMiddlewareContext, type CreateWorktreeRequest, type CreateWorktreeUnitDatabaseInput, type CreateWorktreeUnitDatabaseResult, type CreateWorktreeUnitFromDataInput, type CreateWorktreeUnitFromSnapshotInput, type CreateWorktreeUnitMiddlewareContext, type CreateWorktreeUnitRequest, type DiscardWorktreeInput, type DiscardWorktreeMiddlewareContext, type DiscardWorktreeRequest, type EvaluateWorktreeUnitMergeInput, type EvaluateWorktreeUnitMergeRequest, type GetWorktreeChangesetsInput, type GetWorktreeChangesetsRequest, type GetWorktreeChangesetsResult, type GetWorktreeInput, type GetWorktreeRequest, type GetWorktreeSheetBlockInput, type GetWorktreeSheetBlockRequest, type GetWorktreeSheetBlockResult, type GetWorktreeUnitLoadDataInput, type GetWorktreeUnitLoadDataRequest, type IUniverCollabWorktreeService, type IWorktreeDatabaseAdapter, type MarkWorktreeReadyInput, type MarkWorktreeReadyMiddlewareContext, type MarkWorktreeReadyRequest, type MemberWorktreeMiddlewareContext, type MergeWorktreeInput, type MergeWorktreeMiddlewareContext, type MergeWorktreeRequest, type ReadWorktreeDataMiddlewareContext, type ReadWorktreeUnitDataMiddlewareContext, type ReadWorktreeUnitDataRequest, type RecordUnitMergeResultInput, type RecordUnitMergeResultResult, type ReopenWorktreeInput, type ReopenWorktreeMiddlewareContext, type ReopenWorktreeRequest, type SaveWorktreeUnitMergeArtifactInput, type SaveWorktreeUnitMergeArtifactResult, type SetWorktreeUnitRemovedDatabaseInput, type SetWorktreeUnitRemovedInput, type SetWorktreeUnitRemovedMiddlewareContext, type SetWorktreeUnitRemovedRequest, type SetWorktreeUnitRemovedResult, type StartMergeResult, type SubmitWorktreeChangesetInput, type SubmitWorktreeChangesetMiddlewareContext, type SubmitWorktreeChangesetRequest, type SubmitWorktreeChangesetResult, UniverCollabWorktreeService, type UniverCollabWorktreeServiceOptions, type WorktreeAggregateRecord, type WorktreeChangesetCommittedEvent, type WorktreeCreatedEvent, type WorktreeData, type WorktreeDatabaseContext, WorktreeError, type WorktreeErrorCode, type WorktreeMemberDatabaseContext, type WorktreeMergeError, type WorktreeMiddleware, type WorktreeMiddlewareAction, type WorktreeMiddlewareMap, type WorktreeMiddlewareNext, type WorktreeRecord, type WorktreeRequest, type WorktreeResult, type WorktreeRevisionRange, type WorktreeServiceEventMap, type WorktreeStatus, type WorktreeStatusChangedEvent, type WorktreeTransitionResult, type WorktreeUnitAddedEvent, type WorktreeUnitCreatedEvent, type WorktreeUnitData, type WorktreeUnitMergeArtifact, type WorktreeUnitMergeEvaluation, type WorktreeUnitMergeResult, type WorktreeUnitMergeResultRecordedEvent, type WorktreeUnitRecord, type WorktreeUnitRemovalChangedEvent, type WorktreeUnitSeed, type WorktreeUnitSource };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(function(_0x57d3bf,_0xc337e7){const _0x3aaa4c=_0x594d,_0x65cbbb=_0x57d3bf();while(!![]){try{const _0x164df1=parseInt(_0x3aaa4c(0x11a))/0x1*(parseInt(_0x3aaa4c(0x117))/0x2)+-parseInt(_0x3aaa4c(0x115))/0x3+-parseInt(_0x3aaa4c(0x114))/0x4+-parseInt(_0x3aaa4c(0x112))/0x5*(-parseInt(_0x3aaa4c(0x111))/0x6)+-parseInt(_0x3aaa4c(0x113))/0x7+-parseInt(_0x3aaa4c(0x110))/0x8*(-parseInt(_0x3aaa4c(0x118))/0x9)+-parseInt(_0x3aaa4c(0x119))/0xa*(-parseInt(_0x3aaa4c(0x116))/0xb);if(_0x164df1===_0xc337e7)break;else _0x65cbbb['push'](_0x65cbbb['shift']());}catch(_0x37830c){_0x65cbbb['push'](_0x65cbbb['shift']());}}}(_0x11c4,0x9d1a6));function _0x594d(_0x1a5b1a,_0x44c921){_0x1a5b1a=_0x1a5b1a-0x110;const _0x11c464=_0x11c4();let _0x594dfb=_0x11c464[_0x1a5b1a];return _0x594dfb;}import _0x31b48e from'./index.cjs';function _0x11c4(){const _0x5dfff7=['18UfZUGc','1335175PwZUOF','8950921kETsGu','443976bXTxQC','1355526KrsbGA','57167IzpHBT','71424eAFXTY','19953ijsmBE','1150jkWRjE','9ecsGBq','2760KHMQfk'];_0x11c4=function(){return _0x5dfff7;};return _0x11c4();}const facadeExport0=_0x31b48e['UniverCollabWorktreeService'],facadeExport1=_0x31b48e['WorktreeError'];export{facadeExport0 as UniverCollabWorktreeService,facadeExport1 as WorktreeError};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@univerjs-pro/collaboration-worktree-service",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -16,10 +16,7 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@univerjs-pro/collaboration-service": "1.0.0
|
|
20
|
-
"@univerjs/protocol": "1.0.0
|
|
21
|
-
},
|
|
22
|
-
"publishConfig": {
|
|
23
|
-
"access": "public"
|
|
19
|
+
"@univerjs-pro/collaboration-service": "1.0.0",
|
|
20
|
+
"@univerjs/protocol": "1.0.0"
|
|
24
21
|
}
|
|
25
|
-
}
|
|
22
|
+
}
|