hikoutei 0.3.4 → 0.3.6

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 (355) hide show
  1. package/README.ja.md +44 -21
  2. package/README.ko.md +43 -23
  3. package/README.md +49 -33
  4. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +3 -3
  5. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -1
  6. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js +1 -1
  7. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarEntityRuntime.d.ts +1 -1
  8. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarEntityRuntime.js +1 -1
  9. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarRuntime.js +3 -3
  10. package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmScalarRuntime.js.map +1 -1
  11. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.d.ts +3 -3
  12. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.d.ts.map +1 -1
  13. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js +15 -15
  14. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js.map +1 -1
  15. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.d.ts +1 -1
  16. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.d.ts.map +1 -1
  17. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.js +3 -3
  18. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingFastPath.js.map +1 -1
  19. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.d.ts +5 -5
  20. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.d.ts.map +1 -1
  21. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.js +5 -5
  22. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingInspection.js.map +1 -1
  23. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingPersistence.d.ts +1 -1
  24. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingPersistence.js +5 -5
  25. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingPersistence.js.map +1 -1
  26. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingSql.js +3 -3
  27. package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPollingSql.js.map +1 -1
  28. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +156 -0
  29. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -0
  30. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +1112 -0
  31. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -0
  32. package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts +87 -0
  33. package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts.map +1 -0
  34. package/dist/adapter/sheets/providers/google-sheets-api/constants.js +97 -0
  35. package/dist/adapter/sheets/providers/google-sheets-api/constants.js.map +1 -0
  36. package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts +53 -0
  37. package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts.map +1 -0
  38. package/dist/adapter/sheets/providers/google-sheets-api/errors.js +61 -0
  39. package/dist/adapter/sheets/providers/google-sheets-api/errors.js.map +1 -0
  40. package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts +16 -0
  41. package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts.map +1 -0
  42. package/dist/adapter/sheets/providers/google-sheets-api/index.js +13 -0
  43. package/dist/adapter/sheets/providers/google-sheets-api/index.js.map +1 -0
  44. package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.d.ts +83 -0
  45. package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.d.ts.map +1 -0
  46. package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.js +413 -0
  47. package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.js.map +1 -0
  48. package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts +86 -0
  49. package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts.map +1 -0
  50. package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js +439 -0
  51. package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js.map +1 -0
  52. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts +115 -0
  53. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts.map +1 -0
  54. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js +522 -0
  55. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js.map +1 -0
  56. package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts +17 -0
  57. package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts.map +1 -0
  58. package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.js +99 -0
  59. package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.js.map +1 -0
  60. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts +242 -0
  61. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts.map +1 -0
  62. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js +707 -0
  63. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js.map +1 -0
  64. package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.d.ts +16 -0
  65. package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.d.ts.map +1 -0
  66. package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.js +29 -0
  67. package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.js.map +1 -0
  68. package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts +26 -0
  69. package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts.map +1 -0
  70. package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.js +57 -0
  71. package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.js.map +1 -0
  72. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts +102 -0
  73. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts.map +1 -0
  74. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js +375 -0
  75. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js.map +1 -0
  76. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts +168 -0
  77. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts.map +1 -0
  78. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js +247 -0
  79. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js.map +1 -0
  80. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts +47 -0
  81. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts.map +1 -0
  82. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js +60 -0
  83. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js.map +1 -0
  84. package/dist/api/Hikoutei.d.ts +1 -1
  85. package/dist/api/Hikoutei.js +1 -1
  86. package/dist/api/index.d.ts +2 -2
  87. package/dist/api/index.js +2 -2
  88. package/dist/application/orm/mapping/contracts.d.ts +2 -2
  89. package/dist/application/orm/mapping/contracts.d.ts.map +1 -1
  90. package/dist/application/orm/mapping/definition.js +5 -5
  91. package/dist/application/orm/mapping/definition.js.map +1 -1
  92. package/dist/application/orm/mapping/projection.js +7 -7
  93. package/dist/application/orm/mapping/projection.js.map +1 -1
  94. package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +3 -3
  95. package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -1
  96. package/dist/application/orm/persistence/flush/flushCoordinator.js +2 -2
  97. package/dist/application/orm/persistence/flush/flushCoordinator.js.map +1 -1
  98. package/dist/application/orm/persistence/projection/projectionEffects.d.ts +1 -1
  99. package/dist/application/orm/persistence/projection/projectionEffects.js +6 -6
  100. package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -1
  101. package/dist/application/orm/persistence/support/contracts.d.ts +2 -2
  102. package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -1
  103. package/dist/application/sync/inbound/autoSystemConflictResolution.js +7 -7
  104. package/dist/application/sync/inbound/autoSystemConflictResolution.js.map +1 -1
  105. package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +3 -3
  106. package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -1
  107. package/dist/application/sync/inbound/polling/SimpleSheetPolling.js +1 -1
  108. package/dist/application/sync/inbound/polling/SimpleSheetPolling.js.map +1 -1
  109. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts +17 -1
  110. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts.map +1 -1
  111. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js +27 -1
  112. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js.map +1 -1
  113. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +2 -2
  114. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -1
  115. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +26 -6
  116. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -1
  117. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +24 -9
  118. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -1
  119. package/dist/application/sync/outbound/effects/SyncEffectWorker.js +128 -81
  120. package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -1
  121. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +31 -14
  122. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -1
  123. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +32 -15
  124. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -1
  125. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +13 -9
  126. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -1
  127. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +53 -37
  128. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -1
  129. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +1 -1
  130. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +1 -1
  131. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +29 -19
  132. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -1
  133. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +59 -41
  134. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -1
  135. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +4 -4
  136. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +1 -1
  137. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +3 -3
  138. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +1 -1
  139. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +3 -3
  140. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +1 -1
  141. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +42 -46
  142. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +1 -1
  143. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +8 -8
  144. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -1
  145. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +15 -15
  146. package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -1
  147. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +3 -3
  148. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -1
  149. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +10 -10
  150. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -1
  151. package/dist/application/sync/service/SyncPollingSupervisor.d.ts +1 -1
  152. package/dist/application/sync/service/SyncPollingSupervisor.js +1 -1
  153. package/dist/application/sync/service/SyncServiceBootstrap.d.ts +29 -19
  154. package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
  155. package/dist/application/sync/service/SyncServiceBootstrap.js +103 -78
  156. package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
  157. package/dist/application/sync/service/errors.d.ts +1 -1
  158. package/dist/application/sync/service/errors.js +1 -1
  159. package/dist/application/sync/service/errors.js.map +1 -1
  160. package/dist/application/sync/sheets/conflictProjection.d.ts.map +1 -0
  161. package/dist/application/sync/sheets/conflictProjection.js.map +1 -0
  162. package/dist/application/sync/{gateway → sheets}/conflictProjectionRegistration.d.ts +1 -1
  163. package/dist/application/sync/sheets/conflictProjectionRegistration.d.ts.map +1 -0
  164. package/dist/application/sync/{gateway → sheets}/conflictProjectionRegistration.js +3 -3
  165. package/dist/application/sync/sheets/conflictProjectionRegistration.js.map +1 -0
  166. package/dist/application/sync/sheets/constants.d.ts +66 -0
  167. package/dist/application/sync/sheets/constants.d.ts.map +1 -0
  168. package/dist/application/sync/{gateway → sheets}/constants.js +15 -15
  169. package/dist/application/sync/sheets/constants.js.map +1 -0
  170. package/dist/application/sync/sheets/errors.d.ts +15 -0
  171. package/dist/application/sync/sheets/errors.d.ts.map +1 -0
  172. package/dist/application/sync/sheets/errors.js +16 -0
  173. package/dist/application/sync/sheets/errors.js.map +1 -0
  174. package/dist/application/sync/{gateway/coordinator/CoordinatedSyncGateway.d.ts → sheets/mutationCoordinator/CoordinatedSheetsProvider.d.ts} +29 -28
  175. package/dist/application/sync/sheets/mutationCoordinator/CoordinatedSheetsProvider.d.ts.map +1 -0
  176. package/dist/application/sync/{gateway/coordinator/CoordinatedSyncGateway.js → sheets/mutationCoordinator/CoordinatedSheetsProvider.js} +27 -26
  177. package/dist/application/sync/sheets/mutationCoordinator/CoordinatedSheetsProvider.js.map +1 -0
  178. package/dist/application/sync/{gateway/coordinator → sheets/mutationCoordinator}/asyncMutex.d.ts +2 -3
  179. package/dist/application/sync/sheets/mutationCoordinator/asyncMutex.d.ts.map +1 -0
  180. package/dist/application/sync/sheets/mutationCoordinator/asyncMutex.js.map +1 -0
  181. package/dist/application/sync/{gateway/coordinator/coordinatorTelemetry.d.ts → sheets/mutationCoordinator/laneTelemetry.d.ts} +4 -4
  182. package/dist/application/sync/sheets/mutationCoordinator/laneTelemetry.d.ts.map +1 -0
  183. package/dist/application/sync/{gateway/coordinator/coordinatorTelemetry.js → sheets/mutationCoordinator/laneTelemetry.js} +5 -5
  184. package/dist/application/sync/sheets/mutationCoordinator/laneTelemetry.js.map +1 -0
  185. package/dist/application/sync/{gateway/SyncGatewayBootstrap.d.ts → sheets/sheetsProvisioning.d.ts} +14 -14
  186. package/dist/application/sync/sheets/sheetsProvisioning.d.ts.map +1 -0
  187. package/dist/application/sync/sheets/sheetsProvisioning.js +95 -0
  188. package/dist/application/sync/sheets/sheetsProvisioning.js.map +1 -0
  189. package/dist/application/sync/{gateway/syncGateway.d.ts → sheets/syncSheets.d.ts} +61 -117
  190. package/dist/application/sync/sheets/syncSheets.d.ts.map +1 -0
  191. package/dist/application/sync/sheets/syncSheets.js +144 -0
  192. package/dist/application/sync/sheets/syncSheets.js.map +1 -0
  193. package/dist/application/sync/{gateway/transportClassification.d.ts → sheets/transportOutcome.d.ts} +23 -22
  194. package/dist/application/sync/sheets/transportOutcome.d.ts.map +1 -0
  195. package/dist/application/sync/sheets/transportOutcome.js +97 -0
  196. package/dist/application/sync/sheets/transportOutcome.js.map +1 -0
  197. package/dist/application/sync/sheets/validation.d.ts +22 -0
  198. package/dist/application/sync/sheets/validation.d.ts.map +1 -0
  199. package/dist/application/sync/sheets/validation.js +79 -0
  200. package/dist/application/sync/sheets/validation.js.map +1 -0
  201. package/dist/application/sync/telemetry/syncTiming.d.ts +7 -7
  202. package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -1
  203. package/dist/application/sync/telemetry/syncTiming.js +2 -2
  204. package/dist/application/sync/telemetry/syncTiming.js.map +1 -1
  205. package/dist/domain/evaluate/contracts.d.ts +1 -1
  206. package/dist/domain/evaluate/contracts.js +1 -1
  207. package/dist/domain/model/constants.d.ts +1 -1
  208. package/dist/domain/model/constants.d.ts.map +1 -1
  209. package/dist/domain/model/types.d.ts +1 -1
  210. package/dist/domain/model/types.d.ts.map +1 -1
  211. package/dist/index.d.ts +3 -2
  212. package/dist/index.d.ts.map +1 -1
  213. package/dist/index.js +3 -2
  214. package/dist/index.js.map +1 -1
  215. package/dist/infrastructure/storage/index.d.ts +1 -1
  216. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  217. package/dist/infrastructure/storage/index.js +1 -1
  218. package/dist/infrastructure/storage/index.js.map +1 -1
  219. package/dist/infrastructure/storage/state/observation/observationAudit.d.ts +1 -1
  220. package/dist/infrastructure/storage/state/observation/observationAudit.js +1 -1
  221. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +3 -3
  222. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -1
  223. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +13 -1
  224. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -1
  225. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +23 -2
  226. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -1
  227. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +9 -3
  228. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +1 -1
  229. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +7 -1
  230. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +1 -1
  231. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +11 -1
  232. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -1
  233. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +44 -3
  234. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -1
  235. package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +4 -4
  236. package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts.map +1 -1
  237. package/dist/infrastructure/storage/sync/shared/syncRegistry.js +4 -4
  238. package/dist/infrastructure/storage/sync/shared/syncRegistry.js.map +1 -1
  239. package/dist/shared/encoding/types.d.ts +1 -1
  240. package/docs/architecture.md +52 -23
  241. package/docs/ci.md +31 -23
  242. package/docs/code-guidelines.md +10 -18
  243. package/docs/development.md +37 -11
  244. package/docs/gateway-removal-inventory.md +147 -0
  245. package/docs/quick-start.md +36 -26
  246. package/docs/sync-bulk-write-benchmark.md +561 -0
  247. package/docs/sync-observability.md +38 -45
  248. package/docs/write-and-synchronization-flow.md +56 -39
  249. package/package.json +5 -4
  250. package/apps-script/gateway/Code.gs +0 -447
  251. package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts +0 -43
  252. package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts.map +0 -1
  253. package/dist/adapter/sheets/providers/apps-script-gateway/errors.js +0 -52
  254. package/dist/adapter/sheets/providers/apps-script-gateway/errors.js.map +0 -1
  255. package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +0 -24
  256. package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +0 -1
  257. package/dist/adapter/sheets/providers/apps-script-gateway/index.js +0 -13
  258. package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +0 -1
  259. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts +0 -44
  260. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts.map +0 -1
  261. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js +0 -181
  262. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js.map +0 -1
  263. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts +0 -3
  264. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts.map +0 -1
  265. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +0 -810
  266. package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js.map +0 -1
  267. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts +0 -31
  268. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts.map +0 -1
  269. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +0 -560
  270. package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js.map +0 -1
  271. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts +0 -12
  272. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts.map +0 -1
  273. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js +0 -166
  274. package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map +0 -1
  275. package/dist/adapter/sheets/providers/apps-script-gateway/operations/shared/appsScriptStableCodecSource.d.ts +0 -8
  276. package/dist/adapter/sheets/providers/apps-script-gateway/operations/shared/appsScriptStableCodecSource.d.ts.map +0 -1
  277. package/dist/adapter/sheets/providers/apps-script-gateway/operations/shared/appsScriptStableCodecSource.js +0 -122
  278. package/dist/adapter/sheets/providers/apps-script-gateway/operations/shared/appsScriptStableCodecSource.js.map +0 -1
  279. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.d.ts +0 -31
  280. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.d.ts.map +0 -1
  281. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.js +0 -567
  282. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.js.map +0 -1
  283. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts +0 -19
  284. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts.map +0 -1
  285. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js +0 -37
  286. package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js.map +0 -1
  287. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts +0 -51
  288. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts.map +0 -1
  289. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js +0 -60
  290. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js.map +0 -1
  291. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts +0 -44
  292. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts.map +0 -1
  293. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js +0 -40
  294. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js.map +0 -1
  295. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts +0 -12
  296. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts.map +0 -1
  297. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js +0 -41
  298. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js.map +0 -1
  299. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts +0 -5
  300. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts.map +0 -1
  301. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js +0 -53
  302. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js.map +0 -1
  303. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts +0 -4
  304. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts.map +0 -1
  305. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js +0 -2
  306. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js.map +0 -1
  307. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts +0 -11
  308. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts.map +0 -1
  309. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js +0 -36
  310. package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js.map +0 -1
  311. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts +0 -68
  312. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts.map +0 -1
  313. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js +0 -273
  314. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js.map +0 -1
  315. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +0 -73
  316. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +0 -1
  317. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +0 -363
  318. package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +0 -1
  319. package/dist/adapter/sheets/providers/apps-script-gateway/validation.d.ts +0 -3
  320. package/dist/adapter/sheets/providers/apps-script-gateway/validation.d.ts.map +0 -1
  321. package/dist/adapter/sheets/providers/apps-script-gateway/validation.js +0 -10
  322. package/dist/adapter/sheets/providers/apps-script-gateway/validation.js.map +0 -1
  323. package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts.map +0 -1
  324. package/dist/application/sync/gateway/SyncGatewayBootstrap.js +0 -95
  325. package/dist/application/sync/gateway/SyncGatewayBootstrap.js.map +0 -1
  326. package/dist/application/sync/gateway/conflictProjection.d.ts.map +0 -1
  327. package/dist/application/sync/gateway/conflictProjection.js.map +0 -1
  328. package/dist/application/sync/gateway/conflictProjectionRegistration.d.ts.map +0 -1
  329. package/dist/application/sync/gateway/conflictProjectionRegistration.js.map +0 -1
  330. package/dist/application/sync/gateway/constants.d.ts +0 -66
  331. package/dist/application/sync/gateway/constants.d.ts.map +0 -1
  332. package/dist/application/sync/gateway/constants.js.map +0 -1
  333. package/dist/application/sync/gateway/coordinator/CoordinatedSyncGateway.d.ts.map +0 -1
  334. package/dist/application/sync/gateway/coordinator/CoordinatedSyncGateway.js.map +0 -1
  335. package/dist/application/sync/gateway/coordinator/asyncMutex.d.ts.map +0 -1
  336. package/dist/application/sync/gateway/coordinator/asyncMutex.js.map +0 -1
  337. package/dist/application/sync/gateway/coordinator/coordinatorTelemetry.d.ts.map +0 -1
  338. package/dist/application/sync/gateway/coordinator/coordinatorTelemetry.js.map +0 -1
  339. package/dist/application/sync/gateway/errors.d.ts +0 -15
  340. package/dist/application/sync/gateway/errors.d.ts.map +0 -1
  341. package/dist/application/sync/gateway/errors.js +0 -16
  342. package/dist/application/sync/gateway/errors.js.map +0 -1
  343. package/dist/application/sync/gateway/syncGateway.d.ts.map +0 -1
  344. package/dist/application/sync/gateway/syncGateway.js +0 -191
  345. package/dist/application/sync/gateway/syncGateway.js.map +0 -1
  346. package/dist/application/sync/gateway/transportClassification.d.ts.map +0 -1
  347. package/dist/application/sync/gateway/transportClassification.js +0 -133
  348. package/dist/application/sync/gateway/transportClassification.js.map +0 -1
  349. package/dist/application/sync/gateway/validation.d.ts +0 -22
  350. package/dist/application/sync/gateway/validation.d.ts.map +0 -1
  351. package/dist/application/sync/gateway/validation.js +0 -79
  352. package/dist/application/sync/gateway/validation.js.map +0 -1
  353. /package/dist/application/sync/{gateway → sheets}/conflictProjection.d.ts +0 -0
  354. /package/dist/application/sync/{gateway → sheets}/conflictProjection.js +0 -0
  355. /package/dist/application/sync/{gateway/coordinator → sheets/mutationCoordinator}/asyncMutex.js +0 -0
