@components-kit/open-workbook-excel-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -0
- package/dist/backup-manager.d.ts +31 -0
- package/dist/backup-manager.d.ts.map +1 -0
- package/dist/backup-manager.js +61 -0
- package/dist/backup-manager.js.map +1 -0
- package/dist/batch-compiler.d.ts +11 -0
- package/dist/batch-compiler.d.ts.map +1 -0
- package/dist/batch-compiler.js +103 -0
- package/dist/batch-compiler.js.map +1 -0
- package/dist/chunking.d.ts +6 -0
- package/dist/chunking.d.ts.map +1 -0
- package/dist/chunking.js +19 -0
- package/dist/chunking.js.map +1 -0
- package/dist/conflicts.d.ts +26 -0
- package/dist/conflicts.d.ts.map +1 -0
- package/dist/conflicts.js +269 -0
- package/dist/conflicts.js.map +1 -0
- package/dist/fingerprint.d.ts +6 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +41 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/formula-dependencies.d.ts +16 -0
- package/dist/formula-dependencies.d.ts.map +1 -0
- package/dist/formula-dependencies.js +453 -0
- package/dist/formula-dependencies.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lock-manager.d.ts +39 -0
- package/dist/lock-manager.d.ts.map +1 -0
- package/dist/lock-manager.js +246 -0
- package/dist/lock-manager.js.map +1 -0
- package/dist/permissions.d.ts +11 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +21 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plan-manager.d.ts +37 -0
- package/dist/plan-manager.d.ts.map +1 -0
- package/dist/plan-manager.js +167 -0
- package/dist/plan-manager.js.map +1 -0
- package/dist/range-address.d.ts +16 -0
- package/dist/range-address.d.ts.map +1 -0
- package/dist/range-address.js +90 -0
- package/dist/range-address.js.map +1 -0
- package/dist/snapshot-manager.d.ts +20 -0
- package/dist/snapshot-manager.d.ts.map +1 -0
- package/dist/snapshot-manager.js +64 -0
- package/dist/snapshot-manager.js.map +1 -0
- package/dist/task-registry.d.ts +34 -0
- package/dist/task-registry.d.ts.map +1 -0
- package/dist/task-registry.js +141 -0
- package/dist/task-registry.js.map +1 -0
- package/dist/template-registry.d.ts +46 -0
- package/dist/template-registry.d.ts.map +1 -0
- package/dist/template-registry.js +60 -0
- package/dist/template-registry.js.map +1 -0
- package/dist/transaction-manager.d.ts +33 -0
- package/dist/transaction-manager.d.ts.map +1 -0
- package/dist/transaction-manager.js +118 -0
- package/dist/transaction-manager.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Open Workbook contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @components-kit/open-workbook-excel-core
|
|
2
|
+
|
|
3
|
+
Core workbook utilities for Open Workbook.
|
|
4
|
+
|
|
5
|
+
It contains:
|
|
6
|
+
|
|
7
|
+
- A1 range parsing and cell counting
|
|
8
|
+
- stable fingerprints
|
|
9
|
+
- batch compilation
|
|
10
|
+
- backup records
|
|
11
|
+
- snapshot comparison
|
|
12
|
+
- template registry
|
|
13
|
+
- plan manager
|
|
14
|
+
- default permission policy
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { BatchCompiler, BackupManager, SnapshotManager, TemplateRegistry } from "@components-kit/open-workbook-excel-core";
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This package is runtime-agnostic. It does not depend on Office.js and can be reused by future Excel engines.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type A1Range, type BackupId, type BackupRef, type OperationId, type WorkbookId } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export interface BackupRecord extends BackupRef {
|
|
3
|
+
affectedRanges: A1Range[];
|
|
4
|
+
retention: "session" | "persistent";
|
|
5
|
+
payloadRef?: string;
|
|
6
|
+
payload?: unknown;
|
|
7
|
+
pinned?: boolean;
|
|
8
|
+
verifiedAt?: string;
|
|
9
|
+
restoreStatus?: "available" | "missing" | "checksum_mismatch" | "unsupported";
|
|
10
|
+
}
|
|
11
|
+
export interface CreateBackupInput {
|
|
12
|
+
workbookId: WorkbookId;
|
|
13
|
+
kind: BackupRecord["kind"];
|
|
14
|
+
reason: string;
|
|
15
|
+
operationId?: OperationId;
|
|
16
|
+
affectedRanges?: A1Range[];
|
|
17
|
+
payloadRef?: string;
|
|
18
|
+
payload?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export declare class BackupManager {
|
|
21
|
+
private readonly backups;
|
|
22
|
+
createBackup(input: CreateBackupInput): BackupRecord;
|
|
23
|
+
listBackups(workbookId: WorkbookId): BackupRecord[];
|
|
24
|
+
getBackup(backupId: BackupId): BackupRecord | undefined;
|
|
25
|
+
updateBackup(backupId: BackupId, patch: Partial<BackupRecord>): BackupRecord | undefined;
|
|
26
|
+
deleteBackup(backupId: BackupId): boolean;
|
|
27
|
+
load(records: BackupRecord[]): void;
|
|
28
|
+
dump(): BackupRecord[];
|
|
29
|
+
assertRollbackAvailable(backupIds: BackupId[]): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=backup-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-manager.d.ts","sourceRoot":"","sources":["../src/backup-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EAEhB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC;CAC/E;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY;IAwBpD,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,EAAE;IAInD,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAIvD,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,GAAG,SAAS;IAUxF,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIzC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAOnC,IAAI,IAAI,YAAY,EAAE;IAItB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;CAMrD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { makeId } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export class BackupManager {
|
|
3
|
+
backups = new Map();
|
|
4
|
+
createBackup(input) {
|
|
5
|
+
const backupId = makeId("backup");
|
|
6
|
+
const record = {
|
|
7
|
+
backupId,
|
|
8
|
+
workbookId: input.workbookId,
|
|
9
|
+
kind: input.kind,
|
|
10
|
+
createdAt: new Date().toISOString(),
|
|
11
|
+
reason: input.reason,
|
|
12
|
+
affectedRanges: input.affectedRanges ?? [],
|
|
13
|
+
retention: input.kind === "workbook-copy" || input.kind === "file-copy" ? "persistent" : "session"
|
|
14
|
+
};
|
|
15
|
+
if (input.operationId !== undefined) {
|
|
16
|
+
record.operationId = input.operationId;
|
|
17
|
+
}
|
|
18
|
+
if (input.payloadRef !== undefined) {
|
|
19
|
+
record.payloadRef = input.payloadRef;
|
|
20
|
+
}
|
|
21
|
+
if (input.payload !== undefined) {
|
|
22
|
+
record.payload = input.payload;
|
|
23
|
+
}
|
|
24
|
+
this.backups.set(backupId, record);
|
|
25
|
+
return record;
|
|
26
|
+
}
|
|
27
|
+
listBackups(workbookId) {
|
|
28
|
+
return [...this.backups.values()].filter((backup) => backup.workbookId === workbookId);
|
|
29
|
+
}
|
|
30
|
+
getBackup(backupId) {
|
|
31
|
+
return this.backups.get(backupId);
|
|
32
|
+
}
|
|
33
|
+
updateBackup(backupId, patch) {
|
|
34
|
+
const existing = this.backups.get(backupId);
|
|
35
|
+
if (!existing) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const updated = { ...existing, ...patch, backupId: existing.backupId, workbookId: existing.workbookId };
|
|
39
|
+
this.backups.set(backupId, updated);
|
|
40
|
+
return { ...updated };
|
|
41
|
+
}
|
|
42
|
+
deleteBackup(backupId) {
|
|
43
|
+
return this.backups.delete(backupId);
|
|
44
|
+
}
|
|
45
|
+
load(records) {
|
|
46
|
+
this.backups.clear();
|
|
47
|
+
for (const record of records) {
|
|
48
|
+
this.backups.set(record.backupId, { ...record });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
dump() {
|
|
52
|
+
return [...this.backups.values()].map((backup) => ({ ...backup }));
|
|
53
|
+
}
|
|
54
|
+
assertRollbackAvailable(backupIds) {
|
|
55
|
+
const missing = backupIds.filter((backupId) => !this.backups.has(backupId));
|
|
56
|
+
if (missing.length > 0) {
|
|
57
|
+
throw new Error(`Missing backup records: ${missing.join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=backup-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-manager.js","sourceRoot":"","sources":["../src/backup-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BatchRequest, CompiledBatch } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export interface BatchCompilerOptions {
|
|
3
|
+
now?: () => string;
|
|
4
|
+
}
|
|
5
|
+
export declare class BatchCompiler {
|
|
6
|
+
private readonly options;
|
|
7
|
+
constructor(options?: BatchCompilerOptions);
|
|
8
|
+
compile(request: BatchRequest): CompiledBatch;
|
|
9
|
+
private now;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=batch-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-compiler.d.ts","sourceRoot":"","sources":["../src/batch-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,wCAAwC,CAAC;AAYhD,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,oBAAyB;IAE/D,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa;IA2C7C,OAAO,CAAC,GAAG;CAGZ"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createRangeFingerprint } from "./fingerprint.js";
|
|
2
|
+
import { cellCount } from "./range-address.js";
|
|
3
|
+
const DESTRUCTIVE_RANK = {
|
|
4
|
+
none: 0,
|
|
5
|
+
values: 1,
|
|
6
|
+
format: 2,
|
|
7
|
+
structure: 3,
|
|
8
|
+
workbook: 4
|
|
9
|
+
};
|
|
10
|
+
export class BatchCompiler {
|
|
11
|
+
options;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
}
|
|
15
|
+
compile(request) {
|
|
16
|
+
const requiredBackups = new Set();
|
|
17
|
+
const targetFingerprints = [];
|
|
18
|
+
let estimatedCellsTouched = 0;
|
|
19
|
+
let destructiveLevel = "none";
|
|
20
|
+
for (const operation of request.operations) {
|
|
21
|
+
destructiveLevel = maxDestructiveLevel(destructiveLevel, operation.destructiveLevel);
|
|
22
|
+
if (operation.kind.startsWith("range.")) {
|
|
23
|
+
requiredBackups.add("region");
|
|
24
|
+
}
|
|
25
|
+
if (operation.kind === "sheet.delete") {
|
|
26
|
+
requiredBackups.add("workbook-copy");
|
|
27
|
+
}
|
|
28
|
+
if (operation.kind === "sheet.clear") {
|
|
29
|
+
requiredBackups.add("sheet");
|
|
30
|
+
}
|
|
31
|
+
if (operation.kind === "template.create_sheet_from_template") {
|
|
32
|
+
requiredBackups.add("sheet");
|
|
33
|
+
requiredBackups.add("workbook-copy");
|
|
34
|
+
}
|
|
35
|
+
if (operation.destructiveLevel === "structure" || operation.destructiveLevel === "workbook") {
|
|
36
|
+
requiredBackups.add("workbook-copy");
|
|
37
|
+
}
|
|
38
|
+
const target = getOperationTarget(operation);
|
|
39
|
+
if (target) {
|
|
40
|
+
estimatedCellsTouched += cellCount(target.address);
|
|
41
|
+
targetFingerprints.push(createRangeFingerprint(target, { pending: operation.kind }, this.now()));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
workbookId: request.workbookId,
|
|
46
|
+
operations: request.operations,
|
|
47
|
+
requiredBackups: [...requiredBackups],
|
|
48
|
+
targetFingerprints,
|
|
49
|
+
estimatedCellsTouched,
|
|
50
|
+
destructiveLevel
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
now() {
|
|
54
|
+
return this.options.now?.() ?? new Date().toISOString();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function maxDestructiveLevel(left, right) {
|
|
58
|
+
return DESTRUCTIVE_RANK[right] > DESTRUCTIVE_RANK[left] ? right : left;
|
|
59
|
+
}
|
|
60
|
+
function getOperationTarget(operation) {
|
|
61
|
+
switch (operation.kind) {
|
|
62
|
+
case "range.read_full":
|
|
63
|
+
case "range.write_values":
|
|
64
|
+
case "range.write_formulas":
|
|
65
|
+
case "range.write_number_formats":
|
|
66
|
+
case "range.write_styles":
|
|
67
|
+
case "range.write_hyperlinks":
|
|
68
|
+
case "range.write_comments":
|
|
69
|
+
case "range.clear":
|
|
70
|
+
case "range.clear_values":
|
|
71
|
+
case "range.clear_formats":
|
|
72
|
+
case "range.clear_values_keep_format":
|
|
73
|
+
case "range.insert_rows":
|
|
74
|
+
case "range.delete_rows":
|
|
75
|
+
case "range.insert_columns":
|
|
76
|
+
case "range.delete_columns":
|
|
77
|
+
case "range.autofit_columns":
|
|
78
|
+
case "range.autofit_rows":
|
|
79
|
+
case "range.merge":
|
|
80
|
+
case "range.unmerge":
|
|
81
|
+
case "range.restore_snapshot":
|
|
82
|
+
return operation.target;
|
|
83
|
+
case "range.copy":
|
|
84
|
+
case "range.move":
|
|
85
|
+
return operation.source;
|
|
86
|
+
case "template.create_sheet_from_template":
|
|
87
|
+
case "workbook.calculate":
|
|
88
|
+
case "workbook.save":
|
|
89
|
+
case "sheet.create":
|
|
90
|
+
case "sheet.copy":
|
|
91
|
+
case "sheet.rename":
|
|
92
|
+
case "sheet.delete":
|
|
93
|
+
case "sheet.move":
|
|
94
|
+
case "sheet.hide":
|
|
95
|
+
case "sheet.unhide":
|
|
96
|
+
case "sheet.protect":
|
|
97
|
+
case "sheet.unprotect":
|
|
98
|
+
case "sheet.clear":
|
|
99
|
+
case "sheet.set_tab_color":
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=batch-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-compiler.js","sourceRoot":"","sources":["../src/batch-compiler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,gBAAgB,GAAqC;IACzD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;CACZ,CAAC;AAMF,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAEnE,OAAO,CAAC,OAAqB;QAC3B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAwC,CAAC;QACxE,MAAM,kBAAkB,GAAuB,EAAE,CAAC;QAClD,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAC9B,IAAI,gBAAgB,GAAqB,MAAM,CAAC;QAEhD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,gBAAgB,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAErF,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACtC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACrC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,qCAAqC,EAAE,CAAC;gBAC7D,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7B,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,SAAS,CAAC,gBAAgB,KAAK,WAAW,IAAI,SAAS,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;gBAC5F,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,qBAAqB,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnD,kBAAkB,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,eAAe,EAAE,CAAC,GAAG,eAAe,CAAC;YACrC,kBAAkB;YAClB,qBAAqB;YACrB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAEO,GAAG;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,IAAsB,EAAE,KAAuB;IAC1E,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAyB;IACnD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,iBAAiB,CAAC;QACvB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,4BAA4B,CAAC;QAClC,KAAK,oBAAoB,CAAC;QAC1B,KAAK,wBAAwB,CAAC;QAC9B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,aAAa,CAAC;QACnB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,gCAAgC,CAAC;QACtC,KAAK,mBAAmB,CAAC;QACzB,KAAK,mBAAmB,CAAC;QACzB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,uBAAuB,CAAC;QAC7B,KAAK,oBAAoB,CAAC;QAC1B,KAAK,aAAa,CAAC;QACnB,KAAK,eAAe,CAAC;QACrB,KAAK,wBAAwB;YAC3B,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,KAAK,qCAAqC,CAAC;QAC3C,KAAK,oBAAoB,CAAC;QAC1B,KAAK,eAAe,CAAC;QACrB,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc,CAAC;QACpB,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc,CAAC;QACpB,KAAK,eAAe,CAAC;QACrB,KAAK,iBAAiB,CAAC;QACvB,KAAK,aAAa,CAAC;QACnB,KAAK,qBAAqB;YACxB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;CACb;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAiBpG"}
|
package/dist/chunking.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function chunkMatrixRows(matrix, maxCellsPerChunk) {
|
|
2
|
+
if (matrix.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
const columnCount = matrix[0]?.length ?? 0;
|
|
6
|
+
if (columnCount === 0 || matrix.some((row) => row.length !== columnCount)) {
|
|
7
|
+
throw new Error("Matrix must be rectangular and contain at least one column.");
|
|
8
|
+
}
|
|
9
|
+
const rowChunkSize = Math.max(1, Math.floor(maxCellsPerChunk / columnCount));
|
|
10
|
+
const chunks = [];
|
|
11
|
+
for (let rowOffset = 0; rowOffset < matrix.length; rowOffset += rowChunkSize) {
|
|
12
|
+
chunks.push({
|
|
13
|
+
rowOffset,
|
|
14
|
+
rows: matrix.slice(rowOffset, rowOffset + rowChunkSize)
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return chunks;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=chunking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAI,MAAa,EAAE,gBAAwB;IACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3C,IAAI,WAAW,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,IAAI,YAAY,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC;YACV,SAAS;YACT,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ConflictRecord, ConflictResolutionGuidance, TransactionRollbackConflict, TransactionId, WorkbookId, WorkbookScope } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export type DependencyConflictCode = "STRUCTURE_CONFLICT" | "TABLE_CONFLICT" | "FORMULA_DEPENDENCY_CONFLICT" | "DERIVED_OBJECT_CONFLICT" | "NAMED_RANGE_CONFLICT" | "LOCK_CONFLICT";
|
|
3
|
+
export interface ClassifiedScopeConflict {
|
|
4
|
+
code: DependencyConflictCode;
|
|
5
|
+
message: string;
|
|
6
|
+
scopes: WorkbookScope[];
|
|
7
|
+
suggestedAction: "wait_for_lock" | "refresh_plan" | "rebase_plan" | "split_scope" | "manual_review";
|
|
8
|
+
}
|
|
9
|
+
export declare function classifyScopeConflict(left: WorkbookScope, right: WorkbookScope): ClassifiedScopeConflict | undefined;
|
|
10
|
+
export declare function makeLockConflict(input: {
|
|
11
|
+
workbookId: WorkbookId;
|
|
12
|
+
left: WorkbookScope;
|
|
13
|
+
right: WorkbookScope;
|
|
14
|
+
ownerAgentId?: ConflictRecord["ownerAgentId"];
|
|
15
|
+
taskId?: ConflictRecord["taskId"];
|
|
16
|
+
transactionId?: ConflictRecord["transactionId"];
|
|
17
|
+
}): ConflictRecord | undefined;
|
|
18
|
+
export declare function makeRollbackConflict(input: {
|
|
19
|
+
transactionId: TransactionId;
|
|
20
|
+
conflictingTransactionId: TransactionId;
|
|
21
|
+
left: WorkbookScope;
|
|
22
|
+
right: WorkbookScope;
|
|
23
|
+
}): TransactionRollbackConflict | undefined;
|
|
24
|
+
export declare function makeConflictGuidance(conflict: ConflictRecord): ConflictResolutionGuidance;
|
|
25
|
+
export declare function attachConflictGuidance(conflict: ConflictRecord): ConflictRecord;
|
|
26
|
+
//# sourceMappingURL=conflicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../src/conflicts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,0BAA0B,EAE1B,2BAA2B,EAC3B,aAAa,EACb,UAAU,EACV,aAAa,EACd,MAAM,wCAAwC,CAAC;AAIhD,MAAM,MAAM,sBAAsB,GAC9B,oBAAoB,GACpB,gBAAgB,GAChB,6BAA6B,GAC7B,yBAAyB,GACzB,sBAAsB,GACtB,eAAe,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,eAAe,EAAE,eAAe,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;CACrG;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,uBAAuB,GAAG,SAAS,CAWpH;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CACjD,GAAG,cAAc,GAAG,SAAS,CAyB7B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,wBAAwB,EAAE,aAAa,CAAC;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACtB,GAAG,2BAA2B,GAAG,SAAS,CAa1C;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,0BAA0B,CA0BzF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,CAK/E"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { makeId } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
import { scopesConflict } from "./lock-manager.js";
|
|
3
|
+
export function classifyScopeConflict(left, right) {
|
|
4
|
+
if (!scopesConflict(left, right)) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const code = conflictCode(left, right);
|
|
8
|
+
return {
|
|
9
|
+
code,
|
|
10
|
+
message: conflictMessage(code, left, right),
|
|
11
|
+
scopes: [left, right],
|
|
12
|
+
suggestedAction: code === "LOCK_CONFLICT" ? "wait_for_lock" : "manual_review"
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function makeLockConflict(input) {
|
|
16
|
+
const classified = classifyScopeConflict(input.left, input.right);
|
|
17
|
+
if (!classified) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const conflict = {
|
|
21
|
+
conflictId: makeId("conflict"),
|
|
22
|
+
code: classified.code,
|
|
23
|
+
message: classified.message,
|
|
24
|
+
workbookId: input.workbookId,
|
|
25
|
+
scopes: classified.scopes,
|
|
26
|
+
retryable: true,
|
|
27
|
+
suggestedAction: classified.suggestedAction,
|
|
28
|
+
createdAt: new Date().toISOString()
|
|
29
|
+
};
|
|
30
|
+
if (input.ownerAgentId !== undefined) {
|
|
31
|
+
conflict.ownerAgentId = input.ownerAgentId;
|
|
32
|
+
}
|
|
33
|
+
if (input.taskId !== undefined) {
|
|
34
|
+
conflict.taskId = input.taskId;
|
|
35
|
+
}
|
|
36
|
+
if (input.transactionId !== undefined) {
|
|
37
|
+
conflict.transactionId = input.transactionId;
|
|
38
|
+
}
|
|
39
|
+
return conflict;
|
|
40
|
+
}
|
|
41
|
+
export function makeRollbackConflict(input) {
|
|
42
|
+
const classified = classifyScopeConflict(input.left, input.right);
|
|
43
|
+
if (!classified) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
code: rollbackCode(classified.code),
|
|
48
|
+
message: `Rollback would conflict with later transaction ${input.conflictingTransactionId}: ${classified.message}`,
|
|
49
|
+
transactionId: input.transactionId,
|
|
50
|
+
conflictingTransactionId: input.conflictingTransactionId,
|
|
51
|
+
scopes: classified.scopes,
|
|
52
|
+
suggestedAction: "manual_review"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function makeConflictGuidance(conflict) {
|
|
56
|
+
const primaryAction = primaryActionForConflict(conflict);
|
|
57
|
+
const guidance = {
|
|
58
|
+
code: conflict.code,
|
|
59
|
+
severity: severityForConflict(conflict),
|
|
60
|
+
retryable: conflict.retryable,
|
|
61
|
+
primaryAction,
|
|
62
|
+
scopes: conflict.scopes,
|
|
63
|
+
steps: guidanceSteps(conflict, primaryAction)
|
|
64
|
+
};
|
|
65
|
+
if (conflict.lockExpiresAt !== undefined) {
|
|
66
|
+
guidance.nextRetryAt = conflict.lockExpiresAt;
|
|
67
|
+
}
|
|
68
|
+
if (conflict.ownerAgentId !== undefined) {
|
|
69
|
+
guidance.ownerAgentId = conflict.ownerAgentId;
|
|
70
|
+
}
|
|
71
|
+
if (conflict.taskId !== undefined) {
|
|
72
|
+
guidance.taskId = conflict.taskId;
|
|
73
|
+
}
|
|
74
|
+
if (conflict.transactionId !== undefined) {
|
|
75
|
+
guidance.transactionId = conflict.transactionId;
|
|
76
|
+
}
|
|
77
|
+
if (conflict.lockId !== undefined) {
|
|
78
|
+
guidance.lockId = conflict.lockId;
|
|
79
|
+
}
|
|
80
|
+
return guidance;
|
|
81
|
+
}
|
|
82
|
+
export function attachConflictGuidance(conflict) {
|
|
83
|
+
return {
|
|
84
|
+
...conflict,
|
|
85
|
+
guidance: makeConflictGuidance(conflict)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function conflictCode(left, right) {
|
|
89
|
+
if (left.type === "workbook" || right.type === "workbook" || left.type === "sheet" || right.type === "sheet") {
|
|
90
|
+
return "STRUCTURE_CONFLICT";
|
|
91
|
+
}
|
|
92
|
+
if (left.type === "table" || right.type === "table") {
|
|
93
|
+
return "TABLE_CONFLICT";
|
|
94
|
+
}
|
|
95
|
+
if (left.type === "formula" || right.type === "formula") {
|
|
96
|
+
return "FORMULA_DEPENDENCY_CONFLICT";
|
|
97
|
+
}
|
|
98
|
+
if (left.type === "chart" || left.type === "pivot" || right.type === "chart" || right.type === "pivot") {
|
|
99
|
+
return "DERIVED_OBJECT_CONFLICT";
|
|
100
|
+
}
|
|
101
|
+
if (left.type === "named_range" || right.type === "named_range") {
|
|
102
|
+
return "NAMED_RANGE_CONFLICT";
|
|
103
|
+
}
|
|
104
|
+
if (left.type === "range" && right.type === "range") {
|
|
105
|
+
return "LOCK_CONFLICT";
|
|
106
|
+
}
|
|
107
|
+
return "FORMULA_DEPENDENCY_CONFLICT";
|
|
108
|
+
}
|
|
109
|
+
function rollbackCode(code) {
|
|
110
|
+
if (code === "FORMULA_DEPENDENCY_CONFLICT" || code === "DERIVED_OBJECT_CONFLICT" || code === "NAMED_RANGE_CONFLICT" || code === "TABLE_CONFLICT") {
|
|
111
|
+
return "ROLLBACK_DEPENDENCY_CONFLICT";
|
|
112
|
+
}
|
|
113
|
+
return "ROLLBACK_CONFLICT";
|
|
114
|
+
}
|
|
115
|
+
function conflictMessage(code, left, right) {
|
|
116
|
+
switch (code) {
|
|
117
|
+
case "STRUCTURE_CONFLICT":
|
|
118
|
+
return `${describeScope(left)} conflicts with workbook or sheet structure scope ${describeScope(right)}.`;
|
|
119
|
+
case "TABLE_CONFLICT":
|
|
120
|
+
return `${describeScope(left)} conflicts with table scope ${describeScope(right)}.`;
|
|
121
|
+
case "DERIVED_OBJECT_CONFLICT":
|
|
122
|
+
return `${describeScope(left)} conflicts with derived object scope ${describeScope(right)}.`;
|
|
123
|
+
case "NAMED_RANGE_CONFLICT":
|
|
124
|
+
return `${describeScope(left)} conflicts with named range scope ${describeScope(right)}.`;
|
|
125
|
+
case "FORMULA_DEPENDENCY_CONFLICT":
|
|
126
|
+
return `${describeScope(left)} may affect formula dependencies in ${describeScope(right)}.`;
|
|
127
|
+
case "LOCK_CONFLICT":
|
|
128
|
+
return `${describeScope(left)} overlaps ${describeScope(right)}.`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function primaryActionForConflict(conflict) {
|
|
132
|
+
if (conflict.code === "LOCK_CONFLICT") {
|
|
133
|
+
return conflict.lockExpiresAt ? "retry_after" : "wait_for_lock";
|
|
134
|
+
}
|
|
135
|
+
if (conflict.code === "TARGET_REGION_CHANGED") {
|
|
136
|
+
return "refresh_plan";
|
|
137
|
+
}
|
|
138
|
+
if (conflict.code === "ROLLBACK_CONFLICT" || conflict.code === "ROLLBACK_DEPENDENCY_CONFLICT") {
|
|
139
|
+
return "preview_rollback_chain";
|
|
140
|
+
}
|
|
141
|
+
if (conflict.code === "ROLLBACK_UNAVAILABLE") {
|
|
142
|
+
return "repair_from_backup";
|
|
143
|
+
}
|
|
144
|
+
if (conflict.code === "STRUCTURE_CONFLICT") {
|
|
145
|
+
return "manual_review";
|
|
146
|
+
}
|
|
147
|
+
if (conflict.code === "TABLE_CONFLICT" || conflict.code === "FORMULA_DEPENDENCY_CONFLICT" || conflict.code === "DERIVED_OBJECT_CONFLICT" || conflict.code === "NAMED_RANGE_CONFLICT") {
|
|
148
|
+
return "handoff_task";
|
|
149
|
+
}
|
|
150
|
+
return conflict.suggestedAction;
|
|
151
|
+
}
|
|
152
|
+
function severityForConflict(conflict) {
|
|
153
|
+
if (!conflict.retryable || conflict.code === "STRUCTURE_CONFLICT" || conflict.code === "ROLLBACK_UNAVAILABLE") {
|
|
154
|
+
return "blocked";
|
|
155
|
+
}
|
|
156
|
+
if (conflict.code === "LOCK_CONFLICT" || conflict.code === "TARGET_REGION_CHANGED") {
|
|
157
|
+
return "warning";
|
|
158
|
+
}
|
|
159
|
+
return "blocked";
|
|
160
|
+
}
|
|
161
|
+
function guidanceSteps(conflict, primaryAction) {
|
|
162
|
+
const steps = [];
|
|
163
|
+
if (primaryAction === "retry_after" || primaryAction === "wait_for_lock") {
|
|
164
|
+
steps.push({
|
|
165
|
+
action: primaryAction,
|
|
166
|
+
title: conflict.lockExpiresAt ? "Wait for lock expiry" : "Wait for active lock",
|
|
167
|
+
description: conflict.lockExpiresAt
|
|
168
|
+
? `Retry after ${conflict.lockExpiresAt}, or coordinate with the lock owner if the task is urgent.`
|
|
169
|
+
: "Wait for the active lock to be released, then evaluate the task schedule again.",
|
|
170
|
+
toolName: "excel.task.evaluate_schedule",
|
|
171
|
+
arguments: { workbookId: conflict.workbookId }
|
|
172
|
+
});
|
|
173
|
+
if (conflict.lockId !== undefined) {
|
|
174
|
+
steps.push({
|
|
175
|
+
action: "renew_or_release_lock",
|
|
176
|
+
title: "Coordinate lock ownership",
|
|
177
|
+
description: "Ask the lock owner to renew if still working or release the lock if the reserved work is done.",
|
|
178
|
+
toolName: "excel.lock.release",
|
|
179
|
+
arguments: { lockIds: [conflict.lockId] }
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (conflict.taskId !== undefined) {
|
|
184
|
+
steps.push({
|
|
185
|
+
action: "handoff_task",
|
|
186
|
+
title: "Coordinate with task owner",
|
|
187
|
+
description: "Review the owning task before retrying so two agents do not overwrite the same workbook area.",
|
|
188
|
+
toolName: "excel.task.get",
|
|
189
|
+
arguments: { taskId: conflict.taskId }
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (canSuggestSplit(conflict)) {
|
|
193
|
+
steps.push({
|
|
194
|
+
action: "split_scope",
|
|
195
|
+
title: "Split non-overlapping work",
|
|
196
|
+
description: "Create a narrower task or plan that excludes the conflicting range/table/object scope.",
|
|
197
|
+
toolName: "excel.task.create",
|
|
198
|
+
arguments: { workbookId: conflict.workbookId, allowedScopes: conflict.scopes }
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (primaryAction === "refresh_plan") {
|
|
202
|
+
steps.push({
|
|
203
|
+
action: "refresh_plan",
|
|
204
|
+
title: "Refresh plan preview",
|
|
205
|
+
description: "Refresh the plan preview and recreate the plan if target fingerprints changed.",
|
|
206
|
+
toolName: "excel.plan.refresh_preview"
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (primaryAction === "preview_rollback_chain") {
|
|
210
|
+
steps.push({
|
|
211
|
+
action: "preview_rollback_chain",
|
|
212
|
+
title: "Preview rollback chain",
|
|
213
|
+
description: "Check whether later dependent transactions must be rolled back together.",
|
|
214
|
+
toolName: "excel.transaction.preview_rollback_chain",
|
|
215
|
+
arguments: conflict.transactionId ? { transactionId: conflict.transactionId } : undefined
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (primaryAction === "repair_from_backup") {
|
|
219
|
+
steps.push({
|
|
220
|
+
action: "repair_from_backup",
|
|
221
|
+
title: "Repair from backup",
|
|
222
|
+
description: "Use backup or template repair because this conflict cannot be resolved through transaction rollback metadata."
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
steps.push({
|
|
226
|
+
action: "manual_review",
|
|
227
|
+
title: "Manual review",
|
|
228
|
+
description: "If scope splitting or waiting is unsafe, ask the user to choose the winning change before applying more workbook mutations."
|
|
229
|
+
});
|
|
230
|
+
return dedupeSteps(steps);
|
|
231
|
+
}
|
|
232
|
+
function canSuggestSplit(conflict) {
|
|
233
|
+
return conflict.scopes.some((scope) => scope.type === "range" || scope.type === "table") && conflict.code !== "STRUCTURE_CONFLICT";
|
|
234
|
+
}
|
|
235
|
+
function dedupeSteps(steps) {
|
|
236
|
+
const seen = new Set();
|
|
237
|
+
const deduped = [];
|
|
238
|
+
for (const step of steps) {
|
|
239
|
+
const key = `${step.action}:${step.toolName ?? ""}:${JSON.stringify(step.arguments ?? {})}`;
|
|
240
|
+
if (!seen.has(key)) {
|
|
241
|
+
seen.add(key);
|
|
242
|
+
deduped.push(step);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return deduped;
|
|
246
|
+
}
|
|
247
|
+
function describeScope(scope) {
|
|
248
|
+
switch (scope.type) {
|
|
249
|
+
case "workbook":
|
|
250
|
+
return "workbook";
|
|
251
|
+
case "sheet":
|
|
252
|
+
return `${scope.sheetName}`;
|
|
253
|
+
case "range":
|
|
254
|
+
return `${scope.sheetName}!${scope.address}`;
|
|
255
|
+
case "formula":
|
|
256
|
+
return `formulas ${scope.sheetName}${scope.address ? `!${scope.address}` : ""}`;
|
|
257
|
+
case "table":
|
|
258
|
+
return `table ${scope.tableName}`;
|
|
259
|
+
case "named_range":
|
|
260
|
+
return `named range ${scope.name}`;
|
|
261
|
+
case "chart":
|
|
262
|
+
return `chart ${scope.chartName}`;
|
|
263
|
+
case "pivot":
|
|
264
|
+
return `pivot ${scope.pivotName}`;
|
|
265
|
+
case "template":
|
|
266
|
+
return `template ${scope.templateId}`;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=conflicts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../src/conflicts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { A1Range, RangeFingerprint, WorkbookFingerprint, WorkbookId } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export declare function createRangeFingerprint(range: A1Range, payload: unknown, capturedAt?: string): RangeFingerprint;
|
|
3
|
+
export declare function createWorkbookFingerprint(workbookId: WorkbookId, workbookPayload: unknown, structurePayload: unknown, capturedAt?: string): WorkbookFingerprint;
|
|
4
|
+
export declare function hashStable(value: unknown): string;
|
|
5
|
+
export declare function stableStringify(value: unknown): string;
|
|
6
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAGzH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,SAA2B,GAAG,gBAAgB,CAOhI;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,OAAO,EACxB,gBAAgB,EAAE,OAAO,EACzB,UAAU,SAA2B,GACpC,mBAAmB,CAOrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CActD"}
|