@superdoc-dev/cli 0.5.0-next.14 → 0.5.0-next.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +1986 -258
  2. package/package.json +8 -8
  3. package/skill/SKILL.md +62 -6
package/dist/index.js CHANGED
@@ -141,6 +141,7 @@ function parseGlobalArgs(argv) {
141
141
  let prettyFlag = false;
142
142
  let timeoutMs;
143
143
  let sessionId;
144
+ let quiet = false;
144
145
  let help = false;
145
146
  let version2 = false;
146
147
  const rest = [];
@@ -162,6 +163,10 @@ function parseGlobalArgs(argv) {
162
163
  help = true;
163
164
  continue;
164
165
  }
166
+ if (token === "--quiet") {
167
+ quiet = true;
168
+ continue;
169
+ }
165
170
  if (token === "--version" || token === "-v") {
166
171
  version2 = true;
167
172
  continue;
@@ -221,6 +226,7 @@ function parseGlobalArgs(argv) {
221
226
  output,
222
227
  timeoutMs,
223
228
  sessionId,
229
+ quiet,
224
230
  help,
225
231
  version: version2
226
232
  },
@@ -1211,7 +1217,7 @@ function formatInlineAliasExpectedResult(key) {
1211
1217
  function projectFromDefinitions(fn) {
1212
1218
  return Object.fromEntries(OPERATION_IDS.map((id) => [id, fn(id, OPERATION_DEFINITIONS[id])]));
1213
1219
  }
1214
- var NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1220
+ var NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, T_PROTECTION_READ, T_PROTECTION_MUTATION, T_PERM_RANGE_READ, T_PERM_RANGE_MUTATION, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1215
1221
  var init_operation_definitions = __esm(() => {
1216
1222
  init_inline_run_patch();
1217
1223
  NONE_FAILURES = [];
@@ -1287,6 +1293,15 @@ var init_operation_definitions = __esm(() => {
1287
1293
  T_REF_MUTATION = ["TARGET_NOT_FOUND", "INVALID_TARGET", "INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1288
1294
  T_REF_MUTATION_REMOVE = ["TARGET_NOT_FOUND", "INVALID_TARGET", "CAPABILITY_UNAVAILABLE"];
1289
1295
  T_REF_INSERT = ["TARGET_NOT_FOUND", "INVALID_TARGET", "INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1296
+ T_PROTECTION_READ = ["CAPABILITY_UNAVAILABLE"];
1297
+ T_PROTECTION_MUTATION = ["INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1298
+ T_PERM_RANGE_READ = ["TARGET_NOT_FOUND", "CAPABILITY_UNAVAILABLE"];
1299
+ T_PERM_RANGE_MUTATION = [
1300
+ "TARGET_NOT_FOUND",
1301
+ "INVALID_TARGET",
1302
+ "INVALID_INPUT",
1303
+ "CAPABILITY_UNAVAILABLE"
1304
+ ];
1290
1305
  FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS = Object.fromEntries(INLINE_PROPERTY_REGISTRY.map((entry) => {
1291
1306
  const operationId = `format.${entry.key}`;
1292
1307
  const definition = {
@@ -6184,6 +6199,116 @@ var init_operation_definitions = __esm(() => {
6184
6199
  referenceDocPath: "diff/apply.mdx",
6185
6200
  referenceGroup: "diff",
6186
6201
  skipAsATool: true
6202
+ },
6203
+ "protection.get": {
6204
+ memberPath: "protection.get",
6205
+ description: "Read the current document protection state including editing restrictions, write protection, and read-only recommendation.",
6206
+ expectedResult: "Returns a DocumentProtectionState with editingRestriction, writeProtection, and readOnlyRecommended fields.",
6207
+ requiresDocumentContext: true,
6208
+ metadata: readOperation({ throws: T_PROTECTION_READ }),
6209
+ referenceDocPath: "protection/get.mdx",
6210
+ referenceGroup: "protection",
6211
+ skipAsATool: true
6212
+ },
6213
+ "protection.setEditingRestriction": {
6214
+ memberPath: "protection.setEditingRestriction",
6215
+ description: "Enable Word-style editing restriction on the document. Only readOnly mode is supported in v1.",
6216
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
6217
+ requiresDocumentContext: true,
6218
+ metadata: mutationOperation({
6219
+ idempotency: "idempotent",
6220
+ supportsDryRun: true,
6221
+ supportsTrackedMode: false,
6222
+ possibleFailureCodes: ["NO_OP"],
6223
+ throws: T_PROTECTION_MUTATION
6224
+ }),
6225
+ referenceDocPath: "protection/set-editing-restriction.mdx",
6226
+ referenceGroup: "protection",
6227
+ skipAsATool: true
6228
+ },
6229
+ "protection.clearEditingRestriction": {
6230
+ memberPath: "protection.clearEditingRestriction",
6231
+ description: "Disable document-level editing restriction by setting enforcement to off. Preserves the protection element and its metadata for round-trip fidelity.",
6232
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
6233
+ requiresDocumentContext: true,
6234
+ metadata: mutationOperation({
6235
+ idempotency: "idempotent",
6236
+ supportsDryRun: true,
6237
+ supportsTrackedMode: false,
6238
+ possibleFailureCodes: ["NO_OP"],
6239
+ throws: T_PROTECTION_MUTATION
6240
+ }),
6241
+ referenceDocPath: "protection/clear-editing-restriction.mdx",
6242
+ referenceGroup: "protection",
6243
+ skipAsATool: true
6244
+ },
6245
+ "permissionRanges.list": {
6246
+ memberPath: "permissionRanges.list",
6247
+ description: "List all permission ranges in the document. Returns only complete paired ranges (both start and end markers present).",
6248
+ expectedResult: "Returns a PermissionRangesListResult containing discovered permission ranges with principal and position data.",
6249
+ requiresDocumentContext: true,
6250
+ metadata: readOperation({ throws: T_PERM_RANGE_READ }),
6251
+ referenceDocPath: "permission-ranges/list.mdx",
6252
+ referenceGroup: "permissionRanges",
6253
+ skipAsATool: true
6254
+ },
6255
+ "permissionRanges.get": {
6256
+ memberPath: "permissionRanges.get",
6257
+ description: "Get detailed information about a specific permission range by ID.",
6258
+ expectedResult: "Returns a PermissionRangeInfo object with the range principal, kind, and positions.",
6259
+ requiresDocumentContext: true,
6260
+ metadata: readOperation({ throws: T_PERM_RANGE_READ }),
6261
+ referenceDocPath: "permission-ranges/get.mdx",
6262
+ referenceGroup: "permissionRanges",
6263
+ skipAsATool: true
6264
+ },
6265
+ "permissionRanges.create": {
6266
+ memberPath: "permissionRanges.create",
6267
+ description: "Create a permission range exception region in the document. Inserts matched permStart/permEnd markers at the target.",
6268
+ expectedResult: "Returns a PermissionRangeMutationResult with the created range info on success.",
6269
+ requiresDocumentContext: true,
6270
+ metadata: mutationOperation({
6271
+ idempotency: "non-idempotent",
6272
+ supportsDryRun: true,
6273
+ supportsTrackedMode: false,
6274
+ possibleFailureCodes: NONE_FAILURES,
6275
+ throws: T_PERM_RANGE_MUTATION
6276
+ }),
6277
+ referenceDocPath: "permission-ranges/create.mdx",
6278
+ referenceGroup: "permissionRanges",
6279
+ skipAsATool: true
6280
+ },
6281
+ "permissionRanges.remove": {
6282
+ memberPath: "permissionRanges.remove",
6283
+ description: "Remove a permission range by ID. Removes whichever markers exist for the given ID (start, end, or both).",
6284
+ expectedResult: "Returns a PermissionRangeRemoveResult indicating success or a failure.",
6285
+ requiresDocumentContext: true,
6286
+ metadata: mutationOperation({
6287
+ idempotency: "idempotent",
6288
+ supportsDryRun: true,
6289
+ supportsTrackedMode: false,
6290
+ possibleFailureCodes: NONE_FAILURES,
6291
+ throws: T_PERM_RANGE_MUTATION
6292
+ }),
6293
+ referenceDocPath: "permission-ranges/remove.mdx",
6294
+ referenceGroup: "permissionRanges",
6295
+ skipAsATool: true
6296
+ },
6297
+ "permissionRanges.updatePrincipal": {
6298
+ memberPath: "permissionRanges.updatePrincipal",
6299
+ description: "Change which principal is allowed to edit a permission range. Updates the principal fields on the start marker.",
6300
+ expectedResult: "Returns a PermissionRangeMutationResult with the updated range info on success.",
6301
+ requiresDocumentContext: true,
6302
+ metadata: mutationOperation({
6303
+ idempotency: "idempotent",
6304
+ supportsDryRun: true,
6305
+ supportsTrackedMode: false,
6306
+ possibleFailureCodes: NONE_FAILURES,
6307
+ throws: T_PERM_RANGE_MUTATION
6308
+ }),
6309
+ referenceDocPath: "permission-ranges/update-principal.mdx",
6310
+ referenceGroup: "permissionRanges",
6311
+ skipAsATool: true
6187
6312
  }
6188
6313
  };
6189
6314
  OPERATION_IDS = Object.freeze(Object.keys(OPERATION_DEFINITIONS));
@@ -12489,6 +12614,77 @@ var init_schemas = __esm(() => {
12489
12614
  output: diffApplyResultSchema,
12490
12615
  success: diffApplyResultSchema,
12491
12616
  failure: { type: "object" }
12617
+ },
12618
+ "protection.get": {
12619
+ input: objectSchema({}),
12620
+ output: objectSchema({
12621
+ editingRestriction: objectSchema({
12622
+ mode: { type: "string", enum: ["none", "readOnly", "comments", "trackedChanges", "forms"] },
12623
+ enforced: { type: "boolean" },
12624
+ runtimeEnforced: { type: "boolean" },
12625
+ passwordProtected: { type: "boolean" },
12626
+ formattingRestricted: { type: "boolean" }
12627
+ }, ["mode", "enforced", "runtimeEnforced", "passwordProtected", "formattingRestricted"]),
12628
+ writeProtection: objectSchema({
12629
+ enabled: { type: "boolean" },
12630
+ passwordProtected: { type: "boolean" }
12631
+ }, ["enabled", "passwordProtected"]),
12632
+ readOnlyRecommended: { type: "boolean" }
12633
+ }, ["editingRestriction", "writeProtection", "readOnlyRecommended"])
12634
+ },
12635
+ "protection.setEditingRestriction": {
12636
+ input: objectSchema({
12637
+ mode: { type: "string", enum: ["readOnly"] },
12638
+ formattingRestricted: { type: "boolean" }
12639
+ }, ["mode"]),
12640
+ output: { type: "object" },
12641
+ success: { type: "object" },
12642
+ failure: { type: "object" }
12643
+ },
12644
+ "protection.clearEditingRestriction": {
12645
+ input: objectSchema({}),
12646
+ output: { type: "object" },
12647
+ success: { type: "object" },
12648
+ failure: { type: "object" }
12649
+ },
12650
+ "permissionRanges.list": {
12651
+ input: refListQuerySchema,
12652
+ output: discoveryOutputSchema
12653
+ },
12654
+ "permissionRanges.get": {
12655
+ input: objectSchema({ id: { type: "string" } }, ["id"]),
12656
+ output: { type: "object" }
12657
+ },
12658
+ "permissionRanges.create": {
12659
+ input: objectSchema({
12660
+ target: selectionTargetSchema,
12661
+ principal: objectSchema({
12662
+ kind: { type: "string", enum: ["everyone", "editor"] },
12663
+ id: { type: "string" }
12664
+ }, ["kind"]),
12665
+ id: { type: "string" }
12666
+ }, ["target", "principal"]),
12667
+ output: { type: "object" },
12668
+ success: { type: "object" },
12669
+ failure: { type: "object" }
12670
+ },
12671
+ "permissionRanges.remove": {
12672
+ input: objectSchema({ id: { type: "string" } }, ["id"]),
12673
+ output: { type: "object" },
12674
+ success: { type: "object" },
12675
+ failure: { type: "object" }
12676
+ },
12677
+ "permissionRanges.updatePrincipal": {
12678
+ input: objectSchema({
12679
+ id: { type: "string" },
12680
+ principal: objectSchema({
12681
+ kind: { type: "string", enum: ["everyone", "editor"] },
12682
+ id: { type: "string" }
12683
+ }, ["kind"])
12684
+ }, ["id", "principal"]),
12685
+ output: { type: "object" },
12686
+ success: { type: "object" },
12687
+ failure: { type: "object" }
12492
12688
  }
12493
12689
  };
12494
12690
  });
@@ -12663,6 +12859,16 @@ var init_reference_doc_map = __esm(() => {
12663
12859
  title: "Diff",
12664
12860
  description: "Snapshot-based document comparison and replay.",
12665
12861
  pagePath: "diff/index.mdx"
12862
+ },
12863
+ protection: {
12864
+ title: "Protection",
12865
+ description: "Document-level protection state and editing restriction operations.",
12866
+ pagePath: "protection/index.mdx"
12867
+ },
12868
+ permissionRanges: {
12869
+ title: "Permission Ranges",
12870
+ description: "Permission range exception operations for protected documents.",
12871
+ pagePath: "permission-ranges/index.mdx"
12666
12872
  }
12667
12873
  };
12668
12874
  REFERENCE_OPERATION_GROUPS = Object.keys(GROUP_METADATA).map((key) => ({
@@ -15335,7 +15541,15 @@ function buildDispatchTable(api) {
15335
15541
  "authorities.entries.remove": (input, options) => api.authorities.entries.remove(input, options),
15336
15542
  "diff.capture": () => api.diff.capture(),
15337
15543
  "diff.compare": (input) => api.diff.compare(input),
15338
- "diff.apply": (input, options) => api.diff.apply(input, options)
15544
+ "diff.apply": (input, options) => api.diff.apply(input, options),
15545
+ "protection.get": (input) => api.protection.get(input),
15546
+ "protection.setEditingRestriction": (input, options) => api.protection.setEditingRestriction(input, options),
15547
+ "protection.clearEditingRestriction": (input, options) => api.protection.clearEditingRestriction(input, options),
15548
+ "permissionRanges.list": (input) => api.permissionRanges.list(input),
15549
+ "permissionRanges.get": (input) => api.permissionRanges.get(input),
15550
+ "permissionRanges.create": (input, options) => api.permissionRanges.create(input, options),
15551
+ "permissionRanges.remove": (input, options) => api.permissionRanges.remove(input, options),
15552
+ "permissionRanges.updatePrincipal": (input, options) => api.permissionRanges.updatePrincipal(input, options)
15339
15553
  };
15340
15554
  }
15341
15555
  var init_invoke = __esm(() => {
@@ -17123,6 +17337,90 @@ var init_bookmarks = __esm(() => {
17123
17337
  init_validation_primitives();
17124
17338
  });
17125
17339
 
17340
+ // ../../packages/document-api/src/protection/protection.ts
17341
+ function validateSetEditingRestrictionInput(input) {
17342
+ if (!input || typeof input !== "object") {
17343
+ throw new DocumentApiValidationError("INVALID_INPUT", "protection.setEditingRestriction requires an object with a mode property.");
17344
+ }
17345
+ const { mode } = input;
17346
+ if (!VALID_SET_MODES.has(mode)) {
17347
+ throw new DocumentApiValidationError("INVALID_INPUT", `protection.setEditingRestriction mode must be 'readOnly'. Received: '${String(mode)}'.`);
17348
+ }
17349
+ }
17350
+ function executeProtectionGet(adapter, _input) {
17351
+ return adapter.get();
17352
+ }
17353
+ function executeSetEditingRestriction(adapter, input, options) {
17354
+ validateSetEditingRestrictionInput(input);
17355
+ return adapter.setEditingRestriction(input, normalizeMutationOptions(options));
17356
+ }
17357
+ function executeClearEditingRestriction(adapter, _input, options) {
17358
+ return adapter.clearEditingRestriction(undefined, normalizeMutationOptions(options));
17359
+ }
17360
+ var VALID_SET_MODES;
17361
+ var init_protection = __esm(() => {
17362
+ init_errors2();
17363
+ VALID_SET_MODES = new Set(["readOnly"]);
17364
+ });
17365
+
17366
+ // ../../packages/document-api/src/permission-ranges/permission-ranges.ts
17367
+ function validatePrincipal(principal, operationName) {
17368
+ if (!principal || typeof principal !== "object") {
17369
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} requires a principal object with a 'kind' property.`);
17370
+ }
17371
+ const p = principal;
17372
+ if (p.kind === "everyone")
17373
+ return;
17374
+ if (p.kind === "editor") {
17375
+ if (typeof p.id !== "string" || p.id.length === 0) {
17376
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} editor principal requires a non-empty id string.`);
17377
+ }
17378
+ return;
17379
+ }
17380
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} principal kind must be 'everyone' or 'editor'. Received: '${String(p.kind)}'.`);
17381
+ }
17382
+ function requireNonEmptyId(id, operationName) {
17383
+ if (typeof id !== "string" || id.length === 0) {
17384
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} requires a non-empty id string.`);
17385
+ }
17386
+ }
17387
+ function executePermissionRangesList(adapter, input) {
17388
+ return adapter.list(input);
17389
+ }
17390
+ function executePermissionRangesGet(adapter, input) {
17391
+ requireNonEmptyId(input?.id, "permissionRanges.get");
17392
+ return adapter.get(input);
17393
+ }
17394
+ function executePermissionRangesCreate(adapter, input, options) {
17395
+ if (!input || typeof input !== "object") {
17396
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create requires an input object.");
17397
+ }
17398
+ const { target, principal } = input;
17399
+ if (!target || typeof target !== "object") {
17400
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create target must be a SelectionTarget object.");
17401
+ }
17402
+ if (target.kind !== "selection" || !target.start || !target.end) {
17403
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create target must have kind 'selection' with start and end points.");
17404
+ }
17405
+ validatePrincipal(principal, "permissionRanges.create");
17406
+ if (input.id !== undefined) {
17407
+ requireNonEmptyId(input.id, "permissionRanges.create");
17408
+ }
17409
+ return adapter.create(input, normalizeMutationOptions(options));
17410
+ }
17411
+ function executePermissionRangesRemove(adapter, input, options) {
17412
+ requireNonEmptyId(input?.id, "permissionRanges.remove");
17413
+ return adapter.remove(input, normalizeMutationOptions(options));
17414
+ }
17415
+ function executePermissionRangesUpdatePrincipal(adapter, input, options) {
17416
+ requireNonEmptyId(input?.id, "permissionRanges.updatePrincipal");
17417
+ validatePrincipal(input?.principal, "permissionRanges.updatePrincipal");
17418
+ return adapter.updatePrincipal(input, normalizeMutationOptions(options));
17419
+ }
17420
+ var init_permission_ranges = __esm(() => {
17421
+ init_errors2();
17422
+ });
17423
+
17126
17424
  // ../../packages/document-api/src/footnotes/footnotes.ts
17127
17425
  function validateFootnoteTarget(target, operationName) {
17128
17426
  assertTargetPresent(target, operationName);
@@ -17538,6 +17836,9 @@ var init_authorities = __esm(() => {
17538
17836
  init_create_location_validator();
17539
17837
  });
17540
17838
 
17839
+ // ../../packages/document-api/src/protection/protection.types.ts
17840
+ var init_protection_types = () => {};
17841
+
17541
17842
  // ../../packages/document-api/src/index.ts
17542
17843
  function executeQueryMatch(adapter, input) {
17543
17844
  if (!input || typeof input !== "object") {
@@ -18696,6 +18997,34 @@ function createDocumentApi(adapters) {
18696
18997
  return executeHistoryRedo(adapters.history);
18697
18998
  }
18698
18999
  },
19000
+ protection: {
19001
+ get(input) {
19002
+ return executeProtectionGet(adapters.protection, input);
19003
+ },
19004
+ setEditingRestriction(input, options) {
19005
+ return executeSetEditingRestriction(adapters.protection, input, options);
19006
+ },
19007
+ clearEditingRestriction(input, options) {
19008
+ return executeClearEditingRestriction(adapters.protection, input, options);
19009
+ }
19010
+ },
19011
+ permissionRanges: {
19012
+ list(input) {
19013
+ return executePermissionRangesList(adapters.permissionRanges, input);
19014
+ },
19015
+ get(input) {
19016
+ return executePermissionRangesGet(adapters.permissionRanges, input);
19017
+ },
19018
+ create(input, options) {
19019
+ return executePermissionRangesCreate(adapters.permissionRanges, input, options);
19020
+ },
19021
+ remove(input, options) {
19022
+ return executePermissionRangesRemove(adapters.permissionRanges, input, options);
19023
+ },
19024
+ updatePrincipal(input, options) {
19025
+ return executePermissionRangesUpdatePrincipal(adapters.permissionRanges, input, options);
19026
+ }
19027
+ },
18699
19028
  invoke(request) {
18700
19029
  if (!Object.prototype.hasOwnProperty.call(dispatch, request.operationId)) {
18701
19030
  throw new Error(`Unknown operationId: "${request.operationId}"`);
@@ -18740,6 +19069,8 @@ var init_src = __esm(() => {
18740
19069
  init_hyperlinks();
18741
19070
  init_content_controls();
18742
19071
  init_bookmarks();
19072
+ init_protection();
19073
+ init_permission_ranges();
18743
19074
  init_footnotes();
18744
19075
  init_cross_refs();
18745
19076
  init_index();
@@ -18761,6 +19092,7 @@ var init_src = __esm(() => {
18761
19092
  init_contract();
18762
19093
  init_capabilities();
18763
19094
  init_inline_semantics();
19095
+ init_protection_types();
18764
19096
  ADAPTER_GATED_PREFIXES = [
18765
19097
  "bookmarks",
18766
19098
  "footnotes",
@@ -41952,6 +42284,42 @@ var init_cli_only_operation_definitions = __esm(() => {
41952
42284
  required: ["contextId", "closed"]
41953
42285
  }
41954
42286
  },
42287
+ insertTab: {
42288
+ category: "core",
42289
+ description: "Insert a real Word tab node at a collapsed text insertion point. Accepts the same target/ref shortcuts as insert, but only for point inserts.",
42290
+ requiresDocumentContext: false,
42291
+ tokenOverride: ["insert", "tab"],
42292
+ sdkMetadata: { mutates: true, idempotency: "non-idempotent", supportsTrackedMode: false, supportsDryRun: false },
42293
+ outputSchema: {
42294
+ type: "object",
42295
+ properties: {
42296
+ document: { type: "object" },
42297
+ receipt: { type: "object" },
42298
+ inserted: { type: "object" },
42299
+ context: { type: "object" },
42300
+ output: { type: "object" }
42301
+ },
42302
+ required: ["receipt", "inserted"]
42303
+ }
42304
+ },
42305
+ insertLineBreak: {
42306
+ category: "core",
42307
+ description: "Insert a real Word line-break node at a collapsed text insertion point. Accepts the same target/ref shortcuts as insert, but only for point inserts.",
42308
+ requiresDocumentContext: false,
42309
+ tokenOverride: ["insert", "line-break"],
42310
+ sdkMetadata: { mutates: true, idempotency: "non-idempotent", supportsTrackedMode: false, supportsDryRun: false },
42311
+ outputSchema: {
42312
+ type: "object",
42313
+ properties: {
42314
+ document: { type: "object" },
42315
+ receipt: { type: "object" },
42316
+ inserted: { type: "object" },
42317
+ context: { type: "object" },
42318
+ output: { type: "object" }
42319
+ },
42320
+ required: ["receipt", "inserted"]
42321
+ }
42322
+ },
41955
42323
  status: {
41956
42324
  category: "session",
41957
42325
  description: "Show the current session status and document metadata.",
@@ -42156,6 +42524,8 @@ var init_types4 = __esm(() => {
42156
42524
  "open",
42157
42525
  "save",
42158
42526
  "close",
42527
+ "insertTab",
42528
+ "insertLineBreak",
42159
42529
  "status",
42160
42530
  "describe",
42161
42531
  "describeCommand",
@@ -62964,7 +63334,7 @@ var init_remark_gfm_z_sDF4ss_es = __esm(() => {
62964
63334
  emptyOptions2 = {};
62965
63335
  });
62966
63336
 
62967
- // ../../packages/superdoc/dist/chunks/SuperConverter-OPfy6vj2.es.js
63337
+ // ../../packages/superdoc/dist/chunks/SuperConverter-CMIR0kxi.es.js
62968
63338
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
62969
63339
  const fieldValue = extension$1.config[field];
62970
63340
  if (typeof fieldValue === "function")
@@ -67660,7 +68030,15 @@ function buildDispatchTable2(api) {
67660
68030
  "authorities.entries.remove": (input, options) => api.authorities.entries.remove(input, options),
67661
68031
  "diff.capture": () => api.diff.capture(),
67662
68032
  "diff.compare": (input) => api.diff.compare(input),
67663
- "diff.apply": (input, options) => api.diff.apply(input, options)
68033
+ "diff.apply": (input, options) => api.diff.apply(input, options),
68034
+ "protection.get": (input) => api.protection.get(input),
68035
+ "protection.setEditingRestriction": (input, options) => api.protection.setEditingRestriction(input, options),
68036
+ "protection.clearEditingRestriction": (input, options) => api.protection.clearEditingRestriction(input, options),
68037
+ "permissionRanges.list": (input) => api.permissionRanges.list(input),
68038
+ "permissionRanges.get": (input) => api.permissionRanges.get(input),
68039
+ "permissionRanges.create": (input, options) => api.permissionRanges.create(input, options),
68040
+ "permissionRanges.remove": (input, options) => api.permissionRanges.remove(input, options),
68041
+ "permissionRanges.updatePrincipal": (input, options) => api.permissionRanges.updatePrincipal(input, options)
67664
68042
  };
67665
68043
  }
67666
68044
  function executeHistoryGet2(adapter) {
@@ -69199,6 +69577,69 @@ function executeBookmarksRemove2(adapter, input, options) {
69199
69577
  validateBookmarkTarget2(input.target, "bookmarks.remove");
69200
69578
  return adapter.remove(input, normalizeMutationOptions2(options));
69201
69579
  }
69580
+ function validateSetEditingRestrictionInput2(input) {
69581
+ if (!input || typeof input !== "object")
69582
+ throw new DocumentApiValidationError2("INVALID_INPUT", "protection.setEditingRestriction requires an object with a mode property.");
69583
+ const { mode } = input;
69584
+ if (!VALID_SET_MODES2.has(mode))
69585
+ throw new DocumentApiValidationError2("INVALID_INPUT", `protection.setEditingRestriction mode must be 'readOnly'. Received: '${String(mode)}'.`);
69586
+ }
69587
+ function executeProtectionGet2(adapter, _input) {
69588
+ return adapter.get();
69589
+ }
69590
+ function executeSetEditingRestriction2(adapter, input, options) {
69591
+ validateSetEditingRestrictionInput2(input);
69592
+ return adapter.setEditingRestriction(input, normalizeMutationOptions2(options));
69593
+ }
69594
+ function executeClearEditingRestriction2(adapter, _input, options) {
69595
+ return adapter.clearEditingRestriction(undefined, normalizeMutationOptions2(options));
69596
+ }
69597
+ function validatePrincipal2(principal, operationName) {
69598
+ if (!principal || typeof principal !== "object")
69599
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} requires a principal object with a 'kind' property.`);
69600
+ const p = principal;
69601
+ if (p.kind === "everyone")
69602
+ return;
69603
+ if (p.kind === "editor") {
69604
+ if (typeof p.id !== "string" || p.id.length === 0)
69605
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} editor principal requires a non-empty id string.`);
69606
+ return;
69607
+ }
69608
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} principal kind must be 'everyone' or 'editor'. Received: '${String(p.kind)}'.`);
69609
+ }
69610
+ function requireNonEmptyId2(id2, operationName) {
69611
+ if (typeof id2 !== "string" || id2.length === 0)
69612
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} requires a non-empty id string.`);
69613
+ }
69614
+ function executePermissionRangesList2(adapter, input) {
69615
+ return adapter.list(input);
69616
+ }
69617
+ function executePermissionRangesGet2(adapter, input) {
69618
+ requireNonEmptyId2(input?.id, "permissionRanges.get");
69619
+ return adapter.get(input);
69620
+ }
69621
+ function executePermissionRangesCreate2(adapter, input, options) {
69622
+ if (!input || typeof input !== "object")
69623
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create requires an input object.");
69624
+ const { target, principal } = input;
69625
+ if (!target || typeof target !== "object")
69626
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create target must be a SelectionTarget object.");
69627
+ if (target.kind !== "selection" || !target.start || !target.end)
69628
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create target must have kind 'selection' with start and end points.");
69629
+ validatePrincipal2(principal, "permissionRanges.create");
69630
+ if (input.id !== undefined)
69631
+ requireNonEmptyId2(input.id, "permissionRanges.create");
69632
+ return adapter.create(input, normalizeMutationOptions2(options));
69633
+ }
69634
+ function executePermissionRangesRemove2(adapter, input, options) {
69635
+ requireNonEmptyId2(input?.id, "permissionRanges.remove");
69636
+ return adapter.remove(input, normalizeMutationOptions2(options));
69637
+ }
69638
+ function executePermissionRangesUpdatePrincipal2(adapter, input, options) {
69639
+ requireNonEmptyId2(input?.id, "permissionRanges.updatePrincipal");
69640
+ validatePrincipal2(input?.principal, "permissionRanges.updatePrincipal");
69641
+ return adapter.updatePrincipal(input, normalizeMutationOptions2(options));
69642
+ }
69202
69643
  function validateFootnoteTarget2(target, operationName) {
69203
69644
  assertTargetPresent2(target, operationName);
69204
69645
  const t = target;
@@ -70692,6 +71133,34 @@ function createDocumentApi2(adapters) {
70692
71133
  return executeHistoryRedo2(adapters.history);
70693
71134
  }
70694
71135
  },
71136
+ protection: {
71137
+ get(input) {
71138
+ return executeProtectionGet2(adapters.protection, input);
71139
+ },
71140
+ setEditingRestriction(input, options) {
71141
+ return executeSetEditingRestriction2(adapters.protection, input, options);
71142
+ },
71143
+ clearEditingRestriction(input, options) {
71144
+ return executeClearEditingRestriction2(adapters.protection, input, options);
71145
+ }
71146
+ },
71147
+ permissionRanges: {
71148
+ list(input) {
71149
+ return executePermissionRangesList2(adapters.permissionRanges, input);
71150
+ },
71151
+ get(input) {
71152
+ return executePermissionRangesGet2(adapters.permissionRanges, input);
71153
+ },
71154
+ create(input, options) {
71155
+ return executePermissionRangesCreate2(adapters.permissionRanges, input, options);
71156
+ },
71157
+ remove(input, options) {
71158
+ return executePermissionRangesRemove2(adapters.permissionRanges, input, options);
71159
+ },
71160
+ updatePrincipal(input, options) {
71161
+ return executePermissionRangesUpdatePrincipal2(adapters.permissionRanges, input, options);
71162
+ }
71163
+ },
70695
71164
  invoke(request) {
70696
71165
  if (!Object.prototype.hasOwnProperty.call(dispatch, request.operationId))
70697
71166
  throw new Error(`Unknown operationId: "${request.operationId}"`);
@@ -94135,6 +94604,253 @@ function compoundMutation(request) {
94135
94604
  state._partPublisher?.flush();
94136
94605
  return { success };
94137
94606
  }
94607
+ function findSettingsRoot(part) {
94608
+ if (part.name === "w:settings")
94609
+ return part;
94610
+ if (!Array.isArray(part.elements))
94611
+ return null;
94612
+ return part.elements.find((entry) => entry.name === "w:settings") ?? null;
94613
+ }
94614
+ function ensureSettingsRootElements(settingsRoot) {
94615
+ if (!Array.isArray(settingsRoot.elements))
94616
+ settingsRoot.elements = [];
94617
+ return settingsRoot.elements;
94618
+ }
94619
+ function readSettingsRoot(converter) {
94620
+ const part = converter.convertedXml?.[SETTINGS_PART_PATH];
94621
+ if (!part)
94622
+ return null;
94623
+ return findSettingsRoot(part);
94624
+ }
94625
+ function ensureSettingsRoot(part) {
94626
+ const settingsRoot = findSettingsRoot(part);
94627
+ if (settingsRoot)
94628
+ return settingsRoot;
94629
+ const fallbackRoot = {
94630
+ type: "element",
94631
+ name: "w:settings",
94632
+ elements: []
94633
+ };
94634
+ if (!Array.isArray(part.elements))
94635
+ part.elements = [];
94636
+ part.elements.push(fallbackRoot);
94637
+ return fallbackRoot;
94638
+ }
94639
+ function readDefaultTableStyle(settingsRoot) {
94640
+ const el = settingsRoot.elements?.find((entry) => entry.name === "w:defaultTableStyle");
94641
+ if (!el)
94642
+ return null;
94643
+ const val = el.attributes?.["w:val"];
94644
+ return typeof val === "string" && val.length > 0 ? val : null;
94645
+ }
94646
+ function setDefaultTableStyle(settingsRoot, styleId) {
94647
+ const elements = ensureSettingsRootElements(settingsRoot);
94648
+ const idx = elements.findIndex((entry) => entry.name === "w:defaultTableStyle");
94649
+ const newEl = {
94650
+ type: "element",
94651
+ name: "w:defaultTableStyle",
94652
+ attributes: { "w:val": styleId },
94653
+ elements: []
94654
+ };
94655
+ if (idx !== -1)
94656
+ elements[idx] = newEl;
94657
+ else
94658
+ elements.push(newEl);
94659
+ }
94660
+ function removeDefaultTableStyle(settingsRoot) {
94661
+ settingsRoot.elements = ensureSettingsRootElements(settingsRoot).filter((entry) => entry.name !== "w:defaultTableStyle");
94662
+ }
94663
+ function hasOddEvenHeadersFooters(settingsRoot) {
94664
+ return settingsRoot.elements?.some((entry) => entry.name === "w:evenAndOddHeaders") === true;
94665
+ }
94666
+ function setOddEvenHeadersFooters(settingsRoot, enabled) {
94667
+ const elements = ensureSettingsRootElements(settingsRoot);
94668
+ const hadFlag = hasOddEvenHeadersFooters(settingsRoot);
94669
+ if (enabled) {
94670
+ if (!hadFlag)
94671
+ elements.push({
94672
+ type: "element",
94673
+ name: "w:evenAndOddHeaders",
94674
+ elements: []
94675
+ });
94676
+ } else
94677
+ settingsRoot.elements = elements.filter((entry) => entry.name !== "w:evenAndOddHeaders");
94678
+ return hadFlag !== hasOddEvenHeadersFooters(settingsRoot);
94679
+ }
94680
+ function hasUpdateFields(settingsRoot) {
94681
+ const el = settingsRoot.elements?.find((entry) => entry.name === "w:updateFields");
94682
+ if (!el)
94683
+ return false;
94684
+ const val = el.attributes?.["w:val"];
94685
+ return val === "true" || val === "1" || val === true;
94686
+ }
94687
+ function setUpdateFields(settingsRoot, enabled) {
94688
+ const elements = ensureSettingsRootElements(settingsRoot);
94689
+ const idx = elements.findIndex((entry) => entry.name === "w:updateFields");
94690
+ if (enabled) {
94691
+ const newEl = {
94692
+ type: "element",
94693
+ name: "w:updateFields",
94694
+ attributes: { "w:val": "true" },
94695
+ elements: []
94696
+ };
94697
+ if (idx !== -1)
94698
+ elements[idx] = newEl;
94699
+ else
94700
+ elements.push(newEl);
94701
+ } else if (idx !== -1)
94702
+ elements.splice(idx, 1);
94703
+ }
94704
+ function isXmlTrue(value) {
94705
+ return value === "1" || value === 1 || value === "true" || value === "on" || value === true;
94706
+ }
94707
+ function hasVerifierFields(attrs) {
94708
+ return !!(attrs["w:cryptAlgorithmSid"] || attrs["w:hash"] || attrs["w:salt"] || attrs["w:cryptProviderType"] || attrs["w:cryptAlgorithmType"] || attrs["w:cryptAlgorithmClass"] || attrs["w:cryptSpinCount"]);
94709
+ }
94710
+ function parseProtectionState(settingsRoot) {
94711
+ if (!settingsRoot)
94712
+ return { ...DEFAULT_PROTECTION_STATE };
94713
+ const elements = settingsRoot.elements ?? [];
94714
+ const docProtEl = elements.find((el) => el.name === "w:documentProtection");
94715
+ const dpAttrs = docProtEl?.attributes ?? {};
94716
+ const rawMode = dpAttrs["w:edit"];
94717
+ const mode = rawMode && VALID_EDIT_MODES.has(rawMode) ? rawMode : "none";
94718
+ const enforced = isXmlTrue(dpAttrs["w:enforcement"]);
94719
+ const formattingRestricted = isXmlTrue(dpAttrs["w:formatting"]);
94720
+ const passwordProtected = docProtEl ? hasVerifierFields(dpAttrs) : false;
94721
+ const runtimeEnforced = mode === "readOnly" && enforced;
94722
+ const writeProt = elements.find((el) => el.name === "w:writeProtection");
94723
+ const wpAttrs = writeProt?.attributes ?? {};
94724
+ const writeEnabled = !!writeProt;
94725
+ const writePasswordProtected = writeProt ? hasVerifierFields(wpAttrs) : false;
94726
+ const readOnlyRecommended = isXmlTrue(wpAttrs["w:recommended"]);
94727
+ return {
94728
+ editingRestriction: {
94729
+ mode,
94730
+ enforced,
94731
+ runtimeEnforced,
94732
+ passwordProtected,
94733
+ formattingRestricted
94734
+ },
94735
+ writeProtection: {
94736
+ enabled: writeEnabled,
94737
+ passwordProtected: writePasswordProtected
94738
+ },
94739
+ readOnlyRecommended
94740
+ };
94741
+ }
94742
+ function setDocumentProtection(settingsRoot, opts) {
94743
+ const elements = ensureSettingsRootElements(settingsRoot);
94744
+ const idx = elements.findIndex((el) => el.name === "w:documentProtection");
94745
+ const attrs = {
94746
+ ...idx !== -1 ? { ...elements[idx].attributes ?? {} } : {},
94747
+ "w:edit": opts.mode,
94748
+ "w:enforcement": opts.enforced ? "1" : "0"
94749
+ };
94750
+ if (opts.formattingRestricted !== undefined)
94751
+ attrs["w:formatting"] = opts.formattingRestricted ? "1" : "0";
94752
+ const newEl = {
94753
+ type: "element",
94754
+ name: "w:documentProtection",
94755
+ attributes: attrs,
94756
+ elements: []
94757
+ };
94758
+ if (idx !== -1)
94759
+ elements[idx] = newEl;
94760
+ else
94761
+ elements.push(newEl);
94762
+ }
94763
+ function clearDocumentProtectionEnforcement(settingsRoot) {
94764
+ const el = (settingsRoot.elements ?? []).find((e) => e.name === "w:documentProtection");
94765
+ if (!el)
94766
+ return;
94767
+ if (!el.attributes)
94768
+ el.attributes = {};
94769
+ el.attributes["w:enforcement"] = "0";
94770
+ }
94771
+ function getProtectionStorage(editor) {
94772
+ return editor?.storage?.protection;
94773
+ }
94774
+ function isReadOnlyProtectionRuntimeEnforced(editor) {
94775
+ const storage = getProtectionStorage(editor);
94776
+ if (!storage?.initialized)
94777
+ return false;
94778
+ return storage.state?.editingRestriction?.runtimeEnforced === true;
94779
+ }
94780
+ function applyEffectiveEditability(editor, opts = {}) {
94781
+ if (!editor || editor.isDestroyed)
94782
+ return;
94783
+ if (opts.refilterRanges !== false)
94784
+ refilterAllowedRanges(editor);
94785
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
94786
+ const hasAllowedRanges = editor.storage?.permissionRanges?.hasAllowedRanges === true;
94787
+ const documentMode = editor.options?.documentMode;
94788
+ const storage = getProtectionStorage(editor);
94789
+ if (protectionEnforced) {
94790
+ if (storage && storage.editableBaseline === null)
94791
+ storage.editableBaseline = editor.isEditable;
94792
+ const shouldBeEditable = hasAllowedRanges;
94793
+ if (editor.isEditable !== shouldBeEditable)
94794
+ editor.setEditable(shouldBeEditable, false);
94795
+ } else {
94796
+ const baseline = storage?.editableBaseline ?? null;
94797
+ if (storage)
94798
+ storage.editableBaseline = null;
94799
+ if (documentMode === "viewing") {
94800
+ if (editor.isEditable !== false)
94801
+ editor.setEditable(false, false);
94802
+ } else if (baseline !== null && editor.isEditable !== baseline)
94803
+ editor.setEditable(baseline, false);
94804
+ }
94805
+ }
94806
+ function refilterAllowedRanges(editor) {
94807
+ const storage = editor?.storage?.permissionRanges;
94808
+ if (!storage)
94809
+ return;
94810
+ const allRanges = storage.allRanges;
94811
+ if (!Array.isArray(allRanges))
94812
+ return;
94813
+ if (!isReadOnlyProtectionRuntimeEnforced(editor)) {
94814
+ storage.allowedRanges = [];
94815
+ storage.hasAllowedRanges = false;
94816
+ storage.ranges = [];
94817
+ return;
94818
+ }
94819
+ const allowedIdentifiers = buildAllowedIdentifierSetFromEditor(editor);
94820
+ const filtered = allRanges.filter((entry) => isRangeAllowedForPrincipal(entry, allowedIdentifiers));
94821
+ storage.allowedRanges = filtered;
94822
+ storage.hasAllowedRanges = filtered.length > 0;
94823
+ storage.ranges = filtered;
94824
+ }
94825
+ function buildAllowedIdentifierSetFromEditor(editor) {
94826
+ const user = editor?.options?.user;
94827
+ if (!user)
94828
+ return /* @__PURE__ */ new Set;
94829
+ const principals = user.permissionPrincipals;
94830
+ if (Array.isArray(principals))
94831
+ return new Set(principals.map((p) => typeof p === "string" ? p.trim().toLowerCase() : "").filter(Boolean));
94832
+ const email = typeof user.email === "string" ? user.email.trim().toLowerCase() : "";
94833
+ if (!email)
94834
+ return /* @__PURE__ */ new Set;
94835
+ const [localPart, domain2] = email.split("@");
94836
+ if (!localPart || !domain2)
94837
+ return /* @__PURE__ */ new Set;
94838
+ return new Set([`${domain2}\\${localPart}`]);
94839
+ }
94840
+ function isRangeAllowedForPrincipal(entry, allowedIdentifiers) {
94841
+ if (entry.principal) {
94842
+ if (entry.principal.kind === "everyone")
94843
+ return true;
94844
+ if (entry.principal.kind === "editor") {
94845
+ const id2 = typeof entry.principal.id === "string" ? entry.principal.id.trim().toLowerCase() : "";
94846
+ return id2 ? allowedIdentifiers.has(id2) : false;
94847
+ }
94848
+ }
94849
+ if ((typeof entry.edGrp === "string" ? entry.edGrp.trim().toLowerCase() : "") === "everyone")
94850
+ return true;
94851
+ const ed = typeof entry.ed === "string" ? entry.ed.trim().toLowerCase() : "";
94852
+ return ed ? allowedIdentifiers.has(ed) : false;
94853
+ }
94138
94854
  function handleNumberingInvalidation(editor, _event) {
94139
94855
  try {
94140
94856
  editor.view?.dispatch?.(editor.state.tr);
@@ -94155,11 +94871,29 @@ function handleNotesInvalidation(editor, _event) {
94155
94871
  editor.view?.dispatch?.(tr);
94156
94872
  } catch {}
94157
94873
  }
94874
+ function handleSettingsInvalidation(editor, event) {
94875
+ if (event.source.startsWith("protection."))
94876
+ return;
94877
+ const converter = editor.converter;
94878
+ if (!converter)
94879
+ return;
94880
+ const newState = parseProtectionState(readSettingsRoot(converter));
94881
+ const protStorage = getProtectionStorage(editor);
94882
+ if (protStorage)
94883
+ protStorage.state = newState;
94884
+ applyEffectiveEditability(editor);
94885
+ editor.emit("protectionChanged", {
94886
+ editor,
94887
+ state: newState,
94888
+ source: "remote-part-sync"
94889
+ });
94890
+ }
94158
94891
  function registerStaticInvalidationHandlers() {
94159
94892
  registerInvalidationHandler("word/numbering.xml", handleNumberingInvalidation);
94160
94893
  registerInvalidationHandler("word/_rels/document.xml.rels", handleRelationshipsInvalidation);
94161
94894
  registerInvalidationHandler("word/footnotes.xml", handleNotesInvalidation);
94162
94895
  registerInvalidationHandler("word/endnotes.xml", handleNotesInvalidation);
94896
+ registerInvalidationHandler("word/settings.xml", handleSettingsInvalidation);
94163
94897
  }
94164
94898
  function registerHeaderFooterInvalidation(partId) {
94165
94899
  registerInvalidationHandler(partId, handleHeaderFooterInvalidation);
@@ -96612,103 +97346,6 @@ function refreshAllStatFields(editor) {
96612
97346
  }
96613
97347
  return cacheMap;
96614
97348
  }
96615
- function findSettingsRoot(part) {
96616
- if (part.name === "w:settings")
96617
- return part;
96618
- if (!Array.isArray(part.elements))
96619
- return null;
96620
- return part.elements.find((entry) => entry.name === "w:settings") ?? null;
96621
- }
96622
- function ensureSettingsRootElements(settingsRoot) {
96623
- if (!Array.isArray(settingsRoot.elements))
96624
- settingsRoot.elements = [];
96625
- return settingsRoot.elements;
96626
- }
96627
- function readSettingsRoot(converter) {
96628
- const part = converter.convertedXml?.[SETTINGS_PART_PATH];
96629
- if (!part)
96630
- return null;
96631
- return findSettingsRoot(part);
96632
- }
96633
- function ensureSettingsRoot(part) {
96634
- const settingsRoot = findSettingsRoot(part);
96635
- if (settingsRoot)
96636
- return settingsRoot;
96637
- const fallbackRoot = {
96638
- type: "element",
96639
- name: "w:settings",
96640
- elements: []
96641
- };
96642
- if (!Array.isArray(part.elements))
96643
- part.elements = [];
96644
- part.elements.push(fallbackRoot);
96645
- return fallbackRoot;
96646
- }
96647
- function readDefaultTableStyle(settingsRoot) {
96648
- const el = settingsRoot.elements?.find((entry) => entry.name === "w:defaultTableStyle");
96649
- if (!el)
96650
- return null;
96651
- const val = el.attributes?.["w:val"];
96652
- return typeof val === "string" && val.length > 0 ? val : null;
96653
- }
96654
- function setDefaultTableStyle(settingsRoot, styleId) {
96655
- const elements = ensureSettingsRootElements(settingsRoot);
96656
- const idx = elements.findIndex((entry) => entry.name === "w:defaultTableStyle");
96657
- const newEl = {
96658
- type: "element",
96659
- name: "w:defaultTableStyle",
96660
- attributes: { "w:val": styleId },
96661
- elements: []
96662
- };
96663
- if (idx !== -1)
96664
- elements[idx] = newEl;
96665
- else
96666
- elements.push(newEl);
96667
- }
96668
- function removeDefaultTableStyle(settingsRoot) {
96669
- settingsRoot.elements = ensureSettingsRootElements(settingsRoot).filter((entry) => entry.name !== "w:defaultTableStyle");
96670
- }
96671
- function hasOddEvenHeadersFooters(settingsRoot) {
96672
- return settingsRoot.elements?.some((entry) => entry.name === "w:evenAndOddHeaders") === true;
96673
- }
96674
- function setOddEvenHeadersFooters(settingsRoot, enabled) {
96675
- const elements = ensureSettingsRootElements(settingsRoot);
96676
- const hadFlag = hasOddEvenHeadersFooters(settingsRoot);
96677
- if (enabled) {
96678
- if (!hadFlag)
96679
- elements.push({
96680
- type: "element",
96681
- name: "w:evenAndOddHeaders",
96682
- elements: []
96683
- });
96684
- } else
96685
- settingsRoot.elements = elements.filter((entry) => entry.name !== "w:evenAndOddHeaders");
96686
- return hadFlag !== hasOddEvenHeadersFooters(settingsRoot);
96687
- }
96688
- function hasUpdateFields(settingsRoot) {
96689
- const el = settingsRoot.elements?.find((entry) => entry.name === "w:updateFields");
96690
- if (!el)
96691
- return false;
96692
- const val = el.attributes?.["w:val"];
96693
- return val === "true" || val === "1" || val === true;
96694
- }
96695
- function setUpdateFields(settingsRoot, enabled) {
96696
- const elements = ensureSettingsRootElements(settingsRoot);
96697
- const idx = elements.findIndex((entry) => entry.name === "w:updateFields");
96698
- if (enabled) {
96699
- const newEl = {
96700
- type: "element",
96701
- name: "w:updateFields",
96702
- attributes: { "w:val": "true" },
96703
- elements: []
96704
- };
96705
- if (idx !== -1)
96706
- elements[idx] = newEl;
96707
- else
96708
- elements.push(newEl);
96709
- } else if (idx !== -1)
96710
- elements.splice(idx, 1);
96711
- }
96712
97349
  function getLocalName(name) {
96713
97350
  if (!name || typeof name !== "string")
96714
97351
  return "";
@@ -99070,7 +99707,7 @@ var isRegExp = (value) => {
99070
99707
  tracked: false,
99071
99708
  carrier: runAttributeCarrier2(runPropertyKey ?? key),
99072
99709
  schema
99073
- }), INLINE_PROPERTY_REGISTRY2, INLINE_PROPERTY_KEY_SET2, INLINE_PROPERTY_BY_KEY2, UNDERLINE_OBJECT_ALLOWED_KEYS2, SHADING_ALLOWED_KEYS2, BORDER_ALLOWED_KEYS2, FIT_TEXT_ALLOWED_KEYS2, LANG_ALLOWED_KEYS2, RFONTS_ALLOWED_KEYS2, EAST_ASIAN_LAYOUT_ALLOWED_KEYS2, STYLISTIC_SET_ALLOWED_KEYS2, VERT_ALIGN_VALUES2, PROPERTY_VALIDATOR_MAP2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_NOT_FOUND_COMMAND2, T_IMAGE_COMMAND2, T_CC_READ2, T_CC_MUTATION2, T_CC_TYPED2, T_CC_TYPED_READ2, T_CC_RAW2, T_QUERY_MATCH2, T_SECTION_CREATE2, T_SECTION_READ2, T_PARAGRAPH_MUTATION2, T_SECTION_MUTATION2, T_SECTION_SETTINGS_MUTATION2, T_HEADER_FOOTER_MUTATION2, T_STORY2, T_REF_READ_LIST2, T_REF_MUTATION2, T_REF_MUTATION_REMOVE2, T_REF_INSERT2, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG3, PARAGRAPH_ALIGNMENTS2, TAB_STOP_ALIGNMENTS2, TAB_STOP_LEADERS2, BORDER_SIDES2, CLEAR_BORDER_SIDES2, LINE_RULES2, PARAGRAPH_DIRECTIONS2, ALIGNMENT_POLICIES2, PARAGRAPH_BLOCK_TYPES2, SET_STYLE_KEYS2, CLEAR_STYLE_KEYS2, RESET_DIRECT_FORMATTING_KEYS2, SET_ALIGNMENT_KEYS2, CLEAR_ALIGNMENT_KEYS2, SET_INDENTATION_KEYS2, CLEAR_INDENTATION_KEYS2, SET_SPACING_KEYS2, CLEAR_SPACING_KEYS2, SET_KEEP_OPTIONS_KEYS2, SET_OUTLINE_LEVEL_KEYS2, SET_FLOW_OPTIONS_KEYS2, SET_TAB_STOP_KEYS2, CLEAR_TAB_STOP_KEYS2, CLEAR_ALL_TAB_STOPS_KEYS2, SET_BORDER_KEYS2, CLEAR_BORDER_KEYS2, SET_SHADING_KEYS2, CLEAR_SHADING_KEYS2, SET_DIRECTION_KEYS2, CLEAR_DIRECTION_KEYS2, ST_ON_OFF_ON_VALUES2, ST_ON_OFF_OFF_VALUES2, ST_UNDERLINE_VALUES2, ST_UNDERLINE_VALUE_SET2, ST_VERTICAL_ALIGN_RUN2, ST_EM2, ST_TEXT_ALIGNMENT2, ST_TEXT_DIRECTION2, ST_TEXTBOX_TIGHT_WRAP2, ST_TEXT_TRANSFORM2, ST_JUSTIFICATION2, FONT_FAMILY_SCHEMA2, COLOR_SCHEMA2, SPACING_SCHEMA2, INDENT_SCHEMA2, UNDERLINE_SCHEMA2, BORDER_PROPERTIES_SCHEMA2, SHADING_SCHEMA2, LANG_SCHEMA2, EAST_ASIAN_LAYOUT_SCHEMA2, FIT_TEXT_SCHEMA2, NUMBERING_PROPERTIES_SCHEMA2, FRAME_PR_SCHEMA2, PARAGRAPH_BORDERS_SCHEMA2, TAB_STOP_SCHEMA2, PROPERTY_REGISTRY2, ALLOWED_KEYS_BY_CHANNEL2, PROPERTY_INDEX2, EXCLUDED_KEYS2, INPUT_ALLOWED_KEYS2, TARGET_ALLOWED_KEYS2, OPTIONS_ALLOWED_KEYS2, VALID_CHANNELS2, Z_ORDER_RELATIVE_HEIGHT_MAX2 = 4294967295, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, tableAddressSchema2, tableRowAddressSchema2, tableCellAddressSchema2, tableOrCellAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, paragraphTargetSchema2, sectionAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, entityAddressSchema2, selectionTargetSchema2, deleteBehaviorSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationRangeSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, storyLocatorSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, textSelectorSchema2, nodeSelectorSchema2, sdMutationResolutionSchema2, sdMutationSuccessSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, documentStylesSchema2, documentDefaultsSchema2, listKindSchema2, listInsertPositionSchema2, sectionBreakTypeSchema2, sectionOrientationSchema2, sectionVerticalAlignSchema2, sectionDirectionSchema2, sectionHeaderFooterKindSchema2, sectionHeaderFooterVariantSchema2, sectionLineNumberRestartSchema2, sectionPageNumberFormatSchema2, sectionRangeDomainSchema2, sectionPageMarginsSchema2, sectionHeaderFooterMarginsSchema2, sectionPageSetupSchema2, sectionColumnsSchema2, sectionLineNumberingSchema2, sectionPageNumberingSchema2, sectionHeaderFooterRefsSchema2, sectionBorderSpecSchema2, sectionPageBordersSchema2, sectionMutationSuccessSchema2, documentMutationSuccessSchema2, paragraphMutationTargetSchema2, paragraphMutationSuccessSchema2, createSectionBreakSuccessSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, inlinePropertyCapabilitySchema2, formatCapabilitiesSchema2, planEngineCapabilitiesSchema2, nullableTableBorderSpecSchema2, sdFragmentSchema2, placementSchema2, nestingPolicySchema2, tableCreateLocationSchema2, formatInlineAliasOperationSchemas2, tocMutationFailureSchema2, tocMutationSuccessSchema2, tocEntryMutationFailureSchema2, tocEntryMutationSuccessSchema2, hyperlinkTargetSchema2, hyperlinkReadPropertiesSchema2, hyperlinkSpecSchema2, hyperlinkPatchSchema2, hyperlinkDomainSchema2, hyperlinkMutationSuccessSchema2, hyperlinkMutationFailureSchema2, contentControlTargetSchema2, contentControlMutationSuccessSchema2, contentControlMutationFailureSchema2, ccListResultSchema2, ccInfoSchema2, refFailureSchema2, bookmarkAddressSchema2, bookmarkMutation2, footnoteAddressSchema2, footnoteConfigScopeSchema2, footnoteNumberingSchema2, footnoteMutation2, footnoteConfig2, crossRefAddressSchema2, crossRefTargetSchema2, crossRefDisplaySchema2, crossRefMutation2, indexAddressSchema2, indexEntryAddressSchema2, indexConfigSchema2, indexEntryDataSchema2, indexEntryPatchSchema2, indexMutation2, indexEntryMutation2, captionAddressSchema2, captionMutation2, captionConfig2, fieldAddressSchema2, fieldMutation2, citationAddressSchema2, citationSourceAddressSchema2, bibliographyAddressSchema2, citationMutation2, citationSourceMutation2, bibliographyMutation2, citationPersonSchema2, citationSourceFieldsSchema2, tocCreateLocationSchema2, authoritiesAddressSchema2, authorityEntryAddressSchema2, authoritiesConfigSchema2, authorityEntryDataSchema2, authorityEntryPatchSchema2, authoritiesMutation2, authorityEntryMutation2, diffCoverageSchema2, diffSummarySchema2, diffSnapshotSchema2, diffPayloadSchema2, GROUP_METADATA2, STEP_OP_CATALOG_UNFROZEN2, PUBLIC_STEP_OP_CATALOG_UNFROZEN2, PUBLIC_MUTATION_STEP_OP_IDS2, PUBLIC_MUTATION_STEP_OP_SET2, CAPABILITY_REASON_CODES, VALID_EDGE_VALUES2, VALID_EDGE_NODE_TYPES2, VALID_DOCUMENT_EDGES2, VALID_REF_BOUNDARIES2, VALID_ANCHOR_KINDS2, RESOLVE_RANGE_ALLOWED_KEYS2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, INLINE_ALIAS_INPUT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, VALID_BEHAVIORS2, CONTENT_KIND_SET2, INLINE_KIND_SET2, LEGACY_TOP_LEVEL_TYPES2, TEXT_INSERT_ALLOWED_KEYS2, STRUCTURAL_INSERT_ALLOWED_KEYS2, VALID_INSERT_TYPES2, LIST_KINDS2, LIST_INSERT_POSITIONS2, JOIN_DIRECTIONS2, MUTATION_SCOPES2, LEVEL_ALIGNMENTS2, TRAILING_CHARACTERS2, LIST_PRESET_IDS2, VALID_BLOCK_NODE_TYPES$1, VALID_LIST_KINDS2, VALID_INSERT_POSITIONS2, VALID_JOIN_DIRECTIONS2, VALID_MUTATION_SCOPES2, VALID_LEVEL_ALIGNMENTS2, VALID_TRAILING_CHARACTERS2, VALID_LIST_PRESETS2, VALID_CONTINUITY_VALUES2, VALID_SEQUENCE_MODES2, VALID_LIST_CREATE_MODES2, TEXT_REPLACE_ALLOWED_KEYS2, STRUCTURAL_REPLACE_ALLOWED_KEYS2, VALID_HEADING_LEVELS2, SECTION_BREAK_TYPES$1, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, VALID_BLOCK_NODE_TYPES3, SNAPSHOT_VERSION2 = "sd-diff-snapshot/v1", PAYLOAD_VERSION2 = "sd-diff-payload/v1", VALID_STYLE_OPTION_FLAGS2, TABLE_BORDER_COLOR_PATTERN2, VALID_APPLY_TO_VALUES2, VALID_BORDER_EDGE_KEYS2, HEADER_FOOTER_KINDS$1, HEADER_FOOTER_VARIANTS$1, DEFAULT_SECTIONS_LIST_LIMIT2 = 250, SECTION_BREAK_TYPES3, SECTION_ORIENTATIONS2, SECTION_VERTICAL_ALIGNS2, SECTION_DIRECTIONS2, HEADER_FOOTER_KINDS3, HEADER_FOOTER_VARIANTS3, LINE_NUMBER_RESTARTS2, PAGE_NUMBER_FORMATS2, PAGE_BORDER_DISPLAYS2, PAGE_BORDER_OFFSET_FROM_VALUES2, PAGE_BORDER_Z_ORDER_VALUES2, VALID_WRAP_TYPES2, VALID_WRAP_SIDES2, VALID_IMAGE_SIZE_UNITS2, VALID_TOC_UPDATE_MODES2, EDIT_ENTRY_PATCH_ALLOWED_KEYS2, PATCH_FIELDS2, CONTENT_CONTROL_TYPES2, LOCK_MODES2, CONTENT_CONTROL_APPEARANCES2, VALID_NODE_KINDS2, VALID_LOCK_MODES$1, VALID_CC_TYPES2, VALID_CC_APPEARANCES2, VALID_CONTENT_FORMATS2, VALID_RAW_PATCH_OPS2, VALID_CREATE_LOCATION_KINDS2, ADAPTER_GATED_PREFIXES2, _buffers, _defaultCollectionId = null, _nextCollectionId = 1, generateV2HandlerEntity = (handlerName, translator$216) => ({
99710
+ }), INLINE_PROPERTY_REGISTRY2, INLINE_PROPERTY_KEY_SET2, INLINE_PROPERTY_BY_KEY2, UNDERLINE_OBJECT_ALLOWED_KEYS2, SHADING_ALLOWED_KEYS2, BORDER_ALLOWED_KEYS2, FIT_TEXT_ALLOWED_KEYS2, LANG_ALLOWED_KEYS2, RFONTS_ALLOWED_KEYS2, EAST_ASIAN_LAYOUT_ALLOWED_KEYS2, STYLISTIC_SET_ALLOWED_KEYS2, VERT_ALIGN_VALUES2, PROPERTY_VALIDATOR_MAP2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_NOT_FOUND_COMMAND2, T_IMAGE_COMMAND2, T_CC_READ2, T_CC_MUTATION2, T_CC_TYPED2, T_CC_TYPED_READ2, T_CC_RAW2, T_QUERY_MATCH2, T_SECTION_CREATE2, T_SECTION_READ2, T_PARAGRAPH_MUTATION2, T_SECTION_MUTATION2, T_SECTION_SETTINGS_MUTATION2, T_HEADER_FOOTER_MUTATION2, T_STORY2, T_REF_READ_LIST2, T_REF_MUTATION2, T_REF_MUTATION_REMOVE2, T_REF_INSERT2, T_PROTECTION_READ2, T_PROTECTION_MUTATION2, T_PERM_RANGE_READ2, T_PERM_RANGE_MUTATION2, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG3, PARAGRAPH_ALIGNMENTS2, TAB_STOP_ALIGNMENTS2, TAB_STOP_LEADERS2, BORDER_SIDES2, CLEAR_BORDER_SIDES2, LINE_RULES2, PARAGRAPH_DIRECTIONS2, ALIGNMENT_POLICIES2, PARAGRAPH_BLOCK_TYPES2, SET_STYLE_KEYS2, CLEAR_STYLE_KEYS2, RESET_DIRECT_FORMATTING_KEYS2, SET_ALIGNMENT_KEYS2, CLEAR_ALIGNMENT_KEYS2, SET_INDENTATION_KEYS2, CLEAR_INDENTATION_KEYS2, SET_SPACING_KEYS2, CLEAR_SPACING_KEYS2, SET_KEEP_OPTIONS_KEYS2, SET_OUTLINE_LEVEL_KEYS2, SET_FLOW_OPTIONS_KEYS2, SET_TAB_STOP_KEYS2, CLEAR_TAB_STOP_KEYS2, CLEAR_ALL_TAB_STOPS_KEYS2, SET_BORDER_KEYS2, CLEAR_BORDER_KEYS2, SET_SHADING_KEYS2, CLEAR_SHADING_KEYS2, SET_DIRECTION_KEYS2, CLEAR_DIRECTION_KEYS2, ST_ON_OFF_ON_VALUES2, ST_ON_OFF_OFF_VALUES2, ST_UNDERLINE_VALUES2, ST_UNDERLINE_VALUE_SET2, ST_VERTICAL_ALIGN_RUN2, ST_EM2, ST_TEXT_ALIGNMENT2, ST_TEXT_DIRECTION2, ST_TEXTBOX_TIGHT_WRAP2, ST_TEXT_TRANSFORM2, ST_JUSTIFICATION2, FONT_FAMILY_SCHEMA2, COLOR_SCHEMA2, SPACING_SCHEMA2, INDENT_SCHEMA2, UNDERLINE_SCHEMA2, BORDER_PROPERTIES_SCHEMA2, SHADING_SCHEMA2, LANG_SCHEMA2, EAST_ASIAN_LAYOUT_SCHEMA2, FIT_TEXT_SCHEMA2, NUMBERING_PROPERTIES_SCHEMA2, FRAME_PR_SCHEMA2, PARAGRAPH_BORDERS_SCHEMA2, TAB_STOP_SCHEMA2, PROPERTY_REGISTRY2, ALLOWED_KEYS_BY_CHANNEL2, PROPERTY_INDEX2, EXCLUDED_KEYS2, INPUT_ALLOWED_KEYS2, TARGET_ALLOWED_KEYS2, OPTIONS_ALLOWED_KEYS2, VALID_CHANNELS2, Z_ORDER_RELATIVE_HEIGHT_MAX2 = 4294967295, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, tableAddressSchema2, tableRowAddressSchema2, tableCellAddressSchema2, tableOrCellAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, paragraphTargetSchema2, sectionAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, entityAddressSchema2, selectionTargetSchema2, deleteBehaviorSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationRangeSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, storyLocatorSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, textSelectorSchema2, nodeSelectorSchema2, sdMutationResolutionSchema2, sdMutationSuccessSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, documentStylesSchema2, documentDefaultsSchema2, listKindSchema2, listInsertPositionSchema2, sectionBreakTypeSchema2, sectionOrientationSchema2, sectionVerticalAlignSchema2, sectionDirectionSchema2, sectionHeaderFooterKindSchema2, sectionHeaderFooterVariantSchema2, sectionLineNumberRestartSchema2, sectionPageNumberFormatSchema2, sectionRangeDomainSchema2, sectionPageMarginsSchema2, sectionHeaderFooterMarginsSchema2, sectionPageSetupSchema2, sectionColumnsSchema2, sectionLineNumberingSchema2, sectionPageNumberingSchema2, sectionHeaderFooterRefsSchema2, sectionBorderSpecSchema2, sectionPageBordersSchema2, sectionMutationSuccessSchema2, documentMutationSuccessSchema2, paragraphMutationTargetSchema2, paragraphMutationSuccessSchema2, createSectionBreakSuccessSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, inlinePropertyCapabilitySchema2, formatCapabilitiesSchema2, planEngineCapabilitiesSchema2, nullableTableBorderSpecSchema2, sdFragmentSchema2, placementSchema2, nestingPolicySchema2, tableCreateLocationSchema2, formatInlineAliasOperationSchemas2, tocMutationFailureSchema2, tocMutationSuccessSchema2, tocEntryMutationFailureSchema2, tocEntryMutationSuccessSchema2, hyperlinkTargetSchema2, hyperlinkReadPropertiesSchema2, hyperlinkSpecSchema2, hyperlinkPatchSchema2, hyperlinkDomainSchema2, hyperlinkMutationSuccessSchema2, hyperlinkMutationFailureSchema2, contentControlTargetSchema2, contentControlMutationSuccessSchema2, contentControlMutationFailureSchema2, ccListResultSchema2, ccInfoSchema2, refFailureSchema2, bookmarkAddressSchema2, bookmarkMutation2, footnoteAddressSchema2, footnoteConfigScopeSchema2, footnoteNumberingSchema2, footnoteMutation2, footnoteConfig2, crossRefAddressSchema2, crossRefTargetSchema2, crossRefDisplaySchema2, crossRefMutation2, indexAddressSchema2, indexEntryAddressSchema2, indexConfigSchema2, indexEntryDataSchema2, indexEntryPatchSchema2, indexMutation2, indexEntryMutation2, captionAddressSchema2, captionMutation2, captionConfig2, fieldAddressSchema2, fieldMutation2, citationAddressSchema2, citationSourceAddressSchema2, bibliographyAddressSchema2, citationMutation2, citationSourceMutation2, bibliographyMutation2, citationPersonSchema2, citationSourceFieldsSchema2, tocCreateLocationSchema2, authoritiesAddressSchema2, authorityEntryAddressSchema2, authoritiesConfigSchema2, authorityEntryDataSchema2, authorityEntryPatchSchema2, authoritiesMutation2, authorityEntryMutation2, diffCoverageSchema2, diffSummarySchema2, diffSnapshotSchema2, diffPayloadSchema2, GROUP_METADATA2, STEP_OP_CATALOG_UNFROZEN2, PUBLIC_STEP_OP_CATALOG_UNFROZEN2, PUBLIC_MUTATION_STEP_OP_IDS2, PUBLIC_MUTATION_STEP_OP_SET2, CAPABILITY_REASON_CODES, VALID_EDGE_VALUES2, VALID_EDGE_NODE_TYPES2, VALID_DOCUMENT_EDGES2, VALID_REF_BOUNDARIES2, VALID_ANCHOR_KINDS2, RESOLVE_RANGE_ALLOWED_KEYS2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, INLINE_ALIAS_INPUT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, VALID_BEHAVIORS2, CONTENT_KIND_SET2, INLINE_KIND_SET2, LEGACY_TOP_LEVEL_TYPES2, TEXT_INSERT_ALLOWED_KEYS2, STRUCTURAL_INSERT_ALLOWED_KEYS2, VALID_INSERT_TYPES2, LIST_KINDS2, LIST_INSERT_POSITIONS2, JOIN_DIRECTIONS2, MUTATION_SCOPES2, LEVEL_ALIGNMENTS2, TRAILING_CHARACTERS2, LIST_PRESET_IDS2, VALID_BLOCK_NODE_TYPES$1, VALID_LIST_KINDS2, VALID_INSERT_POSITIONS2, VALID_JOIN_DIRECTIONS2, VALID_MUTATION_SCOPES2, VALID_LEVEL_ALIGNMENTS2, VALID_TRAILING_CHARACTERS2, VALID_LIST_PRESETS2, VALID_CONTINUITY_VALUES2, VALID_SEQUENCE_MODES2, VALID_LIST_CREATE_MODES2, TEXT_REPLACE_ALLOWED_KEYS2, STRUCTURAL_REPLACE_ALLOWED_KEYS2, VALID_HEADING_LEVELS2, SECTION_BREAK_TYPES$1, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, VALID_BLOCK_NODE_TYPES3, SNAPSHOT_VERSION2 = "sd-diff-snapshot/v1", PAYLOAD_VERSION2 = "sd-diff-payload/v1", VALID_STYLE_OPTION_FLAGS2, TABLE_BORDER_COLOR_PATTERN2, VALID_APPLY_TO_VALUES2, VALID_BORDER_EDGE_KEYS2, HEADER_FOOTER_KINDS$1, HEADER_FOOTER_VARIANTS$1, DEFAULT_SECTIONS_LIST_LIMIT2 = 250, SECTION_BREAK_TYPES3, SECTION_ORIENTATIONS2, SECTION_VERTICAL_ALIGNS2, SECTION_DIRECTIONS2, HEADER_FOOTER_KINDS3, HEADER_FOOTER_VARIANTS3, LINE_NUMBER_RESTARTS2, PAGE_NUMBER_FORMATS2, PAGE_BORDER_DISPLAYS2, PAGE_BORDER_OFFSET_FROM_VALUES2, PAGE_BORDER_Z_ORDER_VALUES2, VALID_WRAP_TYPES2, VALID_WRAP_SIDES2, VALID_IMAGE_SIZE_UNITS2, VALID_TOC_UPDATE_MODES2, EDIT_ENTRY_PATCH_ALLOWED_KEYS2, PATCH_FIELDS2, CONTENT_CONTROL_TYPES2, LOCK_MODES2, CONTENT_CONTROL_APPEARANCES2, VALID_NODE_KINDS2, VALID_LOCK_MODES$1, VALID_CC_TYPES2, VALID_CC_APPEARANCES2, VALID_CONTENT_FORMATS2, VALID_RAW_PATCH_OPS2, VALID_SET_MODES2, VALID_CREATE_LOCATION_KINDS2, DEFAULT_PROTECTION_STATE, ADAPTER_GATED_PREFIXES2, _buffers, _defaultCollectionId = null, _nextCollectionId = 1, generateV2HandlerEntity = (handlerName, translator$216) => ({
99074
99711
  handlerName,
99075
99712
  handler: (params3) => {
99076
99713
  const { nodes } = params3;
@@ -113245,7 +113882,7 @@ var isRegExp = (value) => {
113245
113882
  candidate = candidate.prev;
113246
113883
  }
113247
113884
  }
113248
- }, DocumentApiAdapterError, SectionType, DEFAULT_PARAGRAPH_SECTION_TYPE, DEFAULT_BODY_SECTION_TYPE, TWIPS_PER_INCH = 1440, PX_PER_INCH = 96, DEFAULT_COLUMN_GAP_INCHES = 0.5, DEFAULT_HEADER_FOOTER_MARGIN_PX = 0, CommentMarkName = "commentMark", LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, FALLBACK_PREFIX, UUID_LIKE_PATTERN, ALIAS_ELIGIBLE_TYPES, cacheByEditor, OBJECT_REPLACEMENT_CHAR = "", LINE_NUMBER_RESTART_VALUES, PAGE_NUMBER_FORMAT_VALUES, SECTION_ORIENTATION_VALUES, SECTION_VERTICAL_ALIGN_VALUES, readSectPrHeaderFooterRefs, PIXELS_PER_INCH = 96, DOCUMENT_RELS_PATH = "word/_rels/document.xml.rels", RELS_XMLNS = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", WORDPROCESSINGML_XMLNS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", OFFICE_DOCUMENT_RELS_XMLNS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", RELATIONSHIP_ID_PATTERN, HEADER_FILE_PATTERN, FOOTER_FILE_PATTERN, SOURCE_HEADER_FOOTER_LOCAL = "header-footer-sync:local", HEADER_PATTERN, FOOTER_PATTERN, DEFAULT_HDR_FTR_ATTRS, HEADER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", VALID_VARIANTS, FOOTNOTES_PART_ID = "word/footnotes.xml", ENDNOTES_PART_ID = "word/endnotes.xml", FOOTNOTES_CONFIG, ENDNOTES_CONFIG, NOTES_XMLNS, footnotesPartDescriptor, endnotesPartDescriptor, storeByEditor, cacheByHost, hostStoreSyncedKeys, BODY_LOCATOR, findMarkPosition = (doc$2, pos, markName) => {
113885
+ }, DocumentApiAdapterError, SectionType, DEFAULT_PARAGRAPH_SECTION_TYPE, DEFAULT_BODY_SECTION_TYPE, TWIPS_PER_INCH = 1440, PX_PER_INCH = 96, DEFAULT_COLUMN_GAP_INCHES = 0.5, DEFAULT_HEADER_FOOTER_MARGIN_PX = 0, CommentMarkName = "commentMark", LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, FALLBACK_PREFIX, UUID_LIKE_PATTERN, ALIAS_ELIGIBLE_TYPES, cacheByEditor, OBJECT_REPLACEMENT_CHAR = "", LINE_NUMBER_RESTART_VALUES, PAGE_NUMBER_FORMAT_VALUES, SECTION_ORIENTATION_VALUES, SECTION_VERTICAL_ALIGN_VALUES, readSectPrHeaderFooterRefs, PIXELS_PER_INCH = 96, SETTINGS_PART_PATH = "word/settings.xml", VALID_EDIT_MODES, DOCUMENT_RELS_PATH = "word/_rels/document.xml.rels", RELS_XMLNS = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", WORDPROCESSINGML_XMLNS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", OFFICE_DOCUMENT_RELS_XMLNS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", RELATIONSHIP_ID_PATTERN, HEADER_FILE_PATTERN, FOOTER_FILE_PATTERN, SOURCE_HEADER_FOOTER_LOCAL = "header-footer-sync:local", HEADER_PATTERN, FOOTER_PATTERN, DEFAULT_HDR_FTR_ATTRS, HEADER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", VALID_VARIANTS, FOOTNOTES_PART_ID = "word/footnotes.xml", ENDNOTES_PART_ID = "word/endnotes.xml", FOOTNOTES_CONFIG, ENDNOTES_CONFIG, NOTES_XMLNS, footnotesPartDescriptor, endnotesPartDescriptor, storeByEditor, cacheByHost, hostStoreSyncedKeys, BODY_LOCATOR, findMarkPosition = (doc$2, pos, markName) => {
113249
113886
  const $pos = doc$2.resolve(pos);
113250
113887
  const parent = $pos.parent;
113251
113888
  const start = parent.childAfter($pos.parentOffset);
@@ -113313,7 +113950,7 @@ var isRegExp = (value) => {
113313
113950
  if (id2)
113314
113951
  return trackedChanges.filter(({ mark }) => mark.attrs.id === id2);
113315
113952
  return trackedChanges;
113316
- }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, SETTINGS_PART_PATH = "word/settings.xml", BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", DEFAULT_XML_DECLARATION, API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
113953
+ }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", DEFAULT_XML_DECLARATION, API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
113317
113954
  if (!runProps?.elements?.length || !state)
113318
113955
  return;
113319
113956
  const fontsNode = runProps.elements.find((el) => el.name === "w:rFonts");
@@ -113347,7 +113984,7 @@ var isRegExp = (value) => {
113347
113984
  state.kern = kernNode.attributes["w:val"];
113348
113985
  }
113349
113986
  }, SuperConverter;
113350
- var init_SuperConverter_OPfy6vj2_es = __esm(() => {
113987
+ var init_SuperConverter_CMIR0kxi_es = __esm(() => {
113351
113988
  init_rolldown_runtime_B2q5OVn9_es();
113352
113989
  init_jszip_ChlR43oI_es();
113353
113990
  init_xml_js_40FWvL78_es();
@@ -116349,6 +116986,15 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
116349
116986
  "INVALID_INPUT",
116350
116987
  "CAPABILITY_UNAVAILABLE"
116351
116988
  ];
116989
+ T_PROTECTION_READ2 = ["CAPABILITY_UNAVAILABLE"];
116990
+ T_PROTECTION_MUTATION2 = ["INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
116991
+ T_PERM_RANGE_READ2 = ["TARGET_NOT_FOUND", "CAPABILITY_UNAVAILABLE"];
116992
+ T_PERM_RANGE_MUTATION2 = [
116993
+ "TARGET_NOT_FOUND",
116994
+ "INVALID_TARGET",
116995
+ "INVALID_INPUT",
116996
+ "CAPABILITY_UNAVAILABLE"
116997
+ ];
116352
116998
  FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2 = Object.fromEntries(INLINE_PROPERTY_REGISTRY2.map((entry) => {
116353
116999
  const operationId = `format.${entry.key}`;
116354
117000
  return [operationId, {
@@ -121580,6 +122226,116 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
121580
122226
  referenceDocPath: "diff/apply.mdx",
121581
122227
  referenceGroup: "diff",
121582
122228
  skipAsATool: true
122229
+ },
122230
+ "protection.get": {
122231
+ memberPath: "protection.get",
122232
+ description: "Read the current document protection state including editing restrictions, write protection, and read-only recommendation.",
122233
+ expectedResult: "Returns a DocumentProtectionState with editingRestriction, writeProtection, and readOnlyRecommended fields.",
122234
+ requiresDocumentContext: true,
122235
+ metadata: readOperation2({ throws: T_PROTECTION_READ2 }),
122236
+ referenceDocPath: "protection/get.mdx",
122237
+ referenceGroup: "protection",
122238
+ skipAsATool: true
122239
+ },
122240
+ "protection.setEditingRestriction": {
122241
+ memberPath: "protection.setEditingRestriction",
122242
+ description: "Enable Word-style editing restriction on the document. Only readOnly mode is supported in v1.",
122243
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
122244
+ requiresDocumentContext: true,
122245
+ metadata: mutationOperation2({
122246
+ idempotency: "idempotent",
122247
+ supportsDryRun: true,
122248
+ supportsTrackedMode: false,
122249
+ possibleFailureCodes: ["NO_OP"],
122250
+ throws: T_PROTECTION_MUTATION2
122251
+ }),
122252
+ referenceDocPath: "protection/set-editing-restriction.mdx",
122253
+ referenceGroup: "protection",
122254
+ skipAsATool: true
122255
+ },
122256
+ "protection.clearEditingRestriction": {
122257
+ memberPath: "protection.clearEditingRestriction",
122258
+ description: "Disable document-level editing restriction by setting enforcement to off. Preserves the protection element and its metadata for round-trip fidelity.",
122259
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
122260
+ requiresDocumentContext: true,
122261
+ metadata: mutationOperation2({
122262
+ idempotency: "idempotent",
122263
+ supportsDryRun: true,
122264
+ supportsTrackedMode: false,
122265
+ possibleFailureCodes: ["NO_OP"],
122266
+ throws: T_PROTECTION_MUTATION2
122267
+ }),
122268
+ referenceDocPath: "protection/clear-editing-restriction.mdx",
122269
+ referenceGroup: "protection",
122270
+ skipAsATool: true
122271
+ },
122272
+ "permissionRanges.list": {
122273
+ memberPath: "permissionRanges.list",
122274
+ description: "List all permission ranges in the document. Returns only complete paired ranges (both start and end markers present).",
122275
+ expectedResult: "Returns a PermissionRangesListResult containing discovered permission ranges with principal and position data.",
122276
+ requiresDocumentContext: true,
122277
+ metadata: readOperation2({ throws: T_PERM_RANGE_READ2 }),
122278
+ referenceDocPath: "permission-ranges/list.mdx",
122279
+ referenceGroup: "permissionRanges",
122280
+ skipAsATool: true
122281
+ },
122282
+ "permissionRanges.get": {
122283
+ memberPath: "permissionRanges.get",
122284
+ description: "Get detailed information about a specific permission range by ID.",
122285
+ expectedResult: "Returns a PermissionRangeInfo object with the range principal, kind, and positions.",
122286
+ requiresDocumentContext: true,
122287
+ metadata: readOperation2({ throws: T_PERM_RANGE_READ2 }),
122288
+ referenceDocPath: "permission-ranges/get.mdx",
122289
+ referenceGroup: "permissionRanges",
122290
+ skipAsATool: true
122291
+ },
122292
+ "permissionRanges.create": {
122293
+ memberPath: "permissionRanges.create",
122294
+ description: "Create a permission range exception region in the document. Inserts matched permStart/permEnd markers at the target.",
122295
+ expectedResult: "Returns a PermissionRangeMutationResult with the created range info on success.",
122296
+ requiresDocumentContext: true,
122297
+ metadata: mutationOperation2({
122298
+ idempotency: "non-idempotent",
122299
+ supportsDryRun: true,
122300
+ supportsTrackedMode: false,
122301
+ possibleFailureCodes: NONE_FAILURES2,
122302
+ throws: T_PERM_RANGE_MUTATION2
122303
+ }),
122304
+ referenceDocPath: "permission-ranges/create.mdx",
122305
+ referenceGroup: "permissionRanges",
122306
+ skipAsATool: true
122307
+ },
122308
+ "permissionRanges.remove": {
122309
+ memberPath: "permissionRanges.remove",
122310
+ description: "Remove a permission range by ID. Removes whichever markers exist for the given ID (start, end, or both).",
122311
+ expectedResult: "Returns a PermissionRangeRemoveResult indicating success or a failure.",
122312
+ requiresDocumentContext: true,
122313
+ metadata: mutationOperation2({
122314
+ idempotency: "idempotent",
122315
+ supportsDryRun: true,
122316
+ supportsTrackedMode: false,
122317
+ possibleFailureCodes: NONE_FAILURES2,
122318
+ throws: T_PERM_RANGE_MUTATION2
122319
+ }),
122320
+ referenceDocPath: "permission-ranges/remove.mdx",
122321
+ referenceGroup: "permissionRanges",
122322
+ skipAsATool: true
122323
+ },
122324
+ "permissionRanges.updatePrincipal": {
122325
+ memberPath: "permissionRanges.updatePrincipal",
122326
+ description: "Change which principal is allowed to edit a permission range. Updates the principal fields on the start marker.",
122327
+ expectedResult: "Returns a PermissionRangeMutationResult with the updated range info on success.",
122328
+ requiresDocumentContext: true,
122329
+ metadata: mutationOperation2({
122330
+ idempotency: "idempotent",
122331
+ supportsDryRun: true,
122332
+ supportsTrackedMode: false,
122333
+ possibleFailureCodes: NONE_FAILURES2,
122334
+ throws: T_PERM_RANGE_MUTATION2
122335
+ }),
122336
+ referenceDocPath: "permission-ranges/update-principal.mdx",
122337
+ referenceGroup: "permissionRanges",
122338
+ skipAsATool: true
121583
122339
  }
121584
122340
  };
121585
122341
  OPERATION_IDS2 = Object.freeze(Object.keys(OPERATION_DEFINITIONS2));
@@ -127226,7 +127982,64 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127226
127982
  }, ["at", "entry"]), { ...authorityEntryMutation2 }, objectSchema2({
127227
127983
  target: authorityEntryAddressSchema2,
127228
127984
  patch: authorityEntryPatchSchema2
127229
- }, ["target", "patch"]), { ...authorityEntryMutation2 }, objectSchema2({ target: authorityEntryAddressSchema2 }, ["target"]), { ...authorityEntryMutation2 }, objectSchema2({}), objectSchema2({ targetSnapshot: diffSnapshotSchema2 }, ["targetSnapshot"]), objectSchema2({ diff: diffPayloadSchema2 }, ["diff"]);
127985
+ }, ["target", "patch"]), { ...authorityEntryMutation2 }, objectSchema2({ target: authorityEntryAddressSchema2 }, ["target"]), { ...authorityEntryMutation2 }, objectSchema2({}), objectSchema2({ targetSnapshot: diffSnapshotSchema2 }, ["targetSnapshot"]), objectSchema2({ diff: diffPayloadSchema2 }, ["diff"]), objectSchema2({}), objectSchema2({
127986
+ editingRestriction: objectSchema2({
127987
+ mode: {
127988
+ type: "string",
127989
+ enum: [
127990
+ "none",
127991
+ "readOnly",
127992
+ "comments",
127993
+ "trackedChanges",
127994
+ "forms"
127995
+ ]
127996
+ },
127997
+ enforced: { type: "boolean" },
127998
+ runtimeEnforced: { type: "boolean" },
127999
+ passwordProtected: { type: "boolean" },
128000
+ formattingRestricted: { type: "boolean" }
128001
+ }, [
128002
+ "mode",
128003
+ "enforced",
128004
+ "runtimeEnforced",
128005
+ "passwordProtected",
128006
+ "formattingRestricted"
128007
+ ]),
128008
+ writeProtection: objectSchema2({
128009
+ enabled: { type: "boolean" },
128010
+ passwordProtected: { type: "boolean" }
128011
+ }, ["enabled", "passwordProtected"]),
128012
+ readOnlyRecommended: { type: "boolean" }
128013
+ }, [
128014
+ "editingRestriction",
128015
+ "writeProtection",
128016
+ "readOnlyRecommended"
128017
+ ]), objectSchema2({
128018
+ mode: {
128019
+ type: "string",
128020
+ enum: ["readOnly"]
128021
+ },
128022
+ formattingRestricted: { type: "boolean" }
128023
+ }, ["mode"]), objectSchema2({}), objectSchema2({ id: { type: "string" } }, ["id"]), objectSchema2({
128024
+ target: selectionTargetSchema2,
128025
+ principal: objectSchema2({
128026
+ kind: {
128027
+ type: "string",
128028
+ enum: ["everyone", "editor"]
128029
+ },
128030
+ id: { type: "string" }
128031
+ }, ["kind"]),
128032
+ id: { type: "string" }
128033
+ }, ["target", "principal"]), objectSchema2({ id: { type: "string" } }, ["id"]), objectSchema2({
128034
+ id: { type: "string" },
128035
+ principal: objectSchema2({
128036
+ kind: {
128037
+ type: "string",
128038
+ enum: ["everyone", "editor"]
128039
+ },
128040
+ id: { type: "string" }
128041
+ }, ["kind"])
128042
+ }, ["id", "principal"]);
127230
128043
  projectFromDefinitions2((_id, entry) => entry.memberPath);
127231
128044
  [...new Set(OPERATION_IDS2.map((id2) => OPERATION_DEFINITIONS2[id2].memberPath))];
127232
128045
  projectFromDefinitions2((_id, entry) => entry.referenceDocPath);
@@ -127385,6 +128198,16 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127385
128198
  title: "Diff",
127386
128199
  description: "Snapshot-based document comparison and replay.",
127387
128200
  pagePath: "diff/index.mdx"
128201
+ },
128202
+ protection: {
128203
+ title: "Protection",
128204
+ description: "Document-level protection state and editing restriction operations.",
128205
+ pagePath: "protection/index.mdx"
128206
+ },
128207
+ permissionRanges: {
128208
+ title: "Permission Ranges",
128209
+ description: "Permission range exception operations for protected documents.",
128210
+ pagePath: "permission-ranges/index.mdx"
127388
128211
  }
127389
128212
  };
127390
128213
  Object.keys(GROUP_METADATA2).map((key) => ({
@@ -127743,12 +128566,27 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127743
128566
  "setAttr",
127744
128567
  "removeAttr"
127745
128568
  ]);
128569
+ VALID_SET_MODES2 = new Set(["readOnly"]);
127746
128570
  VALID_CREATE_LOCATION_KINDS2 = new Set([
127747
128571
  "documentStart",
127748
128572
  "documentEnd",
127749
128573
  "before",
127750
128574
  "after"
127751
128575
  ]);
128576
+ DEFAULT_PROTECTION_STATE = {
128577
+ editingRestriction: {
128578
+ mode: "none",
128579
+ enforced: false,
128580
+ runtimeEnforced: false,
128581
+ passwordProtected: false,
128582
+ formattingRestricted: false
128583
+ },
128584
+ writeProtection: {
128585
+ enabled: false,
128586
+ passwordProtected: false
128587
+ },
128588
+ readOnlyRecommended: false
128589
+ };
127752
128590
  ADAPTER_GATED_PREFIXES2 = [
127753
128591
  "bookmarks",
127754
128592
  "footnotes",
@@ -148926,6 +149764,12 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
148926
149764
  "both"
148927
149765
  ];
148928
149766
  readSectPrHeaderFooterRefs = readSectPrRefsByKind;
149767
+ VALID_EDIT_MODES = new Set([
149768
+ "readOnly",
149769
+ "comments",
149770
+ "trackedChanges",
149771
+ "forms"
149772
+ ]);
148929
149773
  RELATIONSHIP_ID_PATTERN = /^rId(\d+)$/;
148930
149774
  HEADER_FILE_PATTERN = /^word\/header(\d+)\.xml$/;
148931
149775
  FOOTER_FILE_PATTERN = /^word\/footer(\d+)\.xml$/;
@@ -171649,7 +172493,7 @@ var init_remark_gfm_CjV8kaUy_es = __esm(() => {
171649
172493
  init_remark_gfm_z_sDF4ss_es();
171650
172494
  });
171651
172495
 
171652
- // ../../packages/superdoc/dist/chunks/src-Lvsnnb5c.es.js
172496
+ // ../../packages/superdoc/dist/chunks/src-CeG3wOI4.es.js
171653
172497
  function deleteProps(obj, propOrProps) {
171654
172498
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
171655
172499
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -173676,11 +174520,11 @@ function syncSplitParagraphRunProperties(attrs, runProperties) {
173676
174520
  paragraphProperties: nextParagraphProperties
173677
174521
  };
173678
174522
  }
173679
- function getConverter$52(editor) {
174523
+ function getConverter$62(editor) {
173680
174524
  return editor.converter;
173681
174525
  }
173682
174526
  function readTranslatedLinkedStyles(editor) {
173683
- return getConverter$52(editor)?.translatedLinkedStyles ?? null;
174527
+ return getConverter$62(editor)?.translatedLinkedStyles ?? null;
173684
174528
  }
173685
174529
  function isHeadingStyleId$1(styleId) {
173686
174530
  return typeof styleId === "string" && /^heading\s*[1-6]$/i.test(styleId.trim());
@@ -207526,7 +208370,7 @@ function tablesSetDefaultStyleAdapter(editor, input2, options) {
207526
208370
  throw new DocumentApiAdapterError("INVALID_INPUT", `tables.setDefaultStyle: "${input2.styleId}" is not a known table style.`);
207527
208371
  return mutatePart({
207528
208372
  editor,
207529
- partId: SETTINGS_PART,
208373
+ partId: SETTINGS_PART$1,
207530
208374
  operation: "mutate",
207531
208375
  source: "tables.setDefaultStyle",
207532
208376
  dryRun: options?.dryRun === true,
@@ -207548,7 +208392,7 @@ function tablesClearDefaultStyleAdapter(editor, _input, options) {
207548
208392
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "tables.clearDefaultStyle requires an active document converter.");
207549
208393
  return mutatePart({
207550
208394
  editor,
207551
- partId: SETTINGS_PART,
208395
+ partId: SETTINGS_PART$1,
207552
208396
  operation: "mutate",
207553
208397
  source: "tables.clearDefaultStyle",
207554
208398
  dryRun: options?.dryRun === true,
@@ -207968,10 +208812,10 @@ function registerBuiltInExecutors() {
207968
208812
  };
207969
208813
  } });
207970
208814
  }
207971
- function getConverter$42(editor) {
208815
+ function getConverter$52(editor) {
207972
208816
  return editor.converter;
207973
208817
  }
207974
- function getConverter$32(editor) {
208818
+ function getConverter$42(editor) {
207975
208819
  return editor.converter;
207976
208820
  }
207977
208821
  function createEmptyHeaderFooterJson() {
@@ -207984,7 +208828,7 @@ function createEmptyHeaderFooterJson() {
207984
208828
  };
207985
208829
  }
207986
208830
  function syncHeaderFooterCaches(editor, part) {
207987
- const converter = getConverter$32(editor);
208831
+ const converter = getConverter$42(editor);
207988
208832
  if (!converter)
207989
208833
  return;
207990
208834
  const relsRoot = part?.elements?.find((el) => el.name === "Relationships");
@@ -208046,7 +208890,7 @@ function createTableWrapper(editor, input2, options) {
208046
208890
  });
208047
208891
  return adapterResult;
208048
208892
  }
208049
- function getConverter$22(editor) {
208893
+ function getConverter$32(editor) {
208050
208894
  return editor.converter;
208051
208895
  }
208052
208896
  function toSectionFailure2(code7, message) {
@@ -208114,7 +208958,7 @@ function buildSectionMarginsForAttrs2(sectPr) {
208114
208958
  };
208115
208959
  }
208116
208960
  function syncConverterBodySection2(editor, sectPr) {
208117
- const converter = getConverter$22(editor);
208961
+ const converter = getConverter$32(editor);
208118
208962
  if (!converter)
208119
208963
  return;
208120
208964
  converter.bodySectPr = cloneXmlElement(sectPr);
@@ -208234,7 +209078,7 @@ function createSectionBreakNode(editor, breakParagraphId, input2) {
208234
209078
  return paragraphNode;
208235
209079
  }
208236
209080
  function updateGlobalTitlePageFlag(editor) {
208237
- const converter = getConverter$22(editor);
209081
+ const converter = getConverter$32(editor);
208238
209082
  if (!converter)
208239
209083
  return;
208240
209084
  const anyTitlePage = resolveSectionProjections(editor).some((entry) => entry.domain.titlePage === true);
@@ -208318,7 +209162,7 @@ function sectionsSetTitlePageAdapter(editor, input2, options) {
208318
209162
  }
208319
209163
  function sectionsSetOddEvenHeadersFootersAdapter(editor, input2, options) {
208320
209164
  rejectTrackedMode("sections.setOddEvenHeadersFooters", options);
208321
- const converter = getConverter$22(editor);
209165
+ const converter = getConverter$32(editor);
208322
209166
  if (!converter)
208323
209167
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "sections.setOddEvenHeadersFooters requires an active document converter.");
208324
209168
  return mutatePart({
@@ -208354,13 +209198,13 @@ function sectionsSetSectionDirectionAdapter(editor, input2, options) {
208354
209198
  }
208355
209199
  function sectionsSetHeaderFooterRefAdapter(editor, input2, options) {
208356
209200
  return sectionMutationBySectPr$1(editor, input2, options, "sections.setHeaderFooterRef", (sectPr, _projection, _sections, dryRun) => {
208357
- const converter = getConverter$22(editor) ?? null;
209201
+ const converter = getConverter$32(editor) ?? null;
208358
209202
  return setHeaderFooterRefMutation(sectPr, input2.kind, input2.variant, input2.refId, converter, "sections.setHeaderFooterRef", dryRun);
208359
209203
  });
208360
209204
  }
208361
209205
  function sectionsClearHeaderFooterRefAdapter(editor, input2, options) {
208362
209206
  return sectionMutationBySectPr$1(editor, input2, options, "sections.clearHeaderFooterRef", (sectPr, _projection, _sections, dryRun) => {
208363
- const converter = getConverter$22(editor) ?? null;
209207
+ const converter = getConverter$32(editor) ?? null;
208364
209208
  clearHeaderFooterRefMutation(sectPr, input2.kind, input2.variant, converter, dryRun);
208365
209209
  });
208366
209210
  }
@@ -212798,11 +213642,11 @@ function createContentControlsAdapter(editor) {
212798
213642
  create: (input2, options) => createWrapper(editor, input2, options)
212799
213643
  };
212800
213644
  }
212801
- function getConverter$12(editor) {
213645
+ function getConverter$22(editor) {
212802
213646
  return editor.converter;
212803
213647
  }
212804
- function requireConverter(editor, operationName) {
212805
- const converter = getConverter$12(editor);
213648
+ function requireConverter$1(editor, operationName) {
213649
+ const converter = getConverter$22(editor);
212806
213650
  if (!converter)
212807
213651
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", `${operationName} requires an active document converter.`);
212808
213652
  return converter;
@@ -212908,7 +213752,7 @@ function headerFootersResolveAdapter(editor, input2) {
212908
213752
  function headerFootersRefsSetAdapter(editor, input2, options) {
212909
213753
  const { section, headerFooterKind, variant } = input2.target;
212910
213754
  const result = sectionMutationBySectPr(editor, { target: section }, options, "headerFooters.refs.set", (sectPr, _projection, _sections, dryRun) => {
212911
- const converter = getConverter$12(editor) ?? null;
213755
+ const converter = getConverter$22(editor) ?? null;
212912
213756
  return setHeaderFooterRefMutation(sectPr, headerFooterKind, variant, input2.refId, converter, "headerFooters.refs.set", dryRun);
212913
213757
  });
212914
213758
  invalidateSlotRuntimesAfterRefChange(editor, result, options);
@@ -212917,7 +213761,7 @@ function headerFootersRefsSetAdapter(editor, input2, options) {
212917
213761
  function headerFootersRefsClearAdapter(editor, input2, options) {
212918
213762
  const { section, headerFooterKind, variant } = input2.target;
212919
213763
  const result = sectionMutationBySectPr(editor, { target: section }, options, "headerFooters.refs.clear", (sectPr, _projection, _sections, dryRun) => {
212920
- clearHeaderFooterRefMutation(sectPr, headerFooterKind, variant, getConverter$12(editor) ?? null, dryRun);
213764
+ clearHeaderFooterRefMutation(sectPr, headerFooterKind, variant, getConverter$22(editor) ?? null, dryRun);
212921
213765
  });
212922
213766
  invalidateSlotRuntimesAfterRefChange(editor, result, options);
212923
213767
  return result;
@@ -212965,7 +213809,7 @@ function extractPartIndex(kind, partPath) {
212965
213809
  return Number.isFinite(num) ? num : null;
212966
213810
  }
212967
213811
  function headerFootersPartsListAdapter(editor, query2) {
212968
- const converter = requireConverter(editor, "headerFooters.parts.list");
213812
+ const converter = requireConverter$1(editor, "headerFooters.parts.list");
212969
213813
  validatePaginationInput(query2?.offset, query2?.limit);
212970
213814
  const relationships = readRelationshipElements(converter);
212971
213815
  const sections = resolveSectionProjections(editor);
@@ -213053,7 +213897,7 @@ function toPartsMutationFailure(code7, message) {
213053
213897
  function headerFootersPartsCreateAdapter(editor, input2, options) {
213054
213898
  rejectTrackedMode("headerFooters.parts.create", options);
213055
213899
  checkRevision(editor, options?.expectedRevision);
213056
- const converter = requireConverter(editor, "headerFooters.parts.create");
213900
+ const converter = requireConverter$1(editor, "headerFooters.parts.create");
213057
213901
  if (input2.sourceRefId) {
213058
213902
  const sourceRel = readRelationshipElements(converter).find((rel) => String(rel.attributes?.Id ?? "") === input2.sourceRefId);
213059
213903
  if (!sourceRel)
@@ -213086,7 +213930,7 @@ function headerFootersPartsCreateAdapter(editor, input2, options) {
213086
213930
  function headerFootersPartsDeleteAdapter(editor, input2, options) {
213087
213931
  rejectTrackedMode("headerFooters.parts.delete", options);
213088
213932
  checkRevision(editor, options?.expectedRevision);
213089
- const converter = requireConverter(editor, "headerFooters.parts.delete");
213933
+ const converter = requireConverter$1(editor, "headerFooters.parts.delete");
213090
213934
  const refId = input2.target.refId;
213091
213935
  const targetRel = readRelationshipElements(converter).find((rel) => String(rel.attributes?.Id ?? "") === refId);
213092
213936
  if (!targetRel)
@@ -213411,6 +214255,402 @@ function bookmarksRemoveWrapper(editor, input2, options) {
213411
214255
  return bookmarkFailure("NO_OP", "Remove operation produced no change.");
213412
214256
  return bookmarkSuccess(address2);
213413
214257
  }
214258
+ function getConverter$12(editor) {
214259
+ return editor.converter ?? undefined;
214260
+ }
214261
+ function requireConverter(editor, operationName) {
214262
+ const converter = getConverter$12(editor);
214263
+ if (!converter)
214264
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", `${operationName} requires an active document converter.`);
214265
+ return converter;
214266
+ }
214267
+ function buildPreviewState(current, editingRestriction) {
214268
+ const { mode, enforced } = editingRestriction;
214269
+ return {
214270
+ editingRestriction: {
214271
+ mode,
214272
+ enforced,
214273
+ runtimeEnforced: mode === "readOnly" && enforced,
214274
+ passwordProtected: current.editingRestriction.passwordProtected,
214275
+ formattingRestricted: editingRestriction.formattingRestricted
214276
+ },
214277
+ writeProtection: current.writeProtection,
214278
+ readOnlyRecommended: current.readOnlyRecommended
214279
+ };
214280
+ }
214281
+ function protectionGetAdapter(editor) {
214282
+ const stored = getProtectionStorage(editor);
214283
+ if (stored?.initialized)
214284
+ return stored.state;
214285
+ const converter = getConverter$12(editor);
214286
+ return parseProtectionState(converter ? readSettingsRoot(converter) : null);
214287
+ }
214288
+ function protectionSetEditingRestrictionAdapter(editor, input2, options) {
214289
+ rejectTrackedMode("protection.setEditingRestriction", options);
214290
+ const converter = requireConverter(editor, "protection.setEditingRestriction");
214291
+ const result = mutatePart({
214292
+ editor,
214293
+ partId: SETTINGS_PART,
214294
+ operation: "mutate",
214295
+ source: "protection.setEditingRestriction",
214296
+ dryRun: options?.dryRun === true,
214297
+ expectedRevision: options?.expectedRevision,
214298
+ mutate({ part, dryRun: isDryRun }) {
214299
+ const currentState = parseProtectionState(readSettingsRoot(converter));
214300
+ const { editingRestriction } = currentState;
214301
+ if (editingRestriction.mode === input2.mode && editingRestriction.enforced === true && (input2.formattingRestricted === undefined || editingRestriction.formattingRestricted === input2.formattingRestricted))
214302
+ return {
214303
+ success: false,
214304
+ failure: {
214305
+ code: "NO_OP",
214306
+ message: "Editing restriction already matches the requested state."
214307
+ }
214308
+ };
214309
+ if (isDryRun)
214310
+ return {
214311
+ success: true,
214312
+ state: buildPreviewState(currentState, {
214313
+ mode: input2.mode,
214314
+ enforced: true,
214315
+ formattingRestricted: input2.formattingRestricted ?? currentState.editingRestriction.formattingRestricted
214316
+ })
214317
+ };
214318
+ const settingsRoot = ensureSettingsRoot(part);
214319
+ setDocumentProtection(settingsRoot, {
214320
+ mode: input2.mode,
214321
+ enforced: true,
214322
+ formattingRestricted: input2.formattingRestricted
214323
+ });
214324
+ const newState = parseProtectionState(settingsRoot);
214325
+ const protStorage = getProtectionStorage(editor);
214326
+ if (protStorage)
214327
+ protStorage.state = newState;
214328
+ editor.emit("protectionChanged", {
214329
+ editor,
214330
+ state: newState,
214331
+ source: "local-mutation"
214332
+ });
214333
+ return {
214334
+ success: true,
214335
+ state: newState
214336
+ };
214337
+ }
214338
+ });
214339
+ if (options?.dryRun !== true)
214340
+ applyEffectiveEditability(editor);
214341
+ return result.result;
214342
+ }
214343
+ function protectionClearEditingRestrictionAdapter(editor, _input, options) {
214344
+ rejectTrackedMode("protection.clearEditingRestriction", options);
214345
+ const converter = requireConverter(editor, "protection.clearEditingRestriction");
214346
+ const result = mutatePart({
214347
+ editor,
214348
+ partId: SETTINGS_PART,
214349
+ operation: "mutate",
214350
+ source: "protection.clearEditingRestriction",
214351
+ dryRun: options?.dryRun === true,
214352
+ expectedRevision: options?.expectedRevision,
214353
+ mutate({ part, dryRun: isDryRun }) {
214354
+ const currentState = parseProtectionState(readSettingsRoot(converter));
214355
+ if (!currentState.editingRestriction.enforced)
214356
+ return {
214357
+ success: false,
214358
+ failure: {
214359
+ code: "NO_OP",
214360
+ message: "Editing restriction is already not enforced."
214361
+ }
214362
+ };
214363
+ if (isDryRun)
214364
+ return {
214365
+ success: true,
214366
+ state: buildPreviewState(currentState, {
214367
+ mode: currentState.editingRestriction.mode,
214368
+ enforced: false,
214369
+ formattingRestricted: currentState.editingRestriction.formattingRestricted
214370
+ })
214371
+ };
214372
+ const settingsRoot = ensureSettingsRoot(part);
214373
+ clearDocumentProtectionEnforcement(settingsRoot);
214374
+ const newState = parseProtectionState(settingsRoot);
214375
+ const protStorage = getProtectionStorage(editor);
214376
+ if (protStorage)
214377
+ protStorage.state = newState;
214378
+ editor.emit("protectionChanged", {
214379
+ editor,
214380
+ state: newState,
214381
+ source: "local-mutation"
214382
+ });
214383
+ return {
214384
+ success: true,
214385
+ state: newState
214386
+ };
214387
+ }
214388
+ });
214389
+ if (options?.dryRun !== true)
214390
+ applyEffectiveEditability(editor);
214391
+ return result.result;
214392
+ }
214393
+ function pmPosToPosition(doc$12, pos) {
214394
+ const resolved = doc$12.resolve(pos);
214395
+ for (let depth = resolved.depth;depth >= 0; depth--) {
214396
+ const blockId = resolved.node(depth).attrs?.sdBlockId;
214397
+ if (blockId)
214398
+ return {
214399
+ blockId,
214400
+ offset: pos - resolved.start(depth)
214401
+ };
214402
+ }
214403
+ return {
214404
+ blockId: "",
214405
+ offset: pos
214406
+ };
214407
+ }
214408
+ function getPermRangesStorage(editor) {
214409
+ return editor.storage.permissionRanges;
214410
+ }
214411
+ function getAllRanges(editor) {
214412
+ return getPermRangesStorage(editor)?.allRanges ?? [];
214413
+ }
214414
+ function toRangeInfo(entry, doc$12) {
214415
+ return {
214416
+ id: entry.id,
214417
+ principal: entry.principal,
214418
+ kind: entry.kind,
214419
+ start: pmPosToPosition(doc$12, entry.from),
214420
+ end: pmPosToPosition(doc$12, entry.to)
214421
+ };
214422
+ }
214423
+ function principalToAttrs(principal) {
214424
+ if (principal.kind === "everyone")
214425
+ return { edGrp: "everyone" };
214426
+ return { ed: principal.id };
214427
+ }
214428
+ function generatePermissionId() {
214429
+ return String(Math.floor(Math.random() * 2000000000));
214430
+ }
214431
+ function permissionRangesListAdapter(editor, input2) {
214432
+ const revision = getRevision(editor);
214433
+ const doc$12 = editor.state.doc;
214434
+ const { total, items: paged } = paginate(getAllRanges(editor).map((entry) => buildDiscoveryItem(entry.id, buildResolvedHandle(`perm:${entry.id}`, "ephemeral", "ext:permissionRange"), toRangeInfo(entry, doc$12))), input2?.offset, input2?.limit);
214435
+ return buildDiscoveryResult({
214436
+ evaluatedRevision: revision,
214437
+ total,
214438
+ items: paged,
214439
+ page: {
214440
+ limit: input2?.limit ?? total,
214441
+ offset: input2?.offset ?? 0,
214442
+ returned: paged.length
214443
+ }
214444
+ });
214445
+ }
214446
+ function permissionRangesGetAdapter(editor, input2) {
214447
+ const entry = getAllRanges(editor).find((r$1) => r$1.id === input2.id);
214448
+ if (!entry)
214449
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${input2.id}' not found.`);
214450
+ return toRangeInfo(entry, editor.state.doc);
214451
+ }
214452
+ function permissionRangesCreateAdapter(editor, input2, options) {
214453
+ rejectTrackedMode("permissionRanges.create", options);
214454
+ const { target, principal, id: callerSuppliedId } = input2;
214455
+ const id2 = callerSuppliedId ?? generatePermissionId();
214456
+ if (getAllRanges(editor).some((r$1) => r$1.id === id2))
214457
+ throw new DocumentApiAdapterError("INVALID_INPUT", `Permission range ID '${id2}' already exists.`);
214458
+ const resolved = resolveSelectionTarget(editor, target);
214459
+ const from$1 = resolved.absFrom;
214460
+ const to = resolved.absTo;
214461
+ const doc$12 = editor.state.doc;
214462
+ if (from$1 >= to || from$1 < 0 || to > doc$12.content.size)
214463
+ throw new DocumentApiAdapterError("INVALID_TARGET", "Target range is invalid or empty.");
214464
+ const attrs = {
214465
+ id: id2,
214466
+ ...principalToAttrs(principal)
214467
+ };
214468
+ const $from = doc$12.resolve(from$1);
214469
+ const $to = doc$12.resolve(to);
214470
+ const spansMultipleBlocks = $from.parent !== $to.parent || $from.depth === 0;
214471
+ if (options?.dryRun)
214472
+ return {
214473
+ success: true,
214474
+ range: toRangeInfo({
214475
+ id: id2,
214476
+ principal,
214477
+ kind: spansMultipleBlocks ? "block" : "inline",
214478
+ from: from$1,
214479
+ to,
214480
+ startPos: from$1,
214481
+ endPos: to
214482
+ }, doc$12)
214483
+ };
214484
+ const { tr } = editor.state;
214485
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214486
+ tr.setMeta("addToHistory", false);
214487
+ setTrackChangesSkip(editor, tr);
214488
+ const schema = editor.state.schema;
214489
+ if (spansMultipleBlocks) {
214490
+ const startNode = schema.nodes.permStartBlock?.create(attrs);
214491
+ const endNode = schema.nodes.permEndBlock?.create({ id: id2 });
214492
+ if (!startNode || !endNode)
214493
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "Block-level permission range nodes are not available in the schema.");
214494
+ tr.insert(to, endNode);
214495
+ tr.insert(from$1, startNode);
214496
+ } else {
214497
+ const startNode = schema.nodes.permStart?.create(attrs);
214498
+ const endNode = schema.nodes.permEnd?.create({ id: id2 });
214499
+ if (!startNode || !endNode)
214500
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "Inline permission range nodes are not available in the schema.");
214501
+ tr.insert(to, endNode);
214502
+ tr.insert(from$1, startNode);
214503
+ }
214504
+ if (editor.view)
214505
+ editor.view.dispatch(tr);
214506
+ else
214507
+ editor.dispatch(tr);
214508
+ const created = getAllRanges(editor).find((r$1) => r$1.id === id2);
214509
+ if (created)
214510
+ return {
214511
+ success: true,
214512
+ range: toRangeInfo(created, editor.state.doc)
214513
+ };
214514
+ return {
214515
+ success: true,
214516
+ range: {
214517
+ id: id2,
214518
+ principal,
214519
+ kind: spansMultipleBlocks ? "block" : "inline",
214520
+ start: pmPosToPosition(editor.state.doc, from$1),
214521
+ end: pmPosToPosition(editor.state.doc, to)
214522
+ }
214523
+ };
214524
+ }
214525
+ function permissionRangesRemoveAdapter(editor, input2, options) {
214526
+ rejectTrackedMode("permissionRanges.remove", options);
214527
+ const { id: id2 } = input2;
214528
+ if (options?.dryRun) {
214529
+ if (!getAllRanges(editor).some((r$1) => r$1.id === id2)) {
214530
+ const hasMarker = findMarkerPositions(editor, id2);
214531
+ if (!hasMarker.start && !hasMarker.end)
214532
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${id2}' not found.`);
214533
+ }
214534
+ return {
214535
+ success: true,
214536
+ id: id2
214537
+ };
214538
+ }
214539
+ const positions = findMarkerPositions(editor, id2);
214540
+ if (!positions.start && !positions.end)
214541
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${id2}' not found.`);
214542
+ const { tr } = editor.state;
214543
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214544
+ tr.setMeta("addToHistory", false);
214545
+ setTrackChangesSkip(editor, tr);
214546
+ const toDelete = [...positions.end ? [positions.end] : [], ...positions.start ? [positions.start] : []].sort((a2, b$1) => b$1.pos - a2.pos);
214547
+ for (const marker of toDelete)
214548
+ tr.delete(marker.pos, marker.pos + marker.nodeSize);
214549
+ if (editor.view)
214550
+ editor.view.dispatch(tr);
214551
+ else
214552
+ editor.dispatch(tr);
214553
+ return {
214554
+ success: true,
214555
+ id: id2
214556
+ };
214557
+ }
214558
+ function permissionRangesUpdatePrincipalAdapter(editor, input2, options) {
214559
+ rejectTrackedMode("permissionRanges.updatePrincipal", options);
214560
+ const { id: id2, principal } = input2;
214561
+ const positions = findMarkerPositions(editor, id2);
214562
+ if (!positions.start)
214563
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range start marker '${id2}' not found.`);
214564
+ if (options?.dryRun) {
214565
+ const existing = getAllRanges(editor).find((r$1) => r$1.id === id2);
214566
+ if (existing)
214567
+ return {
214568
+ success: true,
214569
+ range: toRangeInfo({
214570
+ ...existing,
214571
+ principal
214572
+ }, editor.state.doc)
214573
+ };
214574
+ return {
214575
+ success: true,
214576
+ range: {
214577
+ id: id2,
214578
+ principal,
214579
+ kind: "inline",
214580
+ start: pmPosToPosition(editor.state.doc, positions.start.pos),
214581
+ end: pmPosToPosition(editor.state.doc, positions.start.pos)
214582
+ }
214583
+ };
214584
+ }
214585
+ const { tr } = editor.state;
214586
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214587
+ tr.setMeta("addToHistory", false);
214588
+ setTrackChangesSkip(editor, tr);
214589
+ const { pos, node: node3 } = positions.start;
214590
+ const newAttrs = {
214591
+ ...node3.attrs,
214592
+ ...principalToAttrs(principal),
214593
+ ...principal.kind === "everyone" ? { ed: undefined } : { edGrp: undefined }
214594
+ };
214595
+ tr.setNodeMarkup(pos, undefined, newAttrs);
214596
+ if (editor.view)
214597
+ editor.view.dispatch(tr);
214598
+ else
214599
+ editor.dispatch(tr);
214600
+ const updated = getAllRanges(editor).find((r$1) => r$1.id === id2);
214601
+ if (updated)
214602
+ return {
214603
+ success: true,
214604
+ range: toRangeInfo(updated, editor.state.doc)
214605
+ };
214606
+ return {
214607
+ success: true,
214608
+ range: {
214609
+ id: id2,
214610
+ principal,
214611
+ kind: "inline",
214612
+ start: pmPosToPosition(editor.state.doc, pos),
214613
+ end: pmPosToPosition(editor.state.doc, pos)
214614
+ }
214615
+ };
214616
+ }
214617
+ function setTrackChangesSkip(editor, tr) {
214618
+ try {
214619
+ const trackPlugin = editor.state.plugins.find((p$12) => p$12.key?.includes("trackChangesBase$"));
214620
+ if (trackPlugin)
214621
+ tr.setMeta(trackPlugin, { skip: true });
214622
+ } catch {}
214623
+ }
214624
+ function findMarkerPositions(editor, id2) {
214625
+ let start$1 = null;
214626
+ let end$1 = null;
214627
+ const permStartTypes = new Set(["permStart", "permStartBlock"]);
214628
+ const permEndTypes = new Set(["permEnd", "permEndBlock"]);
214629
+ editor.state.doc.descendants((node3, pos) => {
214630
+ if (start$1 && end$1)
214631
+ return false;
214632
+ const typeName = node3.type.name;
214633
+ if (node3.attrs?.id === id2) {
214634
+ if (permStartTypes.has(typeName))
214635
+ start$1 = {
214636
+ pos,
214637
+ nodeSize: node3.nodeSize,
214638
+ node: { attrs: { ...node3.attrs } }
214639
+ };
214640
+ else if (permEndTypes.has(typeName))
214641
+ end$1 = {
214642
+ pos,
214643
+ nodeSize: node3.nodeSize,
214644
+ node: { attrs: { ...node3.attrs } }
214645
+ };
214646
+ }
214647
+ return true;
214648
+ });
214649
+ return {
214650
+ start: start$1,
214651
+ end: end$1
214652
+ };
214653
+ }
213414
214654
  function isSpecialEntry(entry) {
213415
214655
  return SPECIAL_NOTE_TYPES.has(entry.type ?? "");
213416
214656
  }
@@ -216743,7 +217983,19 @@ function assembleDocumentApiAdapters(editor) {
216743
217983
  apply: (input2) => executePlan(editor, input2)
216744
217984
  },
216745
217985
  diff: createDiffAdapter(editor),
216746
- history: createHistoryAdapter(editor)
217986
+ history: createHistoryAdapter(editor),
217987
+ protection: {
217988
+ get: () => protectionGetAdapter(editor),
217989
+ setEditingRestriction: (input2, options) => protectionSetEditingRestrictionAdapter(editor, input2, options),
217990
+ clearEditingRestriction: (_input, options) => protectionClearEditingRestrictionAdapter(editor, undefined, options)
217991
+ },
217992
+ permissionRanges: {
217993
+ list: (input2) => permissionRangesListAdapter(editor, input2),
217994
+ get: (input2) => permissionRangesGetAdapter(editor, input2),
217995
+ create: (input2, options) => permissionRangesCreateAdapter(editor, input2, options),
217996
+ remove: (input2, options) => permissionRangesRemoveAdapter(editor, input2, options),
217997
+ updatePrincipal: (input2, options) => permissionRangesUpdatePrincipalAdapter(editor, input2, options)
217998
+ }
216747
217999
  };
216748
218000
  }
216749
218001
  function getDocumentApiAdapters(editor) {
@@ -236897,16 +238149,7 @@ var Node$13 = class Node$14 {
236897
238149
  return "default";
236898
238150
  }
236899
238151
  }
236900
- }, NodeResizer, PERMISSION_PLUGIN_KEY, EVERYONE_GROUP = "everyone", EMPTY_IDENTIFIER_SET, normalizeIdentifier2 = (value) => typeof value === "string" ? value.trim().toLowerCase() : "", buildAllowedIdentifierSet = (editor) => {
236901
- const email = normalizeIdentifier2(editor?.options?.user?.email);
236902
- if (!email)
236903
- return EMPTY_IDENTIFIER_SET;
236904
- const [localPart, domain2] = email.split("@");
236905
- if (!localPart || !domain2)
236906
- return EMPTY_IDENTIFIER_SET;
236907
- const formatted = `${domain2}\\${localPart}`;
236908
- return formatted ? new Set([formatted]) : EMPTY_IDENTIFIER_SET;
236909
- }, isEveryoneGroup = (value) => normalizeIdentifier2(value) === EVERYONE_GROUP, isRangeAllowedForUser = (attrs, allowedIdentifiers) => {
238152
+ }, NodeResizer, PERMISSION_MUTATION_META = "permissionRangeMutation", PERMISSION_PLUGIN_KEY, EVERYONE_GROUP = "everyone", EMPTY_IDENTIFIER_SET, normalizeIdentifier2 = (value) => typeof value === "string" ? value.trim().toLowerCase() : "", isEveryoneGroup = (value) => normalizeIdentifier2(value) === EVERYONE_GROUP, isRangeAllowedForUser = (attrs, allowedIdentifiers) => {
236910
238153
  if (!attrs)
236911
238154
  return false;
236912
238155
  if (isEveryoneGroup(attrs.edGrp))
@@ -236937,40 +238180,66 @@ var Node$13 = class Node$14 {
236937
238180
  endTypeSet: new Set(endTypes),
236938
238181
  allTypeSet: new Set([...startTypes, ...endTypes])
236939
238182
  };
236940
- }, getPermissionNodeId = (node3, pos, fallbackPrefix) => String(node3.attrs?.id ?? `${fallbackPrefix}-${pos}`), buildPermissionState = (doc$12, allowedIdentifiers = EMPTY_IDENTIFIER_SET, permTypes) => {
236941
- const ranges = [];
238183
+ }, getPermissionNodeId = (node3, pos, fallbackPrefix) => String(node3.attrs?.id ?? `${fallbackPrefix}-${pos}`), derivePrincipal = (attrs) => {
238184
+ if (isEveryoneGroup(attrs?.edGrp))
238185
+ return { kind: "everyone" };
238186
+ if (attrs?.ed)
238187
+ return {
238188
+ kind: "editor",
238189
+ id: String(attrs.ed)
238190
+ };
238191
+ return { kind: "everyone" };
238192
+ }, buildPermissionState = (doc$12, allowedIdentifiers = EMPTY_IDENTIFIER_SET, permTypes, protectionEnforced = false) => {
238193
+ const allRanges = [];
238194
+ const allowedRanges = [];
236942
238195
  const openRanges = /* @__PURE__ */ new Map;
236943
238196
  const startTypeSet = permTypes?.startTypeSet ?? /* @__PURE__ */ new Set;
236944
238197
  const endTypeSet = permTypes?.endTypeSet ?? /* @__PURE__ */ new Set;
238198
+ const blockStartType = doc$12.type.schema?.nodes?.["permStartBlock"];
238199
+ const blockEndType = doc$12.type.schema?.nodes?.["permEndBlock"];
236945
238200
  doc$12.descendants((node3, pos) => {
236946
238201
  if (startTypeSet.has(node3.type)) {
236947
238202
  const id2 = getPermissionNodeId(node3, pos, "permStart");
236948
238203
  openRanges.set(id2, {
236949
238204
  from: pos + node3.nodeSize,
236950
- attrs: node3.attrs ?? {}
238205
+ startPos: pos,
238206
+ attrs: node3.attrs ?? {},
238207
+ isBlock: node3.type === blockStartType
236951
238208
  });
236952
238209
  return false;
236953
238210
  }
236954
238211
  if (endTypeSet.has(node3.type)) {
236955
238212
  const id2 = getPermissionNodeId(node3, pos, "permEnd");
236956
238213
  const start$1 = openRanges.get(id2);
236957
- if (start$1 && isRangeAllowedForUser(start$1.attrs, allowedIdentifiers)) {
238214
+ if (start$1) {
236958
238215
  const to = Math.max(pos, start$1.from);
236959
- if (to > start$1.from)
236960
- ranges.push({
238216
+ if (to > start$1.from) {
238217
+ const isBlock = start$1.isBlock || node3.type === blockEndType;
238218
+ const entry = {
236961
238219
  id: id2,
236962
238220
  from: start$1.from,
236963
- to
236964
- });
236965
- }
236966
- if (start$1)
238221
+ to,
238222
+ startPos: start$1.startPos,
238223
+ endPos: pos,
238224
+ principal: derivePrincipal(start$1.attrs),
238225
+ kind: isBlock ? "block" : "inline",
238226
+ edGrp: start$1.attrs.edGrp,
238227
+ ed: start$1.attrs.ed
238228
+ };
238229
+ allRanges.push(entry);
238230
+ if (protectionEnforced && isRangeAllowedForUser(start$1.attrs, allowedIdentifiers))
238231
+ allowedRanges.push(entry);
238232
+ }
236967
238233
  openRanges.delete(id2);
238234
+ }
236968
238235
  return false;
236969
238236
  }
236970
238237
  });
236971
238238
  return {
236972
- ranges,
236973
- hasAllowedRanges: ranges.length > 0
238239
+ allRanges,
238240
+ allowedRanges,
238241
+ hasAllowedRanges: allowedRanges.length > 0,
238242
+ ranges: allowedRanges
236974
238243
  };
236975
238244
  }, collectPermissionTags = (doc$12, permStartTypes, permEndTypes) => {
236976
238245
  const tags = /* @__PURE__ */ new Map;
@@ -237038,7 +238307,7 @@ var Node$13 = class Node$14 {
237038
238307
  if (!allowedRanges?.length)
237039
238308
  return false;
237040
238309
  return allowedRanges.some((allowed) => range.from >= allowed.from && range.to <= allowed.to);
237041
- }, PermissionRanges, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
238310
+ }, PermissionRanges, Protection, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
237042
238311
  if (!str.includes('"') && !str.includes("'"))
237043
238312
  return str.split(delimiter).map((p$12) => p$12.trim()).filter(Boolean);
237044
238313
  const parts = [];
@@ -240765,6 +242034,7 @@ var Node$13 = class Node$14 {
240765
242034
  PermStartBlock,
240766
242035
  PermEndBlock,
240767
242036
  PermissionRanges,
242037
+ Protection,
240768
242038
  VerticalNavigation,
240769
242039
  PassthroughInline,
240770
242040
  PassthroughBlock,
@@ -242133,11 +243403,16 @@ var Node$13 = class Node$14 {
242133
243403
  });
242134
243404
  return Object.fromEntries(markEntries);
242135
243405
  }
242136
- }, Commands, handleEnter = (editor) => {
243406
+ }, Commands, dispatchHistoryBoundary = (view) => {
243407
+ const tr = view?.state?.tr;
243408
+ if (!tr)
243409
+ return;
243410
+ view.dispatch?.(closeHistory(tr));
243411
+ }, handleEnter = (editor) => {
242137
243412
  const { view } = editor;
242138
- view?.dispatch?.(closeHistory(view?.state?.tr));
243413
+ dispatchHistoryBoundary(view);
242139
243414
  return editor.commands.first(({ commands: commands$1 }) => [
242140
- () => commands$1.splitRunToParagraph(),
243415
+ () => commands$1.splitRunToParagraph?.() ?? false,
242141
243416
  () => commands$1.newlineInCode(),
242142
243417
  () => commands$1.createParagraphNear(),
242143
243418
  () => commands$1.liftEmptyBlock(),
@@ -242145,7 +243420,7 @@ var Node$13 = class Node$14 {
242145
243420
  ]);
242146
243421
  }, handleBackspace = (editor) => {
242147
243422
  const { view } = editor;
242148
- view?.dispatch?.(closeHistory(view?.state?.tr));
243423
+ dispatchHistoryBoundary(view);
242149
243424
  return editor.commands.first(({ commands: commands$1, tr }) => [
242150
243425
  () => commands$1.undoInputRule(),
242151
243426
  () => {
@@ -242163,7 +243438,7 @@ var Node$13 = class Node$14 {
242163
243438
  ]);
242164
243439
  }, handleDelete2 = (editor) => {
242165
243440
  const { view } = editor;
242166
- view?.dispatch?.(closeHistory(view?.state?.tr));
243441
+ dispatchHistoryBoundary(view);
242167
243442
  return editor.commands.first(({ commands: commands$1 }) => [
242168
243443
  () => commands$1.deleteSkipEmptyRun(),
242169
243444
  () => commands$1.deleteNextToRun(),
@@ -243080,7 +244355,7 @@ var Node$13 = class Node$14 {
243080
244355
  console.warn("Failed to initialize developer tools:", error3);
243081
244356
  }
243082
244357
  }
243083
- }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, SNAPSHOT_VERSION3 = "sd-diff-snapshot/v1", PAYLOAD_VERSION3 = "sd-diff-payload/v1", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, EXCLUDED_PLUGIN_KEY_REF_LIST, EXCLUDED_PLUGIN_KEY_REFS, EXCLUDED_PLUGIN_KEY_PREFIXES, TEXT_RANGE_BLOCK_SEP = `
244358
+ }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART$1 = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, SNAPSHOT_VERSION3 = "sd-diff-snapshot/v1", PAYLOAD_VERSION3 = "sd-diff-payload/v1", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SETTINGS_PART, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, EXCLUDED_PLUGIN_KEY_REF_LIST, EXCLUDED_PLUGIN_KEY_REFS, EXCLUDED_PLUGIN_KEY_PREFIXES, TEXT_RANGE_BLOCK_SEP = `
243084
244359
  `, TEXT_RANGE_LEAF_SEP = `
243085
244360
  `, DecorationBridge = class DecorationBridge2 {
243086
244361
  #applied = /* @__PURE__ */ new WeakMap;
@@ -252627,9 +253902,9 @@ var Node$13 = class Node$14 {
252627
253902
  return;
252628
253903
  console.log(...args$1);
252629
253904
  }, HEADER_FOOTER_INIT_BUDGET_MS = 200, MAX_ZOOM_WARNING_THRESHOLD = 10, MAX_SELECTION_RECTS_PER_USER = 100, SEMANTIC_RESIZE_DEBOUNCE_MS = 120, MIN_SEMANTIC_CONTENT_WIDTH_PX = 1, GLOBAL_PERFORMANCE, PresentationEditor, ICONS, TEXTS, tableActionsOptions;
252630
- var init_src_Lvsnnb5c_es = __esm(() => {
253905
+ var init_src_CeG3wOI4_es = __esm(() => {
252631
253906
  init_rolldown_runtime_B2q5OVn9_es();
252632
- init_SuperConverter_OPfy6vj2_es();
253907
+ init_SuperConverter_CMIR0kxi_es();
252633
253908
  init_jszip_ChlR43oI_es();
252634
253909
  init_uuid_qzgm05fK_es();
252635
253910
  init_constants_Qqwopz80_es();
@@ -270507,75 +271782,49 @@ function print() { __p += __j.call(arguments, '') }
270507
271782
  name: "permissionRanges",
270508
271783
  addStorage() {
270509
271784
  return {
270510
- ranges: [],
270511
- hasAllowedRanges: false
271785
+ allRanges: [],
271786
+ allowedRanges: [],
271787
+ hasAllowedRanges: false,
271788
+ ranges: []
270512
271789
  };
270513
271790
  },
270514
271791
  addPmPlugins() {
270515
271792
  const editor = this.editor;
270516
271793
  const storage = this.storage;
270517
- let originalSetDocumentMode = null;
270518
- const getAllowedIdentifiers = () => buildAllowedIdentifierSet(editor);
270519
- const toggleEditableIfAllowed = (hasAllowedRanges) => {
270520
- if (!editor || editor.isDestroyed)
270521
- return;
270522
- if (editor.options.documentMode !== "viewing")
270523
- return;
270524
- if (hasAllowedRanges && !editor.isEditable)
270525
- editor.setEditable(true, false);
270526
- else if (!hasAllowedRanges && editor.isEditable)
270527
- editor.setEditable(false, false);
270528
- };
270529
- const updateEditableState = (hasAllowedRanges) => {
270530
- const nextValue = Boolean(hasAllowedRanges);
270531
- const previousValue = storage.hasAllowedRanges;
270532
- storage.hasAllowedRanges = nextValue;
270533
- if (previousValue === nextValue)
270534
- return;
270535
- toggleEditableIfAllowed(nextValue);
270536
- };
270537
- if (editor && typeof editor.setDocumentMode === "function") {
270538
- originalSetDocumentMode = editor.setDocumentMode.bind(editor);
270539
- editor.setDocumentMode = (mode, caller) => {
270540
- originalSetDocumentMode(mode, caller);
270541
- const state = editor.state;
270542
- if (!state)
270543
- return;
270544
- const pluginState = PERMISSION_PLUGIN_KEY.getState(state);
270545
- if (pluginState)
270546
- toggleEditableIfAllowed(pluginState.hasAllowedRanges);
270547
- };
270548
- }
271794
+ const getAllowedIdentifiers = () => buildAllowedIdentifierSetFromEditor(editor);
270549
271795
  return [new Plugin({
270550
271796
  key: PERMISSION_PLUGIN_KEY,
270551
271797
  state: {
270552
271798
  init(_$1, state) {
270553
271799
  const permissionTypeInfo = getPermissionTypeInfo(state.schema);
270554
- const permissionState = buildPermissionState(state.doc, getAllowedIdentifiers(), permissionTypeInfo);
271800
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
271801
+ const permissionState = buildPermissionState(state.doc, getAllowedIdentifiers(), permissionTypeInfo, protectionEnforced);
271802
+ storage.allRanges = permissionState.allRanges;
271803
+ storage.allowedRanges = permissionState.allowedRanges;
271804
+ storage.hasAllowedRanges = permissionState.hasAllowedRanges;
270555
271805
  storage.ranges = permissionState.ranges;
270556
- updateEditableState(permissionState.hasAllowedRanges);
271806
+ applyEffectiveEditability(editor, { refilterRanges: false });
270557
271807
  return permissionState;
270558
271808
  },
270559
271809
  apply(tr, value, _oldState, newState) {
270560
- let permissionState = value;
270561
- if (tr.docChanged) {
270562
- const permissionTypeInfo = getPermissionTypeInfo(newState.schema);
270563
- permissionState = buildPermissionState(newState.doc, getAllowedIdentifiers(), permissionTypeInfo);
270564
- storage.ranges = permissionState.ranges;
270565
- updateEditableState(permissionState.hasAllowedRanges);
270566
- }
271810
+ if (!tr.docChanged)
271811
+ return value;
271812
+ const permissionTypeInfo = getPermissionTypeInfo(newState.schema);
271813
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
271814
+ const permissionState = buildPermissionState(newState.doc, getAllowedIdentifiers(), permissionTypeInfo, protectionEnforced);
271815
+ storage.allRanges = permissionState.allRanges;
271816
+ storage.allowedRanges = permissionState.allowedRanges;
271817
+ storage.hasAllowedRanges = permissionState.hasAllowedRanges;
271818
+ storage.ranges = permissionState.ranges;
271819
+ applyEffectiveEditability(editor, { refilterRanges: false });
270567
271820
  return permissionState;
270568
271821
  }
270569
271822
  },
270570
- view() {
270571
- return { destroy() {
270572
- if (editor && originalSetDocumentMode)
270573
- editor.setDocumentMode = originalSetDocumentMode;
270574
- } };
270575
- },
270576
271823
  appendTransaction(transactions, oldState, newState) {
270577
271824
  if (!transactions.some((tr$1) => tr$1.docChanged))
270578
271825
  return null;
271826
+ if (transactions.some((tr$1) => tr$1.getMeta?.("permissionRangeMutation")))
271827
+ return null;
270579
271828
  if (transactions.some((tr$1) => tr$1.getMeta?.(ySyncPluginKey)))
270580
271829
  return null;
270581
271830
  const permTypes = getPermissionTypeInfo(newState.schema);
@@ -270635,11 +271884,15 @@ function print() { __p += __j.call(arguments, '') }
270635
271884
  return true;
270636
271885
  if (tr.getMeta?.(ySyncPluginKey))
270637
271886
  return true;
270638
- if (!editor || editor.options.documentMode !== "viewing")
271887
+ if (tr.getMeta?.("permissionRangeMutation"))
270639
271888
  return true;
270640
- const pluginState = PERMISSION_PLUGIN_KEY.getState(state);
270641
- if (!pluginState?.hasAllowedRanges)
271889
+ if (!editor)
271890
+ return true;
271891
+ if (!isReadOnlyProtectionRuntimeEnforced(editor))
270642
271892
  return true;
271893
+ const activeRanges = storage.allowedRanges ?? storage.ranges;
271894
+ if (!activeRanges?.length)
271895
+ return false;
270643
271896
  const changedRanges = collectChangedRanges(tr);
270644
271897
  if (!changedRanges.length)
270645
271898
  return true;
@@ -270647,12 +271900,35 @@ function print() { __p += __j.call(arguments, '') }
270647
271900
  if (!permTypes.startTypes.length || !permTypes.endTypes.length)
270648
271901
  return true;
270649
271902
  return changedRanges.every((range) => {
270650
- return isRangeAllowed(trimPermissionTagsFromRange(state.doc, range, permTypes.allTypeSet), pluginState.ranges);
271903
+ return isRangeAllowed(trimPermissionTagsFromRange(state.doc, range, permTypes.allTypeSet), activeRanges);
270651
271904
  });
270652
271905
  }
270653
271906
  })];
270654
271907
  }
270655
271908
  });
271909
+ Protection = Extension.create({
271910
+ name: "protection",
271911
+ addStorage() {
271912
+ return {
271913
+ state: {
271914
+ editingRestriction: {
271915
+ mode: "none",
271916
+ enforced: false,
271917
+ runtimeEnforced: false,
271918
+ passwordProtected: false,
271919
+ formattingRestricted: false
271920
+ },
271921
+ writeProtection: {
271922
+ enabled: false,
271923
+ passwordProtected: false
271924
+ },
271925
+ readOnlyRecommended: false
271926
+ },
271927
+ initialized: false,
271928
+ editableBaseline: null
271929
+ };
271930
+ }
271931
+ });
270656
271932
  FONT_FAMILY_FALLBACKS2 = Object.freeze({
270657
271933
  swiss: "Arial, sans-serif",
270658
271934
  roman: "Times New Roman, serif",
@@ -279444,7 +280720,7 @@ function print() { __p += __j.call(arguments, '') }
279444
280720
  stylesPartDescriptor = {
279445
280721
  id: STYLES_PART_ID,
279446
280722
  ensurePart(editor) {
279447
- const converter = getConverter$42(editor);
280723
+ const converter = getConverter$52(editor);
279448
280724
  if (converter?.convertedXml[STYLES_PART_ID])
279449
280725
  return converter.convertedXml[STYLES_PART_ID];
279450
280726
  return {
@@ -279459,7 +280735,7 @@ function print() { __p += __j.call(arguments, '') }
279459
280735
  },
279460
280736
  afterCommit(ctx$1) {
279461
280737
  if (ctx$1.source.startsWith("collab:remote:")) {
279462
- const converter = getConverter$42(ctx$1.editor);
280738
+ const converter = getConverter$52(ctx$1.editor);
279463
280739
  if (converter)
279464
280740
  try {
279465
280741
  converter.translatedLinkedStyles = translateStyleDefinitions(converter.convertedXml);
@@ -279679,6 +280955,7 @@ function print() { __p += __j.call(arguments, '') }
279679
280955
  KIND_ORDER = ["header", "footer"];
279680
280956
  HEADER_FILE_PATTERN2 = /header(\d+)\.xml$/;
279681
280957
  FOOTER_FILE_PATTERN2 = /footer(\d+)\.xml$/;
280958
+ SETTINGS_PART = SETTINGS_PART_PATH;
279682
280959
  SPECIAL_NOTE_TYPES = new Set(["separator", "continuationSeparator"]);
279683
280960
  RESTART_POLICY_TO_OOXML = {
279684
280961
  continuous: "continuous",
@@ -280051,6 +281328,7 @@ function print() { __p += __j.call(arguments, '') }
280051
281328
  this.setOptions(resolvedOptions);
280052
281329
  this.#createConverter();
280053
281330
  initPartsRuntime(this);
281331
+ this.#initProtectionState();
280054
281332
  this.#initMedia();
280055
281333
  const shouldMountRenderer = this.#shouldMountRenderer();
280056
281334
  if (shouldMountRenderer) {
@@ -280075,6 +281353,7 @@ function print() { __p += __j.call(arguments, '') }
280075
281353
  if (Boolean(this.options.markdown || this.options.html || this.options.loadFromSchema || this.options.jsonOverride || this.options.mode === "html" || this.options.mode === "text"))
280076
281354
  this.migrateListsToV2();
280077
281355
  this.setDocumentMode(this.options.documentMode, "init");
281356
+ this.#emitProtectionInit();
280078
281357
  this.initializeCollaborationData();
280079
281358
  if (!this.options.ydoc && !this.options.isChildEditor)
280080
281359
  this.#initComments();
@@ -280098,18 +281377,42 @@ function print() { __p += __j.call(arguments, '') }
280098
281377
  this.converter = undefined;
280099
281378
  if (this.storage.image)
280100
281379
  this.storage.image.media = {};
281380
+ const protStorageToReset = getProtectionStorage(this);
281381
+ if (protStorageToReset) {
281382
+ protStorageToReset.state = { ...DEFAULT_PROTECTION_STATE };
281383
+ protStorageToReset.initialized = false;
281384
+ protStorageToReset.editableBaseline = null;
281385
+ }
280101
281386
  this.#sourcePath = null;
280102
281387
  this.options.initialState = null;
280103
281388
  this.options.content = "";
280104
281389
  this.options.fileSource = null;
280105
281390
  this._state = undefined;
280106
281391
  }
281392
+ #initProtectionState() {
281393
+ const protStorage = getProtectionStorage(this);
281394
+ if (!protStorage)
281395
+ return;
281396
+ protStorage.state = parseProtectionState(this.converter ? readSettingsRoot(this.converter) : null);
281397
+ protStorage.initialized = true;
281398
+ }
281399
+ #emitProtectionInit() {
281400
+ const protStorage = getProtectionStorage(this);
281401
+ if (!protStorage?.initialized)
281402
+ return;
281403
+ this.emit("protectionChanged", {
281404
+ editor: this,
281405
+ state: protStorage.state,
281406
+ source: "init"
281407
+ });
281408
+ }
280107
281409
  #init() {
280108
281410
  this.#createExtensionService();
280109
281411
  this.#createCommandService();
280110
281412
  this.#createSchema();
280111
281413
  this.#createConverter();
280112
281414
  initPartsRuntime(this);
281415
+ this.#initProtectionState();
280113
281416
  this.#initMedia();
280114
281417
  this.on("beforeCreate", this.options.onBeforeCreate);
280115
281418
  this.emit("beforeCreate", { editor: this });
@@ -280153,6 +281456,7 @@ function print() { __p += __j.call(arguments, '') }
280153
281456
  if (Boolean(this.options.markdown || this.options.html || this.options.loadFromSchema || this.options.jsonOverride || this.options.mode === "html" || this.options.mode === "text"))
280154
281457
  this.migrateListsToV2();
280155
281458
  this.setDocumentMode(this.options.documentMode, "init");
281459
+ this.#emitProtectionInit();
280156
281460
  if (!this.options.ydoc && !this.options.isChildEditor)
280157
281461
  this.#initComments();
280158
281462
  if (shouldMountRenderer) {
@@ -280351,6 +281655,7 @@ function print() { __p += __j.call(arguments, '') }
280351
281655
  if (pm)
280352
281656
  pm.classList.remove("view-mode");
280353
281657
  }
281658
+ applyEffectiveEditability(this);
280354
281659
  }
280355
281660
  blur() {
280356
281661
  this.view?.dom?.blur();
@@ -284338,6 +285643,16 @@ function print() { __p += __j.call(arguments, '') }
284338
285643
  event: "commentsUpdate",
284339
285644
  handler: handleCommentsUpdate
284340
285645
  });
285646
+ const handleProtectionChanged = () => {
285647
+ this.#updatePermissionOverlay();
285648
+ this.#pendingDocChange = true;
285649
+ this.#scheduleRerender();
285650
+ };
285651
+ this.#editor.on("protectionChanged", handleProtectionChanged);
285652
+ this.#editorListeners.push({
285653
+ event: "protectionChanged",
285654
+ handler: handleProtectionChanged
285655
+ });
284341
285656
  }
284342
285657
  #setupCollaborationCursors() {
284343
285658
  this.#remoteCursorManager?.setup();
@@ -286364,6 +287679,9 @@ function print() { __p += __j.call(arguments, '') }
286364
287679
  this.#errorBannerMessage = null;
286365
287680
  }
286366
287681
  #isViewLocked() {
287682
+ const protectionStorage = this.#editor?.storage?.protection;
287683
+ if (protectionStorage?.initialized === true && protectionStorage?.state?.editingRestriction?.runtimeEnforced === true)
287684
+ return !!!this.#editor?.storage?.permissionRanges?.hasAllowedRanges;
286367
287685
  if (this.#documentMode !== "viewing")
286368
287686
  return false;
286369
287687
  if (!!this.#editor?.storage?.permissionRanges?.hasAllowedRanges)
@@ -286536,8 +287854,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
286536
287854
 
286537
287855
  // ../../packages/superdoc/dist/super-editor.es.js
286538
287856
  var init_super_editor_es = __esm(() => {
286539
- init_src_Lvsnnb5c_es();
286540
- init_SuperConverter_OPfy6vj2_es();
287857
+ init_src_CeG3wOI4_es();
287858
+ init_SuperConverter_CMIR0kxi_es();
286541
287859
  init_jszip_ChlR43oI_es();
286542
287860
  init_xml_js_40FWvL78_es();
286543
287861
  init_constants_Qqwopz80_es();
@@ -334956,6 +336274,25 @@ async function getFileChecksum(path2) {
334956
336274
  }
334957
336275
  return createHash2("sha256").update(bytes).digest("hex");
334958
336276
  }
336277
+ async function exportOptionalSessionOutput(editor, io, outPath, force) {
336278
+ if (!outPath)
336279
+ return;
336280
+ try {
336281
+ return { output: await exportToPath(editor, outPath, force) };
336282
+ } catch (error4) {
336283
+ const code7 = error4 instanceof CliError ? error4.code : "FILE_WRITE_ERROR";
336284
+ const message = error4 instanceof Error ? error4.message : String(error4);
336285
+ io.warn?.(`[warn] optional export to ${outPath} failed: ${message}
336286
+ `);
336287
+ return {
336288
+ warning: {
336289
+ code: code7,
336290
+ path: outPath,
336291
+ message
336292
+ }
336293
+ };
336294
+ }
336295
+ }
334959
336296
  async function exportToPath(editor, outputPath, force = false) {
334960
336297
  const exists = await pathExists(outputPath);
334961
336298
  if (exists && !force) {
@@ -336623,18 +337960,6 @@ function buildPrettyOutput2(operationId, document2, result2, outputPath) {
336623
337960
  const verb = SUCCESS_VERB[operationId];
336624
337961
  return outputPath ? `Revision ${document2.revision}: ${verb} -> ${outputPath}` : `Revision ${document2.revision}: ${verb}`;
336625
337962
  }
336626
- async function exportOptionalSessionOutput(editor, outPath, force) {
336627
- if (!outPath)
336628
- return;
336629
- try {
336630
- return await exportToPath(editor, outPath, force);
336631
- } catch (error4) {
336632
- const message = error4 instanceof Error ? error4.message : String(error4);
336633
- process.stderr.write(`[warn] optional export to ${outPath} failed: ${message}
336634
- `);
336635
- return;
336636
- }
336637
- }
336638
337963
  async function executeMutationOperation(request) {
336639
337964
  const { operationId, input: input2, context } = request;
336640
337965
  const doc4 = readOptionalString(input2, "doc");
@@ -336745,7 +338070,7 @@ async function executeMutationOperation(request) {
336745
338070
  await writeContextMetadata(paths, updatedMetadata);
336746
338071
  byteLength3 = workingOutput.byteLength;
336747
338072
  }
336748
- const externalOutput = await exportOptionalSessionOutput(opened.editor, outPath, force);
338073
+ const externalOutput = await exportOptionalSessionOutput(opened.editor, context.io, outPath, force);
336749
338074
  const document2 = {
336750
338075
  path: updatedMetadata.sourcePath,
336751
338076
  source: updatedMetadata.source,
@@ -336758,9 +338083,16 @@ async function executeMutationOperation(request) {
336758
338083
  changeMode,
336759
338084
  dryRun: false,
336760
338085
  context: { dirty: updatedMetadata.dirty, revision: updatedMetadata.revision },
336761
- output: externalOutput
338086
+ output: externalOutput?.output ?? (externalOutput?.warning ? {
338087
+ path: externalOutput.warning.path,
338088
+ failed: true,
338089
+ error: {
338090
+ code: externalOutput.warning.code,
338091
+ message: externalOutput.warning.message
338092
+ }
338093
+ } : undefined)
336762
338094
  }),
336763
- pretty: buildPrettyOutput2(operationId, document2, result2, externalOutput?.path)
338095
+ pretty: buildPrettyOutput2(operationId, document2, result2, externalOutput?.output?.path)
336764
338096
  };
336765
338097
  } finally {
336766
338098
  opened.dispose();
@@ -337083,7 +338415,8 @@ var init_command_examples = __esm(() => {
337083
338415
  insert: [
337084
338416
  'superdoc insert --value "Hello, world!"',
337085
338417
  'superdoc insert --block-id abc123 --value "Appended text"',
337086
- 'superdoc insert --type markdown --value "## New Section"'
338418
+ 'superdoc insert --type markdown --value "## New Section"',
338419
+ 'superdoc insert --block-id abc123 --offset 5 --type html --value "<br/>"'
337087
338420
  ],
337088
338421
  replace: [
337089
338422
  'superdoc replace --block-id abc123 --start 0 --end 5 --text "Updated"',
@@ -337143,7 +338476,10 @@ var init_command_examples = __esm(() => {
337143
338476
  "lists.setType": [
337144
338477
  `superdoc lists set-type --target-json '{"kind":"block","nodeType":"listItem","nodeId":"abc123"}' --kind bullet`
337145
338478
  ],
337146
- "format.apply": [`superdoc format apply --block-id abc123 --start 0 --end 10 --inline-json '{"bold":true}'`],
338479
+ "format.apply": [
338480
+ `superdoc format apply --block-id abc123 --start 0 --end 10 --inline-json '{"bold":true}'`,
338481
+ `superdoc format apply --block-id abc123 --start 7 --end 14 --inline-json '{"fontSize":16,"fontFamily":"Times New Roman"}'`
338482
+ ],
337147
338483
  "comments.create": ['superdoc comments create --block-id abc123 --start 0 --end 5 --text "Review this section"'],
337148
338484
  "comments.list": ["superdoc comments list"],
337149
338485
  "comments.get": ["superdoc comments get --id comment-123"],
@@ -337156,7 +338492,8 @@ var init_command_examples = __esm(() => {
337156
338492
  "history.undo": ["superdoc history undo"],
337157
338493
  "history.redo": ["superdoc history redo"],
337158
338494
  "mutations.apply": [
337159
- `superdoc mutations apply --atomic true --change-mode direct --steps-json '[{"id":"s1","op":"text.rewrite","where":{"by":"select","select":{"type":"text","pattern":"old"},"require":"first"},"args":{"replacement":{"text":"new"}}}]'`
338495
+ `superdoc mutations apply --atomic true --change-mode direct --steps-json '[{"id":"s1","op":"text.rewrite","where":{"by":"select","select":{"type":"text","pattern":"old"},"require":"first"},"args":{"replacement":{"text":"new"}}}]'`,
338496
+ `superdoc mutations apply --atomic true --change-mode direct --steps-json '[{"id":"s1","op":"text.insert","where":{"by":"target","target":{"kind":"selection","start":{"kind":"text","blockId":"abc123","offset":0},"end":{"kind":"text","blockId":"abc123","offset":0}}},"args":{"position":"before","content":{"text":"ALPHA01 "}}},{"id":"s2","op":"format.apply","where":{"by":"target","target":{"kind":"selection","start":{"kind":"text","blockId":"abc123","offset":8},"end":{"kind":"text","blockId":"abc123","offset":15}}},"args":{"inline":{"fontSize":16,"fontFamily":"Times New Roman"}}}]'`
337160
338497
  ],
337161
338498
  "mutations.preview": [
337162
338499
  `superdoc mutations preview --atomic true --change-mode direct --steps-json '[{"id":"s1","op":"text.rewrite","where":{"by":"select","select":{"type":"text","pattern":"old"},"require":"first"},"args":{"replacement":{"text":"new"}}}]'`
@@ -337222,9 +338559,11 @@ function buildHelpText() {
337222
338559
  const lines = ["Usage: superdoc <command> [options]", ""];
337223
338560
  lines.push("Common tasks:");
337224
338561
  lines.push(" Find mutation target → query match");
338562
+ lines.push(" Seed a synthetic doc → open --content-override ...");
337225
338563
  lines.push(" Insert between list items → lists insert");
337226
338564
  lines.push(" Create a paragraph → create paragraph");
337227
338565
  lines.push(" Insert inline text → insert");
338566
+ lines.push(" Insert a real tab → insert tab");
337228
338567
  lines.push(" Batch formatting changes → mutations apply");
337229
338568
  lines.push("");
337230
338569
  const categories = new Map;
@@ -337271,9 +338610,30 @@ var init_commands = __esm(() => {
337271
338610
  init_command_examples();
337272
338611
  init_operation_set();
337273
338612
  CLI_ONLY_OVERRIDES = {
337274
- open: { mutates: true, examples: ["superdoc open my-doc.docx", "superdoc open my-doc.docx --session my-session"] },
338613
+ open: {
338614
+ mutates: true,
338615
+ examples: [
338616
+ "superdoc open my-doc.docx",
338617
+ 'superdoc open --content-override "# Title\\n\\nBody text" --override-type markdown',
338618
+ "superdoc open template.docx --content-override '<p>ALPHA01</p><p>BRAVO02</p>' --override-type html"
338619
+ ]
338620
+ },
337275
338621
  save: { mutates: true, examples: ["superdoc save", "superdoc save --out copy.docx"] },
337276
338622
  close: { mutates: true, examples: ["superdoc close"] },
338623
+ insertTab: {
338624
+ mutates: true,
338625
+ examples: [
338626
+ "superdoc insert tab --block-id abc123 --offset 5",
338627
+ `superdoc insert tab --target-json '{"kind":"selection","start":{"kind":"text","blockId":"abc123","offset":5},"end":{"kind":"text","blockId":"abc123","offset":5}}'`
338628
+ ]
338629
+ },
338630
+ insertLineBreak: {
338631
+ mutates: true,
338632
+ examples: [
338633
+ "superdoc insert line-break --block-id abc123 --offset 5",
338634
+ `superdoc insert line-break --target-json '{"kind":"selection","start":{"kind":"text","blockId":"abc123","offset":5},"end":{"kind":"text","blockId":"abc123","offset":5}}'`
338635
+ ]
338636
+ },
337277
338637
  status: { mutates: false, examples: ["superdoc status"] },
337278
338638
  describe: { mutates: false, examples: ["superdoc describe"] },
337279
338639
  describeCommand: { mutates: false, examples: ["superdoc describe command find"] },
@@ -337676,7 +339036,7 @@ function deriveOptionSpecs(operationId, params4) {
337676
339036
  }
337677
339037
  return specs;
337678
339038
  }
337679
- var DOC_PARAM, SESSION_PARAM, OUT_PARAM, FORCE_PARAM, DRY_RUN_PARAM, CHANGE_MODE_PARAM, EXPECTED_REVISION_PARAM, USER_NAME_PARAM, USER_EMAIL_PARAM, PASSWORD_PARAM, AGENT_HIDDEN_PARAM_NAMES, OPERATION_CONSTRAINTS, PARAM_FLAG_OVERRIDES, DOC_FIND_SELECT_SCHEMA, PARAM_SCHEMA_OVERRIDES, PARAM_EXCLUSIONS, TEXT_TARGET_FLAT_PARAMS, TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN, LIST_TARGET_FLAT_PARAMS, FORMAT_OPERATION_IDS, EXTRA_CLI_PARAMS, CLI_ONLY_METADATA, CLI_OPERATION_METADATA, OPTION_FLAG_ALIASES, CLI_OPERATION_OPTION_SPECS;
339039
+ var DOC_PARAM, SESSION_PARAM, OUT_PARAM, FORCE_PARAM, DRY_RUN_PARAM, CHANGE_MODE_PARAM, EXPECTED_REVISION_PARAM, USER_NAME_PARAM, USER_EMAIL_PARAM, PASSWORD_PARAM, AGENT_HIDDEN_PARAM_NAMES, OPERATION_CONSTRAINTS, PARAM_FLAG_OVERRIDES, DOC_FIND_SELECT_SCHEMA, PARAM_SCHEMA_OVERRIDES, PARAM_EXCLUSIONS, TEXT_TARGET_FLAT_PARAMS, TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN, SELECTION_TARGET_JSON_PARAM, INSERT_REF_PARAM, LIST_TARGET_FLAT_PARAMS, FORMAT_OPERATION_IDS, EXTRA_CLI_PARAMS, CLI_ONLY_METADATA, CLI_OPERATION_METADATA, OPTION_FLAG_ALIASES, CLI_OPERATION_OPTION_SPECS;
337680
339040
  var init_operation_params = __esm(() => {
337681
339041
  init_src();
337682
339042
  init_commands();
@@ -337822,6 +339182,19 @@ var init_operation_params = __esm(() => {
337822
339182
  ...p4,
337823
339183
  agentVisible: false
337824
339184
  }));
339185
+ SELECTION_TARGET_JSON_PARAM = {
339186
+ name: "target",
339187
+ kind: "jsonFlag",
339188
+ flag: "target-json",
339189
+ type: "json",
339190
+ description: "Collapsed text insertion point as SelectionTarget JSON."
339191
+ };
339192
+ INSERT_REF_PARAM = {
339193
+ name: "ref",
339194
+ kind: "flag",
339195
+ type: "string",
339196
+ description: "Mutation-ready ref returned by query.match or ranges.resolve."
339197
+ };
337825
339198
  LIST_TARGET_FLAT_PARAMS = [
337826
339199
  { name: "nodeId", kind: "flag", flag: "node-id", type: "string", description: "Node ID of the target list item." }
337827
339200
  ];
@@ -338325,6 +339698,54 @@ var init_operation_params = __esm(() => {
338325
339698
  params: [SESSION_PARAM, { name: "discard", kind: "flag", type: "boolean" }],
338326
339699
  constraints: null
338327
339700
  },
339701
+ "doc.insertTab": {
339702
+ command: "insert tab",
339703
+ positionalParams: ["doc"],
339704
+ docRequirement: "none",
339705
+ params: [
339706
+ DOC_PARAM,
339707
+ SESSION_PARAM,
339708
+ OUT_PARAM,
339709
+ FORCE_PARAM,
339710
+ EXPECTED_REVISION_PARAM,
339711
+ SELECTION_TARGET_JSON_PARAM,
339712
+ INSERT_REF_PARAM,
339713
+ ...TEXT_TARGET_FLAT_PARAMS,
339714
+ {
339715
+ name: "offset",
339716
+ kind: "flag",
339717
+ type: "number",
339718
+ description: "Character offset for insertion (alias for --start/--end with the same value)."
339719
+ }
339720
+ ],
339721
+ constraints: {
339722
+ mutuallyExclusive: [["target", "ref"]]
339723
+ }
339724
+ },
339725
+ "doc.insertLineBreak": {
339726
+ command: "insert line-break",
339727
+ positionalParams: ["doc"],
339728
+ docRequirement: "none",
339729
+ params: [
339730
+ DOC_PARAM,
339731
+ SESSION_PARAM,
339732
+ OUT_PARAM,
339733
+ FORCE_PARAM,
339734
+ EXPECTED_REVISION_PARAM,
339735
+ SELECTION_TARGET_JSON_PARAM,
339736
+ INSERT_REF_PARAM,
339737
+ ...TEXT_TARGET_FLAT_PARAMS,
339738
+ {
339739
+ name: "offset",
339740
+ kind: "flag",
339741
+ type: "number",
339742
+ description: "Character offset for insertion (alias for --start/--end with the same value)."
339743
+ }
339744
+ ],
339745
+ constraints: {
339746
+ mutuallyExclusive: [["target", "ref"]]
339747
+ }
339748
+ },
338328
339749
  "doc.status": {
338329
339750
  command: "status",
338330
339751
  positionalParams: [],
@@ -339631,6 +341052,261 @@ var init_close = __esm(() => {
339631
341052
  init_context();
339632
341053
  });
339633
341054
 
341055
+ // src/commands/insert-inline-special.ts
341056
+ function isRecord7(value2) {
341057
+ return typeof value2 === "object" && value2 != null && !Array.isArray(value2);
341058
+ }
341059
+ function isSelectionTarget3(value2) {
341060
+ return isRecord7(value2) && value2.kind === "selection" && isRecord7(value2.start) && isRecord7(value2.end);
341061
+ }
341062
+ function isCollapsedTextSelectionTarget(target2) {
341063
+ return target2.start.kind === "text" && target2.end.kind === "text" && target2.start.blockId === target2.end.blockId && target2.start.offset === target2.end.offset;
341064
+ }
341065
+ function buildPrettyOutput3(kind2, revision, outputPath) {
341066
+ const label2 = COMMAND_BY_KIND[kind2].label;
341067
+ return outputPath ? `Revision ${revision}: inserted ${label2} -> ${outputPath}` : `Revision ${revision}: inserted ${label2}`;
341068
+ }
341069
+ async function resolveInsertionPoint(editor, input2, kind2) {
341070
+ const apiInput = extractInvokeInput("insert", input2);
341071
+ if (!isRecord7(apiInput)) {
341072
+ throw new CliError("INVALID_ARGUMENT", `insert ${COMMAND_BY_KIND[kind2].label}: invalid target input.`);
341073
+ }
341074
+ const ref4 = typeof apiInput.ref === "string" ? apiInput.ref : undefined;
341075
+ const rawTarget = apiInput.target;
341076
+ if (ref4) {
341077
+ const resolved = editor.doc.invoke({
341078
+ operationId: "ranges.resolve",
341079
+ input: {
341080
+ start: { kind: "ref", ref: ref4, boundary: "start" },
341081
+ end: { kind: "ref", ref: ref4, boundary: "start" }
341082
+ }
341083
+ });
341084
+ if (!isSelectionTarget3(resolved?.target) || !isCollapsedTextSelectionTarget(resolved.target)) {
341085
+ throw new CliError("INVALID_TARGET", `insert ${COMMAND_BY_KIND[kind2].label}: ref must resolve to a collapsed text insertion point.`);
341086
+ }
341087
+ const collapsedTarget = {
341088
+ kind: "text",
341089
+ blockId: resolved.target.start.blockId,
341090
+ range: { start: resolved.target.start.offset, end: resolved.target.start.offset }
341091
+ };
341092
+ const resolvedRange = resolveSelectionTarget(editor, resolved.target);
341093
+ return {
341094
+ target: collapsedTarget,
341095
+ range: { from: resolvedRange.absFrom, to: resolvedRange.absTo }
341096
+ };
341097
+ }
341098
+ if (rawTarget !== undefined) {
341099
+ if (!isSelectionTarget3(rawTarget)) {
341100
+ throw new CliError("INVALID_TARGET", `insert ${COMMAND_BY_KIND[kind2].label}: target must be a collapsed text selection.`);
341101
+ }
341102
+ const selectionTarget = rawTarget;
341103
+ if (!isCollapsedTextSelectionTarget(selectionTarget)) {
341104
+ throw new CliError("INVALID_TARGET", `insert ${COMMAND_BY_KIND[kind2].label}: target must be a collapsed text selection.`);
341105
+ }
341106
+ const resolvedRange = resolveSelectionTarget(editor, selectionTarget);
341107
+ return {
341108
+ target: {
341109
+ kind: "text",
341110
+ blockId: selectionTarget.start.blockId,
341111
+ range: { start: selectionTarget.start.offset, end: selectionTarget.start.offset }
341112
+ },
341113
+ range: { from: resolvedRange.absFrom, to: resolvedRange.absTo }
341114
+ };
341115
+ }
341116
+ const fallback = resolveDefaultInsertTarget(editor);
341117
+ if (!fallback) {
341118
+ throw new CliError("TARGET_NOT_FOUND", `insert ${COMMAND_BY_KIND[kind2].label}: no writable text block is available. Pass an explicit collapsed text target.`);
341119
+ }
341120
+ if (fallback.kind === "structural-end") {
341121
+ return {
341122
+ kind: "structural-end",
341123
+ target: { kind: "text", blockId: "", range: { start: 0, end: 0 } },
341124
+ insertPos: fallback.insertPos
341125
+ };
341126
+ }
341127
+ return {
341128
+ kind: "text-block",
341129
+ target: fallback.target,
341130
+ range: fallback.range
341131
+ };
341132
+ }
341133
+ function executeInlineSpecialInsert(editor, kind2, insertionPoint) {
341134
+ const commandName = kind2 === "tab" ? "insertTabNode" : "insertLineBreak";
341135
+ const commands2 = editor.commands;
341136
+ const command2 = commands2?.[commandName];
341137
+ if (typeof command2 !== "function") {
341138
+ throw new CliError("CAPABILITY_UNAVAILABLE", `insert ${COMMAND_BY_KIND[kind2].label}: ${commandName} is unavailable.`);
341139
+ }
341140
+ let chain = editor.chain();
341141
+ if (insertionPoint.kind === "structural-end") {
341142
+ if (typeof commands2?.insertParagraphAt !== "function") {
341143
+ throw new CliError("CAPABILITY_UNAVAILABLE", `insert ${COMMAND_BY_KIND[kind2].label}: insertParagraphAt is unavailable.`);
341144
+ }
341145
+ chain = chain.insertParagraphAt({ pos: insertionPoint.insertPos, tracked: false }).setTextSelection({ from: insertionPoint.insertPos + 1, to: insertionPoint.insertPos + 1 });
341146
+ } else {
341147
+ const { from: from5, to } = insertionPoint.range;
341148
+ if (from5 !== to) {
341149
+ throw new CliError("INVALID_TARGET", `insert ${COMMAND_BY_KIND[kind2].label}: target must be collapsed to a single insertion point.`);
341150
+ }
341151
+ chain = chain.setMeta("inputType", "programmatic").setMeta("skipTrackChanges", true).setTextSelection({ from: from5, to });
341152
+ }
341153
+ chain = kind2 === "tab" ? chain.insertTabNode() : chain.insertLineBreak();
341154
+ if (chain.run() !== true) {
341155
+ throw new CliError("COMMAND_FAILED", `insert ${COMMAND_BY_KIND[kind2].label}: editor command returned false.`);
341156
+ }
341157
+ }
341158
+ function buildSuccessData(kind2, document2, target2, revision, output) {
341159
+ return {
341160
+ document: document2,
341161
+ receipt: {
341162
+ success: true,
341163
+ resolution: {
341164
+ target: target2
341165
+ }
341166
+ },
341167
+ inserted: { kind: kind2 },
341168
+ context: { dirty: true, revision },
341169
+ output: output?.output ?? (output?.warning ? {
341170
+ path: output.warning.path,
341171
+ failed: true,
341172
+ error: {
341173
+ code: output.warning.code,
341174
+ message: output.warning.message
341175
+ }
341176
+ } : undefined)
341177
+ };
341178
+ }
341179
+ async function runInsertInlineSpecial(kind2, tokens, context) {
341180
+ const commandSpec = COMMAND_BY_KIND[kind2];
341181
+ const { parsed, help } = parseOperationArgs(commandSpec.operationId, tokens, {
341182
+ commandName: `insert ${kind2 === "tab" ? "tab" : "line-break"}`
341183
+ });
341184
+ if (help || getBooleanOption(parsed, "help")) {
341185
+ return {
341186
+ command: kind2 === "tab" ? "insert tab" : "insert line-break",
341187
+ data: {
341188
+ usage: [
341189
+ `superdoc insert ${kind2 === "tab" ? "tab" : "line-break"} [doc] [--target-json '{...}'|--block-id <id> --offset <n>]`,
341190
+ `superdoc insert ${kind2 === "tab" ? "tab" : "line-break"} [doc] [--ref <ref>] [--out <path>]`
341191
+ ]
341192
+ },
341193
+ pretty: [
341194
+ "Usage:",
341195
+ ` superdoc insert ${kind2 === "tab" ? "tab" : "line-break"} [doc] [--target-json '{...}'|--block-id <id> --offset <n>]`,
341196
+ ` superdoc insert ${kind2 === "tab" ? "tab" : "line-break"} [doc] [--ref <ref>] [--out <path>]`
341197
+ ].join(`
341198
+ `)
341199
+ };
341200
+ }
341201
+ const { doc: doc4 } = resolveDocArg(parsed, `insert ${COMMAND_BY_KIND[kind2].label}`);
341202
+ const outPath = getStringOption(parsed, "out");
341203
+ const force = getBooleanOption(parsed, "force");
341204
+ const expectedRevisionRaw = parsed.options.expectedRevision;
341205
+ const expectedRevision = typeof expectedRevisionRaw === "number" ? expectedRevisionRaw : undefined;
341206
+ const commandName = kind2 === "tab" ? "insert tab" : "insert line-break";
341207
+ const input2 = parsed.options;
341208
+ if (doc4 && expectedRevision != null) {
341209
+ throw new CliError("INVALID_ARGUMENT", `${commandName}: --expected-revision is only supported with an active open context.`);
341210
+ }
341211
+ if (doc4) {
341212
+ if (!outPath) {
341213
+ throw new CliError("MISSING_REQUIRED", `${commandName}: missing required --out.`);
341214
+ }
341215
+ const source = doc4 === "-" ? "stdin" : "path";
341216
+ const opened = await openDocument(doc4, context.io);
341217
+ try {
341218
+ const resolved = await resolveInsertionPoint(opened.editor, input2, kind2);
341219
+ executeInlineSpecialInsert(opened.editor, kind2, resolved);
341220
+ const output = await exportToPath(opened.editor, outPath, force);
341221
+ const document2 = {
341222
+ path: source === "path" ? doc4 : undefined,
341223
+ source,
341224
+ byteLength: opened.meta.byteLength,
341225
+ revision: 0
341226
+ };
341227
+ return {
341228
+ command: commandName,
341229
+ data: buildSuccessData(kind2, document2, resolved.target, 0, { output }),
341230
+ pretty: buildPrettyOutput3(kind2, 0, output.path)
341231
+ };
341232
+ } finally {
341233
+ opened.dispose();
341234
+ }
341235
+ }
341236
+ return withActiveContext(context.io, commandName, async ({ metadata, paths }) => {
341237
+ assertExpectedRevision(metadata, expectedRevision);
341238
+ const isHostMode = context.executionMode === "host" && context.sessionPool != null;
341239
+ const opened = await openSessionDocument(paths.workingDocPath, context.io, metadata, {
341240
+ sessionId: context.sessionId ?? metadata.contextId,
341241
+ executionMode: context.executionMode,
341242
+ sessionPool: context.sessionPool
341243
+ });
341244
+ try {
341245
+ const resolved = await resolveInsertionPoint(opened.editor, input2, kind2);
341246
+ executeInlineSpecialInsert(opened.editor, kind2, resolved);
341247
+ let updatedMetadata;
341248
+ let byteLength3;
341249
+ if (isHostMode) {
341250
+ context.sessionPool.markDirty(metadata.contextId);
341251
+ updatedMetadata = markContextUpdated(context.io, metadata, {
341252
+ dirty: true,
341253
+ revision: metadata.revision + 1
341254
+ });
341255
+ await writeContextMetadata(paths, updatedMetadata);
341256
+ context.sessionPool.updateMetadataRevision(metadata.contextId, updatedMetadata.revision);
341257
+ byteLength3 = opened.meta.byteLength;
341258
+ } else if (metadata.sessionType === "collab") {
341259
+ const synced = await syncCollaborativeSessionSnapshot(context.io, metadata, paths, opened.editor);
341260
+ updatedMetadata = synced.updatedMetadata;
341261
+ byteLength3 = synced.output.byteLength;
341262
+ } else {
341263
+ const workingOutput = await exportToPath(opened.editor, paths.workingDocPath, true);
341264
+ updatedMetadata = markContextUpdated(context.io, metadata, {
341265
+ dirty: true,
341266
+ revision: metadata.revision + 1
341267
+ });
341268
+ await writeContextMetadata(paths, updatedMetadata);
341269
+ byteLength3 = workingOutput.byteLength;
341270
+ }
341271
+ const externalOutput = await exportOptionalSessionOutput(opened.editor, context.io, outPath, force);
341272
+ const document2 = {
341273
+ path: updatedMetadata.sourcePath,
341274
+ source: updatedMetadata.source,
341275
+ byteLength: byteLength3,
341276
+ revision: updatedMetadata.revision
341277
+ };
341278
+ return {
341279
+ command: commandName,
341280
+ data: buildSuccessData(kind2, document2, resolved.target, updatedMetadata.revision, externalOutput),
341281
+ pretty: buildPrettyOutput3(kind2, updatedMetadata.revision, externalOutput?.output?.path)
341282
+ };
341283
+ } finally {
341284
+ opened.dispose();
341285
+ }
341286
+ }, context.sessionId, context.executionMode);
341287
+ }
341288
+ function runInsertTab(tokens, context) {
341289
+ return runInsertInlineSpecial("tab", tokens, context);
341290
+ }
341291
+ function runInsertLineBreak(tokens, context) {
341292
+ return runInsertInlineSpecial("lineBreak", tokens, context);
341293
+ }
341294
+ var COMMAND_BY_KIND;
341295
+ var init_insert_inline_special = __esm(() => {
341296
+ init_super_editor_es();
341297
+ init_args();
341298
+ init_context();
341299
+ init_document();
341300
+ init_errors();
341301
+ init_invoke_input();
341302
+ init_operation_args();
341303
+ init_session_collab();
341304
+ COMMAND_BY_KIND = {
341305
+ tab: { operationId: "doc.insertTab", label: "tab" },
341306
+ lineBreak: { operationId: "doc.insertLineBreak", label: "line break" }
341307
+ };
341308
+ });
341309
+
339634
341310
  // src/lib/open-password.ts
339635
341311
  function resolvePassword(explicit, allowEnvFallback = true) {
339636
341312
  if (explicit != null)
@@ -340160,6 +341836,7 @@ function getLegacyRunner(operationId) {
340160
341836
  var LEGACY_RUNNERS;
340161
341837
  var init_legacy_operation_dispatch = __esm(() => {
340162
341838
  init_close();
341839
+ init_insert_inline_special();
340163
341840
  init_open();
340164
341841
  init_save();
340165
341842
  init_session_close();
@@ -340170,6 +341847,8 @@ var init_legacy_operation_dispatch = __esm(() => {
340170
341847
  "doc.open": runOpen,
340171
341848
  "doc.save": runSave,
340172
341849
  "doc.close": runClose,
341850
+ "doc.insertTab": runInsertTab,
341851
+ "doc.insertLineBreak": runInsertLineBreak,
340173
341852
  "doc.session.list": runSessionList,
340174
341853
  "doc.session.save": runSessionSave,
340175
341854
  "doc.session.close": runSessionClose,
@@ -340185,6 +341864,8 @@ var init_manual_command_allowlist = __esm(() => {
340185
341864
  "open",
340186
341865
  "save",
340187
341866
  "close",
341867
+ "insert tab",
341868
+ "insert line-break",
340188
341869
  "session list",
340189
341870
  "session save",
340190
341871
  "session close",
@@ -340195,6 +341876,8 @@ var init_manual_command_allowlist = __esm(() => {
340195
341876
  "doc.open",
340196
341877
  "doc.save",
340197
341878
  "doc.close",
341879
+ "doc.insertTab",
341880
+ "doc.insertLineBreak",
340198
341881
  "doc.session.list",
340199
341882
  "doc.session.save",
340200
341883
  "doc.session.close",
@@ -346326,35 +348009,61 @@ var init_uninstall = __esm(() => {
346326
348009
  import { readFileSync } from "node:fs";
346327
348010
  import { dirname as dirname3, resolve as resolve3 } from "node:path";
346328
348011
  import { fileURLToPath as fileURLToPath2 } from "node:url";
346329
- function resolveCliPackagePath() {
346330
- const __filename3 = fileURLToPath2(import.meta.url);
346331
- const __dirname3 = dirname3(__filename3);
346332
- return resolve3(__dirname3, "../../package.json");
348012
+ function parsePackageJson(rawPackageJson) {
348013
+ try {
348014
+ return JSON.parse(rawPackageJson);
348015
+ } catch {
348016
+ return null;
348017
+ }
348018
+ }
348019
+ function isSupportedCliPackageName(name2) {
348020
+ return typeof name2 === "string" && (name2 === CLI_PACKAGE_NAME || name2.startsWith(`${CLI_PACKAGE_NAME}-`));
348021
+ }
348022
+ function resolveCliPackagePath(moduleUrl) {
348023
+ let currentDir = dirname3(fileURLToPath2(moduleUrl));
348024
+ while (true) {
348025
+ const packageJsonPath = resolve3(currentDir, "package.json");
348026
+ try {
348027
+ const rawPackageJson = readFileSync(packageJsonPath, "utf8");
348028
+ const parsed = parsePackageJson(rawPackageJson);
348029
+ if (isSupportedCliPackageName(parsed?.name)) {
348030
+ return packageJsonPath;
348031
+ }
348032
+ } catch {}
348033
+ const parentDir = dirname3(currentDir);
348034
+ if (parentDir === currentDir) {
348035
+ return null;
348036
+ }
348037
+ currentDir = parentDir;
348038
+ }
346333
348039
  }
346334
348040
  function parsePackageVersion(rawPackageJson) {
348041
+ const parsed = parsePackageJson(rawPackageJson);
348042
+ if (typeof parsed?.version === "string" && parsed.version.length > 0) {
348043
+ return parsed.version;
348044
+ }
348045
+ return null;
348046
+ }
348047
+ function resolveCliPackageVersionFromModuleUrl(moduleUrl) {
346335
348048
  try {
346336
- const parsed = JSON.parse(rawPackageJson);
346337
- if (typeof parsed.version === "string" && parsed.version.length > 0) {
346338
- return parsed.version;
348049
+ const packageJsonPath = resolveCliPackagePath(moduleUrl);
348050
+ if (!packageJsonPath) {
348051
+ return FALLBACK_CLI_PACKAGE_VERSION;
346339
348052
  }
346340
- } catch {}
346341
- return null;
348053
+ const packageJson = readFileSync(packageJsonPath, "utf8");
348054
+ return parsePackageVersion(packageJson) ?? FALLBACK_CLI_PACKAGE_VERSION;
348055
+ } catch {
348056
+ return FALLBACK_CLI_PACKAGE_VERSION;
348057
+ }
346342
348058
  }
346343
348059
  function resolveCliPackageVersion() {
346344
348060
  if (cachedCliPackageVersion) {
346345
348061
  return cachedCliPackageVersion;
346346
348062
  }
346347
- try {
346348
- const packageJson = readFileSync(resolveCliPackagePath(), "utf8");
346349
- const version4 = parsePackageVersion(packageJson);
346350
- cachedCliPackageVersion = version4 ?? FALLBACK_CLI_PACKAGE_VERSION;
346351
- return cachedCliPackageVersion;
346352
- } catch {
346353
- cachedCliPackageVersion = FALLBACK_CLI_PACKAGE_VERSION;
346354
- return cachedCliPackageVersion;
346355
- }
348063
+ cachedCliPackageVersion = resolveCliPackageVersionFromModuleUrl(import.meta.url);
348064
+ return cachedCliPackageVersion;
346356
348065
  }
346357
- var FALLBACK_CLI_PACKAGE_VERSION = "0.0.0", cachedCliPackageVersion = null;
348066
+ var CLI_PACKAGE_NAME = "@superdoc-dev/cli", FALLBACK_CLI_PACKAGE_VERSION = "0.0.0", cachedCliPackageVersion = null;
346358
348067
  var init_version2 = () => {};
346359
348068
 
346360
348069
  // src/host/session-pool.ts
@@ -346943,6 +348652,9 @@ function defaultIo() {
346943
348652
  stderr(message) {
346944
348653
  process.stderr.write(message);
346945
348654
  },
348655
+ warn(message) {
348656
+ process.stderr.write(message);
348657
+ },
346946
348658
  readStdinBytes() {
346947
348659
  if (stdinCache)
346948
348660
  return stdinCache;
@@ -346976,10 +348688,20 @@ function mergeIo(overrides) {
346976
348688
  return {
346977
348689
  stdout: overrides.stdout ?? base5.stdout,
346978
348690
  stderr: overrides.stderr ?? base5.stderr,
348691
+ warn: overrides.warn ?? base5.warn,
346979
348692
  readStdinBytes: overrides.readStdinBytes ?? base5.readStdinBytes,
346980
348693
  now: overrides.now ?? base5.now
346981
348694
  };
346982
348695
  }
348696
+ function applyDiagnosticPolicy(io, globals) {
348697
+ if (globals.output === "pretty" && !globals.quiet) {
348698
+ return io;
348699
+ }
348700
+ return {
348701
+ ...io,
348702
+ warn() {}
348703
+ };
348704
+ }
346983
348705
  function parseCommand(rest) {
346984
348706
  if (rest.length === 0) {
346985
348707
  throw new CliError("MISSING_REQUIRED", "Missing command.");
@@ -347086,7 +348808,8 @@ async function invokeCommand(argv, options2 = {}) {
347086
348808
  const startedAt = io.now();
347087
348809
  const { parsed, output } = await withStateDirOverride(options2.stateDir, async () => {
347088
348810
  const parsedInvocation = parseInvocation(argv);
347089
- const commandOutput = await executeParsedInvocation(parsedInvocation, io, options2.executionMode ?? "oneshot", options2.sessionPool);
348811
+ const runtimeIo = applyDiagnosticPolicy(io, parsedInvocation.globals);
348812
+ const commandOutput = await executeParsedInvocation(parsedInvocation, runtimeIo, options2.executionMode ?? "oneshot", options2.sessionPool);
347090
348813
  return { parsed: parsedInvocation, output: commandOutput };
347091
348814
  });
347092
348815
  return {
@@ -347109,6 +348832,7 @@ async function run2(argv, ioOverrides, options2 = {}) {
347109
348832
  try {
347110
348833
  const parsed = parseInvocation(argv);
347111
348834
  outputMode = parsed.globals.output;
348835
+ const runtimeIo = applyDiagnosticPolicy(io, parsed.globals);
347112
348836
  if (parsed.globals.version && !parsed.globals.help) {
347113
348837
  io.stdout(`${resolveCliPackageVersion()}
347114
348838
  `);
@@ -347135,7 +348859,7 @@ async function run2(argv, ioOverrides, options2 = {}) {
347135
348859
  return legacyCompat.exitCode;
347136
348860
  }
347137
348861
  }
347138
- const output = await executeParsedInvocation(parsed, io, "oneshot");
348862
+ const output = await executeParsedInvocation(parsed, runtimeIo, "oneshot");
347139
348863
  if (output.helpText) {
347140
348864
  io.stdout(output.helpText);
347141
348865
  return 0;
@@ -347167,6 +348891,7 @@ var init_src2 = __esm(async () => {
347167
348891
  init_input_readers();
347168
348892
  init_call();
347169
348893
  init_close();
348894
+ init_insert_inline_special();
347170
348895
  init_open();
347171
348896
  init_session_close();
347172
348897
  init_session_list();
@@ -347199,6 +348924,7 @@ var init_src2 = __esm(async () => {
347199
348924
  " --pretty",
347200
348925
  " --session <id>",
347201
348926
  " --timeout-ms <n>",
348927
+ " --quiet",
347202
348928
  " --help, -h",
347203
348929
  " --version, -v"
347204
348930
  ].join(`
@@ -347206,6 +348932,8 @@ var init_src2 = __esm(async () => {
347206
348932
  MANUAL_COMMANDS = {
347207
348933
  call: runCall,
347208
348934
  close: runClose,
348935
+ "insert line-break": runInsertLineBreak,
348936
+ "insert tab": runInsertTab,
347209
348937
  open: runOpen,
347210
348938
  save: runSave,
347211
348939
  "session list": runSessionList,