@@ -1,810 +0,0 @@
1
- import { APPS_SCRIPT_STABLE_CODEC_SOURCE } from "../shared/appsScriptStableCodecSource.js";
2
- /** Self-contained V8 source executed by Code.gs for effect application and read-back. */
3
- export const EFFECT_OPERATION_SOURCE = String.raw `function (spreadsheet, args) {
4
- var MAX_EFFECTS = 20;
5
- var RECEIPT_SHEET_NAME = "__typed_sheets_internal_effect_receipts";
6
- var RECEIPT_HEADERS = ["effectId", "payloadHash", "status", "visibleHash", "visibleRevision", "updatedAt"];
7
- var ANCHOR_KEY = "typed_sheets_sync_anchor";
8
- var EFFECT_KINDS = {
9
- SYSTEM_PROJECTION: "system_projection",
10
- CANDIDATE_RECONCILE: "candidate_reconcile",
11
- SYSTEM_REPAIR: "system_repair",
12
- RESOLUTION_PROJECTION: "resolution_projection",
13
- RESOLUTION_DELETE: "resolution_delete",
14
- USER_INPUT_DELETE: "user_input_delete"
15
- };
16
- var DEFERRED = "deferred";
17
-
18
- var phases = [];
19
- var effectLock = null;
20
- var effectLockStartedAt = Date.now();
21
- // Postcondition probes read the same Sheet rows and receipt state that an
22
- // in-flight apply mutates, so they must hold the same script lock; otherwise
23
- // a delayed or timed-out apply could overlap a probe and be misclassified.
24
- var LOCKED_MODES = {
25
- applyEffects: true,
26
- readEffectPostcondition: true,
27
- readEffectPostconditions: true
28
- };
29
- if (args && LOCKED_MODES[args.mode] === true) {
30
- effectLock = LockService.getScriptLock();
31
- if (!effectLock.tryLock(20000)) throw new Error("Could not acquire the sync effect gateway lock");
32
- }
33
- try {
34
- var operationResult = run_();
35
- if (effectLock !== null) appendTimingPhase_(operationResult, "script_lock", Date.now() - effectLockStartedAt);
36
- return operationResult;
37
- } finally {
38
- if (effectLock !== null) effectLock.releaseLock();
39
- }
40
-
41
- function run_() {
42
- var startedAt = Date.now();
43
- requireObject_(args, "effect operation args");
44
- assertAuthority_(spreadsheet, args.mode === "applyEffects");
45
- var validationStartedAt = Date.now();
46
- if (!Array.isArray(args.effects) && args.mode === "applyEffects") {
47
- throw new Error("applyEffects effects must be an array");
48
- }
49
- phase_("validate_input", validationStartedAt);
50
-
51
- var sheetLookupStartedAt = Date.now();
52
- var sheet = spreadsheet.getSheetByName(args.sheetName);
53
- if (sheet === null) throw new Error("Registered sync sheet does not exist: " + args.sheetName);
54
- phase_("sheet_lookup", sheetLookupStartedAt);
55
- var layoutStartedAt = Date.now();
56
- var layout = readLayout_(sheet, args.registeredRange);
57
- phase_("layout_read", layoutStartedAt);
58
- var contextStartedAt = Date.now();
59
- var context = readContext_(sheet, layout, args.identityField);
60
- phase_("context_read", contextStartedAt);
61
-
62
- if (args.mode === "readEffectPostcondition") {
63
- return classifyPostcondition_(context, args.effect, readPostconditionReceipts_());
64
- }
65
- if (args.mode === "readEffectPostconditions") {
66
- if (!Array.isArray(args.effects) || args.effects.length === 0) {
67
- throw new Error("postcondition effects must be a non-empty array");
68
- }
69
- var postconditionReceipts = readPostconditionReceipts_();
70
- return {
71
- results: args.effects.map(function (effect) {
72
- return {
73
- effectId: String(effect.effectId),
74
- payloadHash: String(effect.payloadHash),
75
- postcondition: classifyPostcondition_(context, effect, postconditionReceipts)
76
- };
77
- })
78
- };
79
- }
80
- if (args.mode !== "applyEffects") throw new Error("unsupported effect operation mode");
81
-
82
- var receiptEnsureStartedAt = Date.now();
83
- var receiptSheet = ensureReceiptSheet_(spreadsheet);
84
- phase_("receipt_sheet_ensure", receiptEnsureStartedAt);
85
- var receiptReadStartedAt = Date.now();
86
- var receipts = readReceipts_(receiptSheet);
87
- phase_("receipt_read", receiptReadStartedAt);
88
- var pendingReceipts = [];
89
- var pendingReceiptsById = Object.create(null);
90
- var appendRows = [];
91
- var deleteRows = [];
92
- var deletionReceiptIds = Object.create(null);
93
- var deferred = [];
94
- var results = [];
95
- var count = Math.min(args.effects.length, MAX_EFFECTS);
96
- var postconditionMode = args.postconditionMode === undefined ? "inline" : args.postconditionMode;
97
- if (postconditionMode !== "inline" && postconditionMode !== DEFERRED) {
98
- throw new Error("applyEffects postconditionMode must be inline or deferred");
99
- }
100
-
101
- var planStartedAt = Date.now();
102
- for (var index = 0; index < count; index += 1) {
103
- var checked = requireEffect_(args.effects[index], args);
104
- var existingReceipt = receipts[checked.effectId] || pendingReceiptsById[checked.effectId] || null;
105
- if (existingReceipt !== null) {
106
- if (existingReceipt.payloadHash !== checked.payloadHash) {
107
- results[index] = result_(checked, "schema_error", null, "effect_id_reused_with_different_payload", null);
108
- continue;
109
- }
110
- var receiptRow = findRow_(context, checked.payload.targetAnchor, checked.targetId);
111
- if (isDeletion_(checked.effectKind)) {
112
- results[index] = receiptRow === null
113
- ? result_(checked, "already_applied", null, null, existingReceipt)
114
- : result_(checked, "guard_mismatch", receiptRow.rowNumber, "receipt_target_reappeared", null);
115
- continue;
116
- }
117
- if (receiptRow === null) {
118
- results[index] = result_(
119
- checked,
120
- checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
121
- null,
122
- "receipt_target_missing",
123
- null,
124
- );
125
- continue;
126
- }
127
- var receiptCurrentHash = currentHash_(receiptRow, checked.payload.fields);
128
- results[index] = receiptCurrentHash === checked.payload.targetVisibleHash
129
- ? result_(checked, "already_applied", receiptRow.rowNumber, null, existingReceipt)
130
- : result_(
131
- checked,
132
- checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR ? "repair_reobserve" : "guard_mismatch",
133
- receiptRow.rowNumber,
134
- "receipt_postcondition_changed",
135
- null,
136
- );
137
- continue;
138
- }
139
-
140
- var row = findRow_(context, checked.payload.targetAnchor, checked.targetId);
141
- var created = false;
142
- if (row === null) {
143
- if (!checked.payload.createIfMissing) {
144
- results[index] = result_(checked, "guard_mismatch", null, "target_anchor_missing", null);
145
- continue;
146
- }
147
- if (checked.expectedVisibleRevision !== 0 || checked.expectedVisibleHash !== "") {
148
- results[index] = result_(checked, "guard_mismatch", null, "insert_requires_empty_visible_baseline", null);
149
- continue;
150
- }
151
- row = createRow_(context, checked.payload.targetAnchor, checked.targetId);
152
- appendRows.push(row);
153
- created = true;
154
- }
155
-
156
- if (isDeletion_(checked.effectKind)) {
157
- var deletionSchemaError = validateDeletion_(layout, checked);
158
- if (deletionSchemaError !== null) {
159
- results[index] = result_(checked, "schema_error", row.rowNumber, deletionSchemaError, null);
160
- continue;
161
- }
162
- var deletionHash = currentHash_(row, checked.payload.fields);
163
- if (deletionHash !== checked.expectedVisibleHash) {
164
- results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
165
- continue;
166
- }
167
- var deletionReceipt = makeReceipt_(checked, deletionHash, checked.expectedVisibleRevision);
168
- row.deleted = true;
169
- deleteRows.push(row);
170
- queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, deletionReceipt);
171
- deletionReceiptIds[deletionReceipt.effectId] = true;
172
- deferred.push({ index: index, checked: checked, row: row, receipt: deletionReceipt, deletion: true });
173
- continue;
174
- }
175
-
176
- // A newly created row is still the empty visible baseline. Its in-memory
177
- // cells are blank, so hashing them would incorrectly turn the first
178
- // candidate reconcile into a guard mismatch before the requested fields
179
- // are written.
180
- var currentHash = created ? checked.expectedVisibleHash : currentHash_(row, checked.payload.fields);
181
- var expectedCandidateHash = optionalWireText_(checked.payload.expectedCandidateHash);
182
- if (checked.effectKind === EFFECT_KINDS.CANDIDATE_RECONCILE &&
183
- !created && expectedCandidateHash !== null && currentHash !== checked.expectedVisibleHash) {
184
- results[index] = result_(checked, "guard_mismatch", row.rowNumber, "candidate_guard_mismatch", null);
185
- continue;
186
- }
187
- if (currentHash === checked.payload.targetVisibleHash) {
188
- var alreadyReceipt = makeReceipt_(checked, currentHash, checked.expectedVisibleRevision + 1);
189
- queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, alreadyReceipt);
190
- results[index] = result_(checked, created ? "applied" : "already_applied", row.rowNumber, null, alreadyReceipt);
191
- continue;
192
- }
193
- var repairGuardHash = optionalWireText_(checked.repairGuardHash);
194
- if (checked.effectKind === EFFECT_KINDS.SYSTEM_REPAIR) {
195
- if (repairGuardHash === null || currentHash !== repairGuardHash) {
196
- results[index] = result_(checked, "repair_reobserve", row.rowNumber, "repair_guard_mismatch", null);
197
- continue;
198
- }
199
- } else if (currentHash !== checked.expectedVisibleHash) {
200
- results[index] = result_(checked, "guard_mismatch", row.rowNumber, "visible_guard_mismatch", null);
201
- continue;
202
- }
203
-
204
- Object.keys(checked.payload.fields).forEach(function (fieldName) {
205
- row.cells[fieldName] = checked.payload.fields[fieldName];
206
- if (!row.appended) {
207
- row.writeFields[fieldName] = checked.payload.fields[fieldName];
208
- context.updatedRows[row.rowNumber] = row;
209
- }
210
- });
211
- deferred.push({
212
- index: index,
213
- checked: checked,
214
- row: row,
215
- receipt: makeReceipt_(checked, checked.payload.targetVisibleHash, checked.expectedVisibleRevision + 1),
216
- deletion: false,
217
- });
218
- }
219
- phase_("effect_plan", planStartedAt);
220
-
221
- var appendWriteStartedAt = Date.now();
222
- writeAppendRows_(sheet, layout, appendRows, args.checkboxHeaders);
223
- phase_("append_write", appendWriteStartedAt);
224
- var fieldWriteStartedAt = Date.now();
225
- writeFieldUpdates_(sheet, layout, context.rows);
226
- phase_("field_update_write", fieldWriteStartedAt);
227
- var writeFlushStartedAt = Date.now();
228
- if (appendRows.length > 0 || Object.keys(context.updatedRows).length > 0) SpreadsheetApp.flush();
229
- phase_("write_flush", writeFlushStartedAt);
230
-
231
- var postconditionStartedAt = Date.now();
232
- deferred.forEach(function (planned) {
233
- if (planned.deletion) {
234
- results[planned.index] = result_(planned.checked, "applied", null, null, planned.receipt);
235
- return;
236
- }
237
- if (postconditionMode !== DEFERRED &&
238
- physicalHash_(sheet, layout, planned.row.rowNumber, planned.checked.payload.fields) !== planned.checked.payload.targetVisibleHash) {
239
- results[planned.index] = result_(planned.checked, "retryable_error", planned.row.rowNumber, "postcondition_hash_mismatch", null);
240
- return;
241
- }
242
- queueReceipt_(receipts, pendingReceipts, pendingReceiptsById, planned.receipt);
243
- results[planned.index] = result_(planned.checked, "applied", planned.row.rowNumber, null, planned.receipt);
244
- });
245
- phase_("postcondition", postconditionStartedAt);
246
-
247
- // Deletion results are receipt-backed only after the delete/receipt batch
248
- // completes without throwing; a crash inside it leaves deleted rows
249
- // without receipts, which recovery probes classify as delivery-uncertain.
250
- var deleteBatchStartedAt = Date.now();
251
- writeDeletionAndReceiptsBatch_(sheet, receiptSheet, deleteRows, pendingReceipts.filter(function (receipt) {
252
- return deletionReceiptIds[receipt.effectId] === true;
253
- }));
254
- phase_("delete_and_receipt_batch", Date.now() - deleteBatchStartedAt);
255
- var receiptWriteStartedAt = Date.now();
256
- writeReceipts_(receiptSheet, pendingReceipts.filter(function (receipt) {
257
- return deletionReceiptIds[receipt.effectId] !== true;
258
- }));
259
- phase_("receipt_write", receiptWriteStartedAt);
260
- results.forEach(function (entry) {
261
- if (entry === null || entry === undefined) throw new Error("effect result was not produced");
262
- if (postconditionMode === DEFERRED &&
263
- (entry.status === "applied" || entry.status === "already_applied")) {
264
- entry.postcondition = "acknowledged";
265
- }
266
- });
267
- var operationCounts = countOperationKinds_(args.effects);
268
- return {
269
- results: results,
270
- snapshotHash: null,
271
- hasMore: args.effects.length > count,
272
- timing: {
273
- operationKinds: operationKinds_(operationCounts),
274
- operationCounts: operationCounts,
275
- durationMs: Date.now() - startedAt,
276
- phases: phases,
277
- },
278
- };
279
- }
280
-
281
- function assertAuthority_(targetSpreadsheet, allowAdvance) {
282
- if (args.authority === undefined) return;
283
- if (!args.authority || typeof args.authority.epoch !== "number" ||
284
- Math.floor(args.authority.epoch) !== args.authority.epoch || args.authority.epoch < 1 ||
285
- typeof args.authority.token !== "string" || args.authority.token.length === 0) {
286
- throw new Error("effect authority is invalid");
287
- }
288
- var key = "typed_sheets_authority:" + targetSpreadsheet.getId();
289
- var properties = PropertiesService.getScriptProperties();
290
- var raw = properties.getProperty(key);
291
- var current = raw === null ? null : JSON.parse(raw);
292
- if (current !== null && (current.epoch > args.authority.epoch ||
293
- current.epoch === args.authority.epoch && current.token !== args.authority.token)) {
294
- throw new Error("effect authority fence is stale");
295
- }
296
- if (allowAdvance && (current === null || args.authority.epoch > current.epoch)) {
297
- properties.setProperty(key, JSON.stringify({ epoch: args.authority.epoch, token: args.authority.token }));
298
- }
299
- }
300
-
301
- function readLayout_(targetSheet, registeredRange) {
302
- var parsed = parseRange_(registeredRange);
303
- var headerValues = targetSheet.getRange(1, parsed.startColumn, 1, parsed.columnCount).getValues()[0];
304
- var headers = [];
305
- var positions = Object.create(null);
306
- headerValues.forEach(function (header, headerIndex) {
307
- if (typeof header !== "string" || header.trim() === "") throw new Error("registered header is invalid");
308
- if (positions[header] !== undefined) throw new Error("registered headers contain a duplicate");
309
- headers.push(header);
310
- positions[header] = parsed.startColumn + headerIndex;
311
- });
312
- return { startColumn: parsed.startColumn, columnCount: parsed.columnCount, headers: headers, positions: positions };
313
- }
314
-
315
- function readContext_(targetSheet, layout, identityField) {
316
- var rows = [];
317
- var byAnchor = Object.create(null);
318
- var byIdentity = Object.create(null);
319
- var lastRow = targetSheet.getLastRow();
320
- var rawRows = lastRow < 2 ? [] : targetSheet.getRange(2, layout.startColumn, lastRow - 1, layout.columnCount).getValues();
321
- rawRows.forEach(function (raw, offset) {
322
- if (isBlankRow_(raw)) return;
323
- var rowNumber = offset + 2;
324
- var cells = Object.create(null);
325
- layout.headers.forEach(function (header, headerIndex) {
326
- cells[header] = normalizedCellFromSheetValue_(raw[headerIndex]);
327
- });
328
- var anchors = readAnchors_(targetSheet, rowNumber);
329
- if (anchors.length > 1) throw new Error("row has multiple sync anchors: " + rowNumber);
330
- var anchor = anchors.length === 1 ? anchors[0] : null;
331
- var identity = identityField === undefined ? null : identityFromCell_(cells[identityField]);
332
- var row = {
333
- rowNumber: rowNumber,
334
- physicalAnchor: anchor,
335
- targetId: identity,
336
- cells: cells,
337
- writeFields: Object.create(null),
338
- appended: false,
339
- deleted: false,
340
- };
341
- if (anchor !== null) {
342
- if (byAnchor[anchor] !== undefined) {
343
- throw new Error("sync anchor is duplicated: " + anchor + " at rows " + byAnchor[anchor].rowNumber + " and " + rowNumber);
344
- }
345
- byAnchor[anchor] = row;
346
- }
347
- if (identity !== null) {
348
- if (byIdentity[identity] !== undefined) {
349
- throw new Error("sync identity is duplicated: " + identity + " at rows " + byIdentity[identity].rowNumber + " and " + rowNumber);
350
- }
351
- byIdentity[identity] = row;
352
- }
353
- rows.push(row);
354
- });
355
- return {
356
- rows: rows,
357
- updatedRows: Object.create(null),
358
- byAnchor: byAnchor,
359
- byIdentity: byIdentity,
360
- nextAppendRow: Math.max(lastRow + 1, 2),
361
- layout: layout,
362
- };
363
- }
364
-
365
- function createRow_(targetContext, anchor, targetId) {
366
- var cells = Object.create(null);
367
- targetContext.layout.headers.forEach(function (header) { cells[header] = null; });
368
- var row = {
369
- rowNumber: targetContext.nextAppendRow++,
370
- physicalAnchor: anchor,
371
- targetId: targetId,
372
- cells: cells,
373
- writeFields: Object.create(null),
374
- appended: true,
375
- deleted: false,
376
- };
377
- targetContext.rows.push(row);
378
- targetContext.byAnchor[anchor] = row;
379
- if (targetId !== null) targetContext.byIdentity[targetId] = row;
380
- return row;
381
- }
382
-
383
- function findRow_(targetContext, anchor, targetId) {
384
- var row = targetContext.byAnchor[anchor] || null;
385
- if (row === null && targetId !== null && targetId !== undefined) {
386
- row = targetContext.byIdentity[targetId] || null;
387
- if (row === null && typeof targetId === "string") {
388
- var separator = targetId.lastIndexOf(":");
389
- var visibleIdentity = separator < 0 ? null : targetId.slice(separator + 1);
390
- if (visibleIdentity !== null && visibleIdentity.length > 0) {
391
- row = targetContext.byIdentity[visibleIdentity] || null;
392
- }
393
- }
394
- }
395
- return row !== null && row.deleted ? null : row;
396
- }
397
-
398
- function currentHash_(row, fields) {
399
- var values = Object.create(null);
400
- Object.keys(fields).forEach(function (fieldName) {
401
- if (!Object.prototype.hasOwnProperty.call(row.cells, fieldName)) throw new Error("effect field is not a registered header: " + fieldName);
402
- values[fieldName] = row.cells[fieldName];
403
- });
404
- return visibleHash_(values);
405
- }
406
-
407
- function physicalHash_(targetSheet, targetLayout, rowNumber, fields) {
408
- var values = Object.create(null);
409
- Object.keys(fields).forEach(function (fieldName) {
410
- if (targetLayout.positions[fieldName] === undefined) throw new Error("effect field is not a registered header: " + fieldName);
411
- values[fieldName] = normalizedCellFromSheetValue_(
412
- targetSheet.getRange(rowNumber, targetLayout.positions[fieldName], 1, 1).getValues()[0][0],
413
- );
414
- });
415
- return visibleHash_(values);
416
- }
417
-
418
- function readPostconditionReceipts_() {
419
- var receiptSheetForRead = spreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
420
- return receiptSheetForRead === null ? Object.create(null) : readReceipts_(receiptSheetForRead);
421
- }
422
-
423
- function classifyPostcondition_(targetContext, rawEffect, receiptsForRead) {
424
- var checked = requireEffect_(rawEffect, args);
425
- var receipt = receiptsForRead[checked.effectId] || null;
426
- if (receipt !== null && receipt.payloadHash !== checked.payloadHash) {
427
- return postcondition_("changed", null, null);
428
- }
429
- var row = findRow_(targetContext, checked.payload.targetAnchor, checked.targetId);
430
- if (isDeletion_(checked.effectKind)) {
431
- if (receipt !== null && row === null) return postcondition_("applied", receipt.visibleRevision, receipt.visibleHash);
432
- if (row === null) return postcondition_("unavailable", null, null);
433
- var deleteHash = currentHash_(row, checked.payload.fields);
434
- if (receipt !== null) return postcondition_("changed", null, deleteHash);
435
- return deleteHash === checked.expectedVisibleHash
436
- ? postcondition_("unapplied", checked.expectedVisibleRevision, deleteHash)
437
- : postcondition_("changed", null, deleteHash);
438
- }
439
- // A receipt alone cannot prove that a non-delete row still exists; a
440
- // manual deletion must remain observable instead of closing the outbox.
441
- if (row === null) {
442
- // A receipt proves that this effect reached the Gateway, not that a
443
- // non-delete projection row still exists. Treat a manually removed row
444
- // as a terminal changed/manual-repair condition even when the original
445
- // effect allowed creation; otherwise recovery would hot-loop forever on
446
- // the same stale receipt.
447
- return postcondition_(
448
- receipt !== null || !checked.payload.createIfMissing ? "changed" : "unapplied",
449
- null,
450
- null,
451
- receipt === null ? null : "receipt_target_missing",
452
- );
453
- }
454
- var current = currentHash_(row, checked.payload.fields);
455
- if (current === checked.payload.targetVisibleHash) {
456
- if (receipt === null) {
457
- // The row already carries the target content, but without a receipt
458
- // there is no durable proof that this effect was applied by the
459
- // Gateway: the two-flush append can crash between the target-row
460
- // write and the receipt write and leave exactly this orphan. Closing
461
- // the outbox on row-hash evidence alone would turn that crash into a
462
- // false success, so stay fail-closed: the worker defers delivery and
463
- // probes again instead of calling completeApplied or redriving.
464
- return postcondition_("unavailable", null, current, "receipt_missing");
465
- }
466
- return postcondition_("applied", receipt.visibleRevision, current);
467
- }
468
- var repairGuard = optionalWireText_(checked.repairGuardHash);
469
- if (current === checked.expectedVisibleHash || (repairGuard !== null && current === repairGuard)) {
470
- return postcondition_("unapplied", checked.expectedVisibleRevision, current);
471
- }
472
- return postcondition_("changed", null, current);
473
- }
474
-
475
- function postcondition_(disposition, revision, hash, reason) {
476
- var result = { disposition: disposition, visibleRevision: revision, visibleHash: hash, snapshotHash: null };
477
- if (reason !== null && reason !== undefined) result.reason = reason;
478
- return result;
479
- }
480
-
481
- function requireEffect_(rawEffect, request) {
482
- requireObject_(rawEffect, "effect");
483
- var effectKind = string_(rawEffect.effectKind, "effectKind");
484
- if ([
485
- EFFECT_KINDS.SYSTEM_PROJECTION,
486
- EFFECT_KINDS.CANDIDATE_RECONCILE,
487
- EFFECT_KINDS.SYSTEM_REPAIR,
488
- EFFECT_KINDS.RESOLUTION_PROJECTION,
489
- EFFECT_KINDS.RESOLUTION_DELETE,
490
- EFFECT_KINDS.USER_INPUT_DELETE,
491
- ].indexOf(effectKind) < 0) throw new Error("unsupported sync effect kind: " + effectKind);
492
- if (rawEffect.projection !== request.projection) throw new Error("effect projection is not registered for this request");
493
- if (effectKind === EFFECT_KINDS.RESOLUTION_DELETE && request.projection !== "sync_conflicts") {
494
- throw new Error("resolution_delete is only allowed on sync_conflicts");
495
- }
496
- if (effectKind === EFFECT_KINDS.USER_INPUT_DELETE && request.projection !== "user_input") {
497
- throw new Error("user_input_delete is only allowed on user_input");
498
- }
499
- var payload = rawEffect.payload;
500
- requireObject_(payload, "effect payload");
501
- if (payload.sheetName !== request.sheetName || payload.registeredRange !== request.registeredRange ||
502
- payload.schemaVersion !== request.schemaVersion) throw new Error("effect payload does not match the registered projection");
503
- var fields = Object.create(null);
504
- requireObject_(payload.fields, "effect fields");
505
- Object.keys(payload.fields).forEach(function (fieldName) { fields[fieldName] = normalizeCell_(payload.fields[fieldName]); });
506
- if (Object.keys(fields).length === 0) throw new Error("effect fields must contain a field");
507
- if (visibleHash_(fields) !== string_(payload.targetVisibleHash, "targetVisibleHash")) {
508
- throw new Error("effect targetVisibleHash does not match fields");
509
- }
510
- if (typeof payload.createIfMissing !== "boolean") throw new Error("effect createIfMissing must be boolean");
511
- var expectedVisibleRevision = nonNegativeInteger_(rawEffect.expectedVisibleRevision, "expectedVisibleRevision");
512
- var expectedVisibleHash = stringAllowEmpty_(rawEffect.expectedVisibleHash, "expectedVisibleHash");
513
- if (
514
- expectedVisibleHash.length === 0 &&
515
- !(expectedVisibleRevision === 0 && payload.createIfMissing === true)
516
- ) {
517
- throw new Error("empty expectedVisibleHash is only valid for a new row");
518
- }
519
- return {
520
- effectId: string_(rawEffect.effectId, "effectId"),
521
- payloadHash: string_(rawEffect.payloadHash, "payloadHash"),
522
- effectKind: effectKind,
523
- targetId: typeof rawEffect.targetId === "string" && rawEffect.targetId.length > 0 ? rawEffect.targetId : null,
524
- expectedVisibleRevision: expectedVisibleRevision,
525
- expectedVisibleHash: expectedVisibleHash,
526
- repairGuardHash: rawEffect.repairGuardHash,
527
- payload: {
528
- targetAnchor: string_(payload.targetAnchor, "targetAnchor"),
529
- targetVisibleHash: payload.targetVisibleHash,
530
- createIfMissing: payload.createIfMissing,
531
- expectedCandidateHash: payload.expectedCandidateHash,
532
- fields: fields,
533
- },
534
- };
535
- }
536
-
537
- function validateDeletion_(targetLayout, checked) {
538
- if (checked.payload.createIfMissing || checked.expectedVisibleRevision < 1 ||
539
- checked.payload.targetVisibleHash !== checked.expectedVisibleHash) return "invalid_deletion_guard";
540
- var names = Object.keys(checked.payload.fields).sort();
541
- var headers = targetLayout.headers.slice().sort();
542
- if (names.length !== headers.length) return checked.effectKind + "_requires_full_row";
543
- for (var index = 0; index < headers.length; index += 1) if (names[index] !== headers[index]) return checked.effectKind + "_requires_full_row";
544
- return null;
545
- }
546
-
547
- function result_(checked, status, rowNumber, reason, receipt) {
548
- return {
549
- effectId: checked.effectId,
550
- payloadHash: checked.payloadHash,
551
- status: status,
552
- visibleRevision: receipt === null ? null : receipt.visibleRevision,
553
- visibleHash: receipt === null ? null : receipt.visibleHash,
554
- snapshotHash: null,
555
- reason: reason === null ? null : reason,
556
- postcondition: receipt === null ? "unavailable" : "verified",
557
- };
558
- }
559
-
560
- function makeReceipt_(checked, visibleHash, visibleRevision) {
561
- return { effectId: checked.effectId, payloadHash: checked.payloadHash, status: "applied", visibleHash: visibleHash, visibleRevision: visibleRevision };
562
- }
563
-
564
- function ensureReceiptSheet_(targetSpreadsheet) {
565
- var target = targetSpreadsheet.getSheetByName(RECEIPT_SHEET_NAME);
566
- if (target === null) target = targetSpreadsheet.insertSheet(RECEIPT_SHEET_NAME);
567
- if (target.getLastRow() === 0 && target.getLastColumn() === 0) target.getRange(1, 1, 1, RECEIPT_HEADERS.length).setValues([RECEIPT_HEADERS]);
568
- var actual = target.getRange(1, 1, 1, RECEIPT_HEADERS.length).getValues()[0];
569
- RECEIPT_HEADERS.forEach(function (header, index) { if (String(actual[index]) !== header) throw new Error("receipt sheet headers do not match"); });
570
- try { if (!target.isSheetHidden()) target.hideSheet(); } catch (error) {}
571
- return target;
572
- }
573
-
574
- function readReceipts_(target) {
575
- var parsed = Object.create(null);
576
- var lastRow = target.getLastRow();
577
- if (lastRow < 2) return parsed;
578
- target.getRange(2, 1, lastRow - 1, RECEIPT_HEADERS.length).getValues().forEach(function (row, index) {
579
- if (row[0] === "" || row[0] === null) return;
580
- var effectId = String(row[0]);
581
- if (parsed[effectId] !== undefined) throw new Error("receipt sheet contains duplicate effectId: " + effectId);
582
- parsed[effectId] = {
583
- effectId: effectId,
584
- payloadHash: string_(row[1], "receipt payloadHash"),
585
- status: string_(row[2], "receipt status"),
586
- visibleHash: string_(row[3], "receipt visibleHash"),
587
- visibleRevision: nonNegativeInteger_(row[4], "receipt visibleRevision"),
588
- rowNumber: index + 2,
589
- };
590
- if (parsed[effectId].status !== "applied") throw new Error("receipt status must be applied");
591
- });
592
- return parsed;
593
- }
594
-
595
- function queueReceipt_(stored, pending, pendingById, receipt) {
596
- var existing = stored[receipt.effectId] || pendingById[receipt.effectId] || null;
597
- if (existing !== null) {
598
- if (existing.payloadHash !== receipt.payloadHash) throw new Error("effect ID cannot be reused with another payload");
599
- return;
600
- }
601
- pendingById[receipt.effectId] = receipt;
602
- pending.push(receipt);
603
- }
604
-
605
- function writeReceipts_(target, values) {
606
- if (values.length === 0) return;
607
- var startRow = Math.max(target.getLastRow() + 1, 2);
608
- // Reserve hidden receipt rows as well; setValues must not depend on the
609
- // receipt sheet's finite preallocated grid.
610
- target.insertRowsAfter(startRow - 1, values.length);
611
- var updatedAt = new Date().toISOString();
612
- target.getRange(startRow, 1, values.length, RECEIPT_HEADERS.length).setValues(values.map(function (receipt) {
613
- return [receipt.effectId, receipt.payloadHash, receipt.status, receipt.visibleHash, receipt.visibleRevision, updatedAt];
614
- }));
615
- // The receipt is the durable evidence a later locked probe reads. Flush it
616
- // while the effect lock is still held: the ScriptLock is released when this
617
- // operation returns, before the outer dispatcher's final flush, so a second
618
- // apply/probe that acquires the lock next must already see the receipt.
619
- // Without this flush it would read the target row without the receipt and
620
- // replay or corrupt receipt state.
621
- SpreadsheetApp.flush();
622
- }
623
-
624
- function writeDeletionAndReceiptsBatch_(targetSheet, receiptSheetTarget, rows, receiptsToWrite) {
625
- if (rows.length === 0) return;
626
- // The row deletes and the receipt write are separate built-in
627
- // SpreadsheetApp mutations, not one Advanced Sheets batch: a crash
628
- // between them is ambiguous and must never be reported as applied
629
- // without proof. Delete the target rows first in descending physical row
630
- // order so no earlier delete shifts a later delete target, flush, then
631
- // append the receipts and flush again. A crash between the two phases
632
- // leaves rows deleted without receipts, which the postcondition probe
633
- // classifies as unavailable (delivery-uncertain), never as applied;
634
- // receipt-backed applied evidence is returned only after the receipt
635
- // write below lands.
636
- rows.slice().sort(function (left, right) { return right.rowNumber - left.rowNumber; }).forEach(function (row) {
637
- targetSheet.deleteRows(row.rowNumber, 1);
638
- });
639
- SpreadsheetApp.flush();
640
- if (receiptsToWrite.length > 0) {
641
- var receiptStartRow = Math.max(receiptSheetTarget.getLastRow() + 1, 2);
642
- var updatedAt = new Date().toISOString();
643
- // Reserve the receipt rows through the spreadsheet mutation API before
644
- // writing values so a concurrent human append is shifted rather than
645
- // overwritten.
646
- receiptSheetTarget.insertRowsAfter(receiptStartRow - 1, receiptsToWrite.length);
647
- receiptSheetTarget.getRange(receiptStartRow, 1, receiptsToWrite.length, RECEIPT_HEADERS.length).setValues(receiptsToWrite.map(function (receipt) {
648
- return [receipt.effectId, receipt.payloadHash, receipt.status, receipt.visibleHash, receipt.visibleRevision, updatedAt];
649
- }));
650
- }
651
- SpreadsheetApp.flush();
652
- }
653
-
654
- function writeAppendRows_(target, targetLayout, rows, checkboxHeaders) {
655
- if (rows.length === 0) return;
656
- rows.sort(function (left, right) { return left.rowNumber - right.rowNumber; });
657
- // Reserve rows through the spreadsheet mutation API before writing values
658
- // so a concurrent human append is shifted rather than overwritten.
659
- target.insertRowsAfter(rows[0].rowNumber - 1, rows.length);
660
- target.getRange(rows[0].rowNumber, targetLayout.startColumn, rows.length, targetLayout.columnCount).setValues(rows.map(function (row) {
661
- return targetLayout.headers.map(function (header) { return toSheetValue_(row.cells[header]); });
662
- }));
663
- rows.forEach(function (row) {
664
- target.getRange(row.rowNumber + ":" + row.rowNumber).addDeveloperMetadata(ANCHOR_KEY, row.physicalAnchor, SpreadsheetApp.DeveloperMetadataVisibility.PROJECT);
665
- });
666
- if (Array.isArray(checkboxHeaders)) checkboxHeaders.forEach(function (header) {
667
- var position = targetLayout.positions[header];
668
- if (position === undefined) throw new Error("checkbox header is not registered: " + header);
669
- target.getRange(rows[0].rowNumber, position, rows.length, 1).setDataValidation(
670
- SpreadsheetApp.newDataValidation().requireCheckbox().setAllowInvalid(false).build(),
671
- );
672
- });
673
- }
674
-
675
- function writeFieldUpdates_(target, targetLayout, rows) {
676
- rows.filter(function (row) { return !row.appended && Object.keys(row.writeFields).length > 0; }).forEach(function (row) {
677
- var fields = Object.keys(row.writeFields).sort(function (left, right) { return targetLayout.positions[left] - targetLayout.positions[right]; });
678
- var run = [];
679
- fields.forEach(function (fieldName) {
680
- if (run.length > 0 && targetLayout.positions[fieldName] !== targetLayout.positions[run[run.length - 1]] + 1) {
681
- writeFieldRun_(target, targetLayout, row, run);
682
- run = [];
683
- }
684
- run.push(fieldName);
685
- });
686
- if (run.length > 0) writeFieldRun_(target, targetLayout, row, run);
687
- });
688
- }
689
-
690
- function writeFieldRun_(target, targetLayout, row, fields) {
691
- target.getRange(row.rowNumber, targetLayout.positions[fields[0]], 1, fields.length).setValues([
692
- fields.map(function (fieldName) { return toSheetValue_(row.writeFields[fieldName]); }),
693
- ]);
694
- }
695
-
696
- function readAnchors_(target, rowNumber) {
697
- return target.getRange(rowNumber + ":" + rowNumber).getDeveloperMetadata().filter(function (metadata) {
698
- return metadata.getKey() === ANCHOR_KEY;
699
- }).map(function (metadata) { return String(metadata.getValue()); });
700
- }
701
-
702
- function parseRange_(value) {
703
- if (typeof value !== "string" || !/^[A-Z]+:[A-Z]+$/.test(value)) throw new Error("registeredRange must be an uppercase whole-column range");
704
- var parts = value.split(":");
705
- var startColumn = columnNumber_(parts[0]);
706
- var endColumn = columnNumber_(parts[1]);
707
- if (endColumn < startColumn) throw new Error("registeredRange end precedes start");
708
- return { startColumn: startColumn, columnCount: endColumn - startColumn + 1 };
709
- }
710
-
711
- function columnNumber_(letters) {
712
- var value = 0;
713
- for (var index = 0; index < letters.length; index += 1) value = value * 26 + letters.charCodeAt(index) - 64;
714
- return value;
715
- }
716
-
717
- function isCanonicalDate_(value) {
718
- if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value)) return false;
719
- var parsed = new Date(value);
720
- return !isNaN(parsed.getTime()) && parsed.toISOString() === value;
721
- }
722
-
723
- function normalizeCell_(value) {
724
- if (value === null) return null;
725
- requireObject_(value, "normalized cell");
726
- if (value.kind === "string" && typeof value.value === "string") return { kind: "string", value: normalizeScalarString_(value.value) };
727
- if (value.kind === "date" && isCanonicalDate_(value.value)) return { kind: "date", value: value.value };
728
- if (value.kind === "number" && typeof value.value === "number" && isFinite(value.value)) return { kind: "number", value: value.value };
729
- if (value.kind === "boolean" && typeof value.value === "boolean") return { kind: "boolean", value: value.value };
730
- throw new Error("normalized cell is invalid");
731
- }
732
-
733
- function normalizedCellFromSheetValue_(value) {
734
- if (value === "" || value === null) return null;
735
- if (isDate_(value)) return { kind: "date", value: value.toISOString() };
736
- if (typeof value === "string") return { kind: "string", value: normalizeScalarString_(value) };
737
- if (typeof value === "number" && isFinite(value)) return { kind: "number", value: value };
738
- if (typeof value === "boolean") return { kind: "boolean", value: value };
739
- throw new Error("Sheet cell cannot be normalized");
740
- }
741
-
742
- function toSheetValue_(value) {
743
- if (value === null) return "";
744
- return value.kind === "date" ? new Date(value.value) : value.value;
745
- }
746
- function identityFromCell_(value) {
747
- if (value === null || value === undefined) return null;
748
- if (typeof value.value === "string" && value.value.length > 0) return value.value;
749
- if (typeof value.value === "number" && isFinite(value.value)) return String(value.value);
750
- return null;
751
- }
752
- function optionalWireText_(value) {
753
- if (value === null || value === undefined) return null;
754
- if (typeof value === "string") return value;
755
- if (isObject_(value) && (value.kind === "present" || value.kind === "applicable")) return string_(value.value, "optional wire value");
756
- if (isObject_(value) && (value.kind === "absent" || value.kind === "not_applicable")) return null;
757
- throw new Error("optional wire value is invalid");
758
- }
759
- function isDeletion_(effectKind) { return effectKind === EFFECT_KINDS.RESOLUTION_DELETE || effectKind === EFFECT_KINDS.USER_INPUT_DELETE; }
760
- function countOperationKinds_(effects) {
761
- var counts = { append: 0, update: 0, delete: 0 };
762
- effects.forEach(function (effect) {
763
- if (effect !== null && isDeletion_(effect.effectKind)) {
764
- counts.delete += 1;
765
- return;
766
- }
767
- if (effect !== null && effect.payload !== null && effect.payload !== undefined &&
768
- effect.payload.createIfMissing === true && effect.expectedVisibleRevision === 0 &&
769
- effect.expectedVisibleHash === "") {
770
- counts.append += 1;
771
- return;
772
- }
773
- counts.update += 1;
774
- });
775
- return counts;
776
- }
777
- function operationKinds_(counts) {
778
- var kinds = [];
779
- if (counts.append > 0) kinds.push("append");
780
- if (counts.update > 0) kinds.push("update");
781
- if (counts.delete > 0) kinds.push("delete");
782
- return kinds;
783
- }
784
- function phase_(name, phaseStartedAt) {
785
- phases.push({ phase: name, durationMs: Date.now() - phaseStartedAt });
786
- }
787
- function appendTimingPhase_(result, phaseName, durationMs) {
788
- if (!isObject_(result) || !isObject_(result.timing)) return;
789
- if (!Array.isArray(result.timing.phases)) result.timing.phases = [];
790
- // Keep the script-lock wait/hold duration as a diagnostic phase, but do
791
- // not fold it into the total: durationMs already measures the whole
792
- // operation including the lock wait, so adding the nested phase would
793
- // double-count the elapsed time.
794
- result.timing.phases.push({ phase: phaseName, durationMs: durationMs });
795
- }
796
- function isBlankRow_(row) { return row.every(function (cell) { return cell === "" || cell === null; }); }
797
- function isDate_(value) { return Object.prototype.toString.call(value) === "[object Date]" && !isNaN(value.getTime()); }
798
- function isObject_(value) { return value !== null && typeof value === "object" && !Array.isArray(value); }
799
- function requireObject_(value, label) { if (!isObject_(value)) throw new Error(label + " must be an object"); return value; }
800
- function string_(value, label) { if (typeof value !== "string" || value.length === 0) throw new Error(label + " must be a non-empty string"); return value; }
801
- function stringAllowEmpty_(value, label) { if (typeof value !== "string") throw new Error(label + " must be a string"); return value; }
802
- function nonNegativeInteger_(value, label) { if (typeof value !== "number" || !isFinite(value) || Math.floor(value) !== value || value < 0) throw new Error(label + " must be a non-negative integer"); return value; }
803
-
804
- function visibleHash_(fields) {
805
- return codecStableHash_({ fields: Object.keys(fields).sort().map(function (fieldName) { return { fieldName: fieldName, value: fields[fieldName] }; }) });
806
- }
807
- function normalizeScalarString_(value) { return value.normalize("NFC"); }
808
- ${APPS_SCRIPT_STABLE_CODEC_SOURCE}
809
- }`;
810
- //# sourceMappingURL=effectOperationScript.js.map