nimbus-dev-sdk 0.1.0__tar.gz

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 (195) hide show
  1. nimbus_dev_sdk-0.1.0/.gitignore +28 -0
  2. nimbus_dev_sdk-0.1.0/CHANGELOG.md +10 -0
  3. nimbus_dev_sdk-0.1.0/LICENSE +21 -0
  4. nimbus_dev_sdk-0.1.0/PKG-INFO +54 -0
  5. nimbus_dev_sdk-0.1.0/README.md +32 -0
  6. nimbus_dev_sdk-0.1.0/hatch_build.py +40 -0
  7. nimbus_dev_sdk-0.1.0/pyproject.toml +64 -0
  8. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/__init__.py +46 -0
  9. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/case.schema.json +160 -0
  10. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/blank-frames-dropped-mid-stream.json +8 -0
  11. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/blank-remainder-dropped-at-eof.json +8 -0
  12. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/bom-at-stream-start-ignored.json +8 -0
  13. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/cr-inside-frame-preserved.json +8 -0
  14. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-1-3.json +8 -0
  15. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-2-2.json +8 -0
  16. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-3-1.json +8 -0
  17. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/empty-stream.json +8 -0
  18. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-exactly-at-limit.json +10 -0
  19. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-one-octet-over-limit.json +10 -0
  20. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-split-across-three-chunks.json +8 -0
  21. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-split-across-two-chunks.json +8 -0
  22. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/incomplete-sequence-at-eof.json +8 -0
  23. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/invalid-utf8-becomes-replacement.json +8 -0
  24. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/limit-counts-octets-not-characters.json +8 -0
  25. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/limit-violation-latches.json +17 -0
  26. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/lone-continuation-byte.json +8 -0
  27. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/pending-over-limit-without-newline.json +8 -0
  28. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/several-frames-in-one-chunk.json +8 -0
  29. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/single-frame-crlf.json +8 -0
  30. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/single-frame-lf.json +8 -0
  31. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/two-byte-sequence-split.json +8 -0
  32. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/unterminated-final-frame.json +8 -0
  33. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/whitespace-only-frame-delivered.json +8 -0
  34. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/index.json +125 -0
  35. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/index.schema.json +37 -0
  36. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/index.json +298 -0
  37. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/index.schema.json +82 -0
  38. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/invalid-missing-name.json +5 -0
  39. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/invalid-size-bytes-type.json +7 -0
  40. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-maximal.json +13 -0
  41. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-minimal.json +6 -0
  42. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-unknown-extra-key.json +7 -0
  43. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-unknown-item-type.json +6 -0
  44. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-duplicate.json +13 -0
  45. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-empty.json +13 -0
  46. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-entry.json +13 -0
  47. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-not-array.json +13 -0
  48. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-hitl-required-not-array.json +14 -0
  49. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-hitl-required.json +12 -0
  50. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-many-violations.json +4 -0
  51. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-author.json +13 -0
  52. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-description.json +13 -0
  53. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-display-name.json +13 -0
  54. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-entrypoint.json +13 -0
  55. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-id.json +11 -0
  56. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-min-version.json +13 -0
  57. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-version.json +13 -0
  58. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-nel-only-id.json +14 -0
  59. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-non-ascii-min-version.json +14 -0
  60. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-permission.json +12 -0
  61. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-permissions-not-array.json +12 -0
  62. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-runtime.json +12 -0
  63. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-short-min-version.json +12 -0
  64. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-two-permissions.json +16 -0
  65. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-whitespace-id.json +12 -0
  66. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/schema-only-bad-sync-interval.json +13 -0
  67. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-contract-versions.json +13 -0
  68. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-leading-space-min-version.json +12 -0
  69. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-maximal.json +24 -0
  70. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-minimal.json +12 -0
  71. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-prerelease-min-version.json +12 -0
  72. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-unknown-extra-key.json +13 -0
  73. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-zero-width-space-id.json +14 -0
  74. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/case.schema.json +93 -0
  75. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-absent-default.json +6 -0
  76. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-absent-superset.json +6 -0
  77. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-manifest-not-array.json +7 -0
  78. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-match.json +7 -0
  79. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-order.json +7 -0
  80. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-superset.json +7 -0
  81. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-array.json +6 -0
  82. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-canonical.json +6 -0
  83. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-duplicate.json +6 -0
  84. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-empty-versions.json +6 -0
  85. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-leading-zero.json +6 -0
  86. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-missing-versions.json +6 -0
  87. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-non-ascii-digit.json +6 -0
  88. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-not-json.json +6 -0
  89. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-null.json +6 -0
  90. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-padded.json +6 -0
  91. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-reversed-members.json +6 -0
  92. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-unknown-member.json +6 -0
  93. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-versions-not-array.json +6 -0
  94. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-wrong-message.json +6 -0
  95. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-disjoint.json +7 -0
  96. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-duplicate-member.json +7 -0
  97. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-empty-local.json +7 -0
  98. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-empty-remote.json +7 -0
  99. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-largest-common.json +7 -0
  100. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-leading-zero.json +7 -0
  101. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-long-major.json +7 -0
  102. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-non-ascii-digit.json +7 -0
  103. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-non-string.json +7 -0
  104. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-order-a.json +7 -0
  105. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-order-b.json +7 -0
  106. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-ten-beats-nine.json +7 -0
  107. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-v1-both.json +7 -0
  108. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/index.json +170 -0
  109. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/index.schema.json +37 -0
  110. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/case.schema.json +76 -0
  111. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-action-id-non-string-rejected.json +9 -0
  112. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-array-rejected.json +6 -0
  113. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-non-string-rejected.json +10 -0
  114. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-null-rejected.json +10 -0
  115. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-present-accepted.json +10 -0
  116. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-action-id-rejected.json +9 -0
  117. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-object-rejected.json +6 -0
  118. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-summary-rejected.json +9 -0
  119. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-minimal-accepted.json +9 -0
  120. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-missing-action-id-rejected.json +8 -0
  121. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-missing-summary-rejected.json +8 -0
  122. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-null-rejected.json +6 -0
  123. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-number-rejected.json +6 -0
  124. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-string-rejected.json +6 -0
  125. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-unknown-member-accepted.json +10 -0
  126. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-whitespace-action-id-accepted.json +9 -0
  127. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-whitespace-summary-accepted.json +9 -0
  128. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-ascii-fold-uppercase.json +15 -0
  129. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-blank-names-skipped.json +22 -0
  130. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-description-never-inspected.json +11 -0
  131. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-digits-are-segment-characters.json +15 -0
  132. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-dotted-capital-i-is-a-separator.json +10 -0
  133. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-empty-surface-clean.json +6 -0
  134. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-every-published-segment.json +169 -0
  135. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-first-match-in-name-order.json +15 -0
  136. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-input-order-preserved.json +25 -0
  137. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-kelvin-sign-is-a-separator.json +15 -0
  138. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-metadata-surface-clean.json +16 -0
  139. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-non-ascii-name-clean.json +10 -0
  140. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-non-string-name-skipped.json +22 -0
  141. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-offender-attributed-to-segment.json +15 -0
  142. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-one-violation-per-tool.json +15 -0
  143. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-segment-not-substring.json +13 -0
  144. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/index.json +170 -0
  145. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/index.schema.json +37 -0
  146. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/case.schema.json +116 -0
  147. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eacces.json +7 -0
  148. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-ebusy.json +7 -0
  149. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-econnrefused-is-not-a-denial.json +7 -0
  150. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eisdir-is-not-a-denial.json +7 -0
  151. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-enoent-is-not-a-denial.json +7 -0
  152. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eperm.json +7 -0
  153. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-no-code.json +7 -0
  154. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-eacces-is-not-a-block.json +7 -0
  155. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-econnrefused.json +7 -0
  156. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-econnreset-is-not-a-block.json +7 -0
  157. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-ehostunreach.json +7 -0
  158. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-enetunreach.json +7 -0
  159. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-eperm.json +7 -0
  160. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-etimedout-is-not-a-block.json +7 -0
  161. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-no-code.json +7 -0
  162. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-empty-network-array-skips.json +20 -0
  163. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-empty-string-host-is-a-host.json +32 -0
  164. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-fs-failure-throws.json +19 -0
  165. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-fs-pass-is-a-failure.json +19 -0
  166. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-darwin-all-three.json +32 -0
  167. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-posix-all-three.json +32 -0
  168. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-win32-skips-unlisted.json +27 -0
  169. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-listed-blocked-is-a-failure.json +23 -0
  170. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-listed-failure-stops-immediately.json +23 -0
  171. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-no-hosts-posix-skips-both-network.json +18 -0
  172. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-no-hosts-win32-only-fs.json +18 -0
  173. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-only-first-host-probed.json +34 -0
  174. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-absent.json +17 -0
  175. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-legacy-array.json +21 -0
  176. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-null.json +18 -0
  177. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-unlisted-failure-stops-before-fs.json +28 -0
  178. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/index.json +160 -0
  179. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/index.schema.json +37 -0
  180. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/negotiation/hello.schema.json +21 -0
  181. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/predicates/v1/row-data-segments.json +39 -0
  182. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/predicates/v1/row-data-segments.schema.json +60 -0
  183. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/probe/v1/probe-protocol.json +72 -0
  184. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/probe/v1/probe-protocol.schema.json +90 -0
  185. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/rules/v1/manifest-rules.json +116 -0
  186. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/rules/v1/manifest-rules.schema.json +65 -0
  187. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/extension-manifest.schema.json +72 -0
  188. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/hitl-request.schema.json +24 -0
  189. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/nimbus-item.schema.json +29 -0
  190. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/contract.py +138 -0
  191. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/py.typed +0 -0
  192. nimbus_dev_sdk-0.1.0/src/nimbus_sdk/spec.py +72 -0
  193. nimbus_dev_sdk-0.1.0/tests/test_contract.py +145 -0
  194. nimbus_dev_sdk-0.1.0/tests/test_negotiation_corpus.py +76 -0
  195. nimbus_dev_sdk-0.1.0/tests/test_spec.py +123 -0
@@ -0,0 +1,28 @@
1
+ node_modules/
2
+ dist/
3
+ coverage/
4
+ sdks/python/dist/
5
+ *.tsbuildinfo
6
+ .DS_Store
7
+ .docs-snippets/
8
+
9
+ # Git worktrees live inside the repo tree, so without these an entire worktree
10
+ # shows up as untracked content and `git add -A` will happily commit it.
11
+ .claude/worktrees/
12
+ .worktrees/
13
+
14
+ # Subagent-driven-development scratch (ledger, briefs, review packages).
15
+ .superpowers/
16
+
17
+ # Python build and tool artefacts. Without these a plain `pytest`/`mypy`/`ruff` run
18
+ # leaves untracked caches behind, and `git add -A` sweeps them into a commit.
19
+ __pycache__/
20
+ *.py[cod]
21
+ .pytest_cache/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+ *.egg-info/
25
+ .venv/
26
+
27
+ # Copied from docs/spec/ at build time by sdks/python/hatch_build.py.
28
+ sdks/python/src/nimbus_sdk/_data/
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-07-30)
4
+
5
+
6
+ ### Features
7
+
8
+ * publish the Python SDK to PyPI tokenlessly ([#73](https://github.com/nimbus-agent/nimbus-sdk/issues/73)) ([1b4ddce](https://github.com/nimbus-agent/nimbus-sdk/commit/1b4ddcec13fbff788be6f917b34feb80aead78d6))
9
+
10
+ ## nimbus-dev-sdk — Changelog
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nimbus Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,54 @@
1
+ Metadata-Version: 2.4
2
+ Name: nimbus-dev-sdk
3
+ Version: 0.1.0
4
+ Summary: The MIT-licensed, dependency-free authoring contract for Nimbus connectors and extensions — Python binding.
5
+ Project-URL: Homepage, https://github.com/nimbus-agent/nimbus-sdk
6
+ Project-URL: Repository, https://github.com/nimbus-agent/nimbus-sdk
7
+ Project-URL: Changelog, https://github.com/nimbus-agent/nimbus-sdk/blob/main/sdks/python/CHANGELOG.md
8
+ Author: Nimbus
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: connector,contract,mcp,nimbus,sdk
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: >=3.11
21
+ Description-Content-Type: text/markdown
22
+
23
+ # nimbus-dev-sdk
24
+
25
+ The MIT-licensed, dependency-free authoring contract for
26
+ [Nimbus](https://github.com/nimbus-agent/Nimbus) connectors and extensions — Python binding.
27
+
28
+ ```bash
29
+ pip install nimbus-dev-sdk # note: nimbus-dev-sdk, NOT nimbus-sdk
30
+ ```
31
+ ```python
32
+ import nimbus_sdk # the import name differs from the distribution name
33
+ ```
34
+
35
+ PyPI has a flat namespace and `nimbus-sdk` belongs to an unrelated project, so the
36
+ distribution is published as `nimbus-dev-sdk`.
37
+
38
+ ## What this is
39
+
40
+ The contract is defined once, language-neutrally, in
41
+ [`docs/spec/`](https://github.com/nimbus-agent/nimbus-sdk/tree/main/docs/spec). This
42
+ package carries that specification data and binds it to Python. The
43
+ [TypeScript SDK](https://www.npmjs.com/package/@nimbus-dev/sdk) is the reference
44
+ implementation; both are held to the same conformance corpus.
45
+
46
+ ## Status
47
+
48
+ Early. This release carries the contract-version constants, the negotiation algorithm,
49
+ and the published JSON Schemas. It is not yet the full connector-authoring surface —
50
+ see the [roadmap](https://github.com/nimbus-agent/nimbus-sdk/blob/main/docs/ROADMAP.md).
51
+
52
+ ## License
53
+
54
+ MIT — see [LICENSE](https://github.com/nimbus-agent/nimbus-sdk/blob/main/LICENSE).
@@ -0,0 +1,32 @@
1
+ # nimbus-dev-sdk
2
+
3
+ The MIT-licensed, dependency-free authoring contract for
4
+ [Nimbus](https://github.com/nimbus-agent/Nimbus) connectors and extensions — Python binding.
5
+
6
+ ```bash
7
+ pip install nimbus-dev-sdk # note: nimbus-dev-sdk, NOT nimbus-sdk
8
+ ```
9
+ ```python
10
+ import nimbus_sdk # the import name differs from the distribution name
11
+ ```
12
+
13
+ PyPI has a flat namespace and `nimbus-sdk` belongs to an unrelated project, so the
14
+ distribution is published as `nimbus-dev-sdk`.
15
+
16
+ ## What this is
17
+
18
+ The contract is defined once, language-neutrally, in
19
+ [`docs/spec/`](https://github.com/nimbus-agent/nimbus-sdk/tree/main/docs/spec). This
20
+ package carries that specification data and binds it to Python. The
21
+ [TypeScript SDK](https://www.npmjs.com/package/@nimbus-dev/sdk) is the reference
22
+ implementation; both are held to the same conformance corpus.
23
+
24
+ ## Status
25
+
26
+ Early. This release carries the contract-version constants, the negotiation algorithm,
27
+ and the published JSON Schemas. It is not yet the full connector-authoring surface —
28
+ see the [roadmap](https://github.com/nimbus-agent/nimbus-sdk/blob/main/docs/ROADMAP.md).
29
+
30
+ ## License
31
+
32
+ MIT — see [LICENSE](https://github.com/nimbus-agent/nimbus-sdk/blob/main/LICENSE).
@@ -0,0 +1,40 @@
1
+ """Copy the language-neutral spec into the distribution at build time.
2
+
3
+ The spec lives at the repository root, outside this project directory, because it is
4
+ not Python's to own. Both the sdist and the wheel need it: a hook that populates only
5
+ the wheel produces an sdist that cannot be built from, which nobody notices until a
6
+ downstream packager tries.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import shutil
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from hatchling.builders.hooks.plugin.interface import BuildHookInterface
16
+
17
+ DATA_DIR = Path("src") / "nimbus_sdk" / "_data" / "spec"
18
+
19
+
20
+ class SpecDataHook(BuildHookInterface): # type: ignore[type-arg]
21
+ """Populates ``nimbus_sdk/_data/spec`` before every build target."""
22
+
23
+ PLUGIN_NAME = "spec-data"
24
+
25
+ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
26
+ project = Path(self.root)
27
+ source = project.parent.parent / "docs" / "spec"
28
+ if not source.is_dir():
29
+ # An sdist already carries its own copy under src/, so a rebuild from an
30
+ # unpacked sdist has no repository above it and nothing to do.
31
+ if (project / DATA_DIR).is_dir():
32
+ return
33
+ raise RuntimeError(
34
+ f"spec source not found at {source} and no bundled copy present"
35
+ )
36
+
37
+ target = project / DATA_DIR
38
+ if target.exists():
39
+ shutil.rmtree(target)
40
+ shutil.copytree(source, target, ignore=shutil.ignore_patterns("*.md"))
@@ -0,0 +1,64 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "nimbus-dev-sdk"
7
+ version = "0.1.0"
8
+ description = "The MIT-licensed, dependency-free authoring contract for Nimbus connectors and extensions — Python binding."
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [{ name = "Nimbus" }]
13
+ keywords = ["nimbus", "mcp", "connector", "sdk", "contract"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Programming Language :: Python :: 3.13",
21
+ "Programming Language :: Python :: 3.14",
22
+ "Typing :: Typed",
23
+ ]
24
+ dependencies = []
25
+
26
+ [project.urls]
27
+ Homepage = "https://github.com/nimbus-agent/nimbus-sdk"
28
+ Repository = "https://github.com/nimbus-agent/nimbus-sdk"
29
+ Changelog = "https://github.com/nimbus-agent/nimbus-sdk/blob/main/sdks/python/CHANGELOG.md"
30
+
31
+ [tool.hatch.build.targets.wheel]
32
+ packages = ["src/nimbus_sdk"]
33
+ # Hatchling selects files by VCS: anything git ignores is excluded, and `packages`
34
+ # only narrows within that tracked set. `_data/` is generated at build time AND
35
+ # gitignored, so without this it is silently absent from the built distribution —
36
+ # producing a package that installs cleanly, imports fine, and carries no contract
37
+ # data at all. `artifacts` is the escape hatch for exactly this case.
38
+ artifacts = ["src/nimbus_sdk/_data/**"]
39
+
40
+ [tool.hatch.build.targets.wheel.hooks.custom]
41
+ path = "hatch_build.py"
42
+
43
+ [tool.hatch.build.targets.sdist]
44
+ include = ["src/", "tests/", "README.md", "CHANGELOG.md", "pyproject.toml", "hatch_build.py"]
45
+ artifacts = ["src/nimbus_sdk/_data/**"]
46
+
47
+ [tool.hatch.build.targets.sdist.hooks.custom]
48
+ path = "hatch_build.py"
49
+
50
+ [tool.ruff]
51
+ line-length = 88
52
+ target-version = "py311"
53
+
54
+ [tool.ruff.lint]
55
+ select = ["E", "F", "I", "N", "UP", "B", "A", "C4", "PT", "RUF"]
56
+
57
+ [tool.mypy]
58
+ python_version = "3.11"
59
+ strict = true
60
+ files = ["src", "tests", "hatch_build.py"]
61
+
62
+ [tool.pytest.ini_options]
63
+ testpaths = ["tests"]
64
+ markers = ["slow: builds a distribution and installs it into a throwaway venv"]
@@ -0,0 +1,46 @@
1
+ """Nimbus SDK — the Python binding of the Nimbus authoring contract.
2
+
3
+ The contract itself is language-neutral and published under ``docs/spec/`` in the
4
+ `nimbus-sdk repository <https://github.com/nimbus-agent/nimbus-sdk>`_. This package
5
+ carries that data and binds it to Python.
6
+
7
+ Installed as ``nimbus-dev-sdk``; imported as ``nimbus_sdk``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from importlib.metadata import PackageNotFoundError, version
13
+
14
+ from nimbus_sdk.contract import (
15
+ CONTRACT_HANDSHAKE_EXIT,
16
+ CONTRACT_VERSION_PATTERN,
17
+ CONTRACT_VERSIONS,
18
+ NegotiationOk,
19
+ NegotiationRefused,
20
+ NegotiationResult,
21
+ declared_versions_match,
22
+ manifest_contract_versions,
23
+ negotiate_contract_version,
24
+ )
25
+ from nimbus_sdk.spec import load_corpus, load_schema, spec_root
26
+
27
+ try:
28
+ __version__ = version("nimbus-dev-sdk")
29
+ except PackageNotFoundError: # running from an uninstalled source tree
30
+ __version__ = "0.0.0+unknown"
31
+
32
+ __all__ = [
33
+ "CONTRACT_HANDSHAKE_EXIT",
34
+ "CONTRACT_VERSIONS",
35
+ "CONTRACT_VERSION_PATTERN",
36
+ "NegotiationOk",
37
+ "NegotiationRefused",
38
+ "NegotiationResult",
39
+ "__version__",
40
+ "declared_versions_match",
41
+ "load_corpus",
42
+ "load_schema",
43
+ "manifest_contract_versions",
44
+ "negotiate_contract_version",
45
+ "spec_root",
46
+ ]
@@ -0,0 +1,160 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://raw.githubusercontent.com/nimbus-agent/nimbus-sdk/main/docs/spec/conformance/v1/framing/case.schema.json",
4
+ "title": "Framing conformance case",
5
+ "description": "One behavioral case: a sequence of chunks pushed into a reader, and what the reader must produce for each. Unlike the document fixtures alongside this corpus, a case is a stream, not a value.",
6
+ "type": "object",
7
+ "required": ["description", "chunks", "expect"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "description": {
11
+ "type": "string",
12
+ "pattern": "\\S",
13
+ "description": "What behavior this case pins, in one sentence."
14
+ },
15
+ "chunks": {
16
+ "type": "array",
17
+ "description": "Chunks to push, in order. May be empty, for the end-of-stream-with-nothing-buffered case.",
18
+ "items": { "$ref": "#/definitions/chunk" }
19
+ },
20
+ "expect": {
21
+ "type": "object",
22
+ "required": ["push"],
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "push": {
26
+ "type": "array",
27
+ "description": "Positionally parallel to chunks: element i is what push(chunks[i]) must produce. Length MUST equal the length of chunks.",
28
+ "items": {
29
+ "oneOf": [
30
+ {
31
+ "type": "array",
32
+ "description": "The frames this push emits, in order. Empty when the chunk completed no frame.",
33
+ "items": { "$ref": "#/definitions/frame" }
34
+ },
35
+ { "$ref": "#/definitions/error" }
36
+ ]
37
+ }
38
+ },
39
+ "flush": {
40
+ "description": "What draining at end-of-stream must produce. Omit when the case ends in an error and flush is therefore unreachable.",
41
+ "oneOf": [
42
+ {
43
+ "type": "object",
44
+ "required": ["frames", "truncated"],
45
+ "additionalProperties": false,
46
+ "properties": {
47
+ "frames": {
48
+ "type": "array",
49
+ "maxItems": 1,
50
+ "items": { "$ref": "#/definitions/frame" }
51
+ },
52
+ "truncated": {
53
+ "type": "boolean",
54
+ "description": "True when a frame is delivered that no LF terminated."
55
+ }
56
+ }
57
+ },
58
+ { "$ref": "#/definitions/error" }
59
+ ]
60
+ }
61
+ }
62
+ }
63
+ },
64
+ "definitions": {
65
+ "error": {
66
+ "type": "object",
67
+ "required": ["error"],
68
+ "additionalProperties": false,
69
+ "properties": {
70
+ "error": {
71
+ "enum": ["frame-too-long"],
72
+ "description": "Named symbolically so a binding maps it onto its own error type rather than matching a message."
73
+ }
74
+ },
75
+ "description": "The reader must fail this call. How the failure is expressed is a binding's business."
76
+ },
77
+ "frame": {
78
+ "oneOf": [
79
+ { "type": "string" },
80
+ { "$ref": "#/definitions/repeat" }
81
+ ],
82
+ "description": "An expected frame: a literal string, or a repeat descriptor when the frame is too large to inline."
83
+ },
84
+ "chunk": {
85
+ "oneOf": [
86
+ {
87
+ "type": "object",
88
+ "required": ["utf8"],
89
+ "additionalProperties": false,
90
+ "properties": { "utf8": { "type": "string" } },
91
+ "description": "Octets are this string encoded as UTF-8. The readable common case."
92
+ },
93
+ {
94
+ "type": "object",
95
+ "required": ["base64"],
96
+ "additionalProperties": false,
97
+ "properties": {
98
+ "base64": { "type": "string", "pattern": "^[A-Za-z0-9+/]*={0,2}$" }
99
+ },
100
+ "description": "Exact octets. Required for ill-formed UTF-8 and for sequences deliberately split across a boundary."
101
+ },
102
+ { "$ref": "#/definitions/repeat" },
103
+ {
104
+ "type": "object",
105
+ "required": ["concat"],
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "concat": {
109
+ "type": "array",
110
+ "minItems": 1,
111
+ "items": { "$ref": "#/definitions/chunk" }
112
+ },
113
+ "description": { "type": "string" }
114
+ },
115
+ "description": "One chunk built from several descriptors, for a single push that must contain both a large frame and its delimiter."
116
+ }
117
+ ]
118
+ },
119
+ "repeat": {
120
+ "type": "object",
121
+ "required": ["repeat"],
122
+ "additionalProperties": false,
123
+ "properties": {
124
+ "repeat": {
125
+ "type": "object",
126
+ "oneOf": [
127
+ {
128
+ "type": "object",
129
+ "required": ["byte", "count"],
130
+ "additionalProperties": false,
131
+ "properties": {
132
+ "byte": {
133
+ "type": "integer",
134
+ "minimum": 0,
135
+ "maximum": 255,
136
+ "description": "Repeat this octet."
137
+ },
138
+ "count": { "type": "integer", "minimum": 0 }
139
+ }
140
+ },
141
+ {
142
+ "type": "object",
143
+ "required": ["utf8", "count"],
144
+ "additionalProperties": false,
145
+ "properties": {
146
+ "utf8": {
147
+ "type": "string",
148
+ "minLength": 1,
149
+ "description": "Repeat this string's UTF-8 encoding. Use when the case must distinguish octets from characters."
150
+ },
151
+ "count": { "type": "integer", "minimum": 0 }
152
+ }
153
+ }
154
+ ]
155
+ }
156
+ },
157
+ "description": "Generated content, so a case at the 1 MiB limit costs a few lines rather than megabytes of base64."
158
+ }
159
+ }
160
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "zero-length frames are ignored rather than delivered or treated as an error",
3
+ "chunks": [{ "utf8": "a\n\n\r\nb\n" }],
4
+ "expect": {
5
+ "push": [["a", "b"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "the empty-frame rule holds at end-of-stream too: a bare CR remainder yields nothing and flags no truncation",
3
+ "chunks": [{ "utf8": "\r" }],
4
+ "expect": {
5
+ "push": [[]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a BOM at the very start of the stream is not part of the first frame",
3
+ "chunks": [{ "concat": [{ "base64": "77u/" }, { "utf8": "{\"a\":1}\n" }] }],
4
+ "expect": {
5
+ "push": [["{\"a\":1}"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "only the CR immediately before the LF is a delimiter; a CR elsewhere is content",
3
+ "chunks": [{ "utf8": "a\rb\n" }],
4
+ "expect": {
5
+ "push": [["a\rb"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a four-octet sequence split after its first octet decodes intact",
3
+ "chunks": [{ "base64": "8A==" }, { "base64": "n5iACg==" }],
4
+ "expect": {
5
+ "push": [[], ["😀"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a four-octet sequence split down the middle decodes intact",
3
+ "chunks": [{ "base64": "8J8=" }, { "base64": "mIAK" }],
4
+ "expect": {
5
+ "push": [[], ["😀"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a four-octet sequence split before its last octet decodes intact",
3
+ "chunks": [{ "base64": "8J+Y" }, { "base64": "gAo=" }],
4
+ "expect": {
5
+ "push": [[], ["😀"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a stream that carried nothing yields no frame and flags no truncation",
3
+ "chunks": [],
4
+ "expect": {
5
+ "push": [],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "a frame of exactly 1048576 octets is conformant — the limit is inclusive",
3
+ "chunks": [
4
+ { "concat": [{ "repeat": { "byte": 97, "count": 1048576 } }, { "utf8": "\n" }] }
5
+ ],
6
+ "expect": {
7
+ "push": [[{ "repeat": { "byte": 97, "count": 1048576 } }]],
8
+ "flush": { "frames": [], "truncated": false }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "a complete frame of 1048577 octets is rejected, and the rejection is terminal",
3
+ "chunks": [
4
+ { "concat": [{ "repeat": { "byte": 97, "count": 1048577 } }, { "utf8": "\n" }] }
5
+ ],
6
+ "expect": {
7
+ "push": [{ "error": "frame-too-long" }],
8
+ "flush": { "error": "frame-too-long" }
9
+ }
10
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "buffering holds across any number of chunks, not just one",
3
+ "chunks": [{ "utf8": "{" }, { "utf8": "\"a\":1" }, { "utf8": "}\n" }],
4
+ "expect": {
5
+ "push": [[], [], ["{\"a\":1}"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a frame split across two pushes emits nothing until the LF arrives",
3
+ "chunks": [{ "utf8": "{\"a\":1" }, { "utf8": "}\n" }],
4
+ "expect": {
5
+ "push": [[], ["{\"a\":1}"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "an incomplete multi-octet sequence at end-of-stream has no completion left to await and becomes U+FFFD",
3
+ "chunks": [{ "base64": "ww==" }],
4
+ "expect": {
5
+ "push": [[]],
6
+ "flush": { "frames": ["�"], "truncated": true }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "an octet that cannot begin a sequence becomes U+FFFD rather than failing the stream",
3
+ "chunks": [{ "base64": "/wo=" }],
4
+ "expect": {
5
+ "push": [["�"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "524289 two-octet characters are 1048578 octets and are rejected, though a reader counting characters would accept them",
3
+ "chunks": [{ "repeat": { "utf8": "é", "count": 524289 } }],
4
+ "expect": {
5
+ "push": [{ "error": "frame-too-long" }],
6
+ "flush": { "error": "frame-too-long" }
7
+ }
8
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "description": "a violation is terminal: the frame parsed ahead of the oversized one is not delivered, and a later push fails rather than resuming",
3
+ "chunks": [
4
+ {
5
+ "concat": [
6
+ { "utf8": "good\n" },
7
+ { "repeat": { "byte": 97, "count": 1048577 } },
8
+ { "utf8": "\n" }
9
+ ]
10
+ },
11
+ { "utf8": "after\n" }
12
+ ],
13
+ "expect": {
14
+ "push": [{ "error": "frame-too-long" }, { "error": "frame-too-long" }],
15
+ "flush": { "error": "frame-too-long" }
16
+ }
17
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "a continuation octet with no lead octet becomes U+FFFD",
3
+ "chunks": [{ "base64": "qQo=" }],
4
+ "expect": {
5
+ "push": [["�"]],
6
+ "flush": { "frames": [], "truncated": false }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "description": "the limit applies to the unterminated buffer, so a peer that never sends a newline cannot exhaust memory",
3
+ "chunks": [{ "repeat": { "byte": 97, "count": 1048577 } }],
4
+ "expect": {
5
+ "push": [{ "error": "frame-too-long" }],
6
+ "flush": { "error": "frame-too-long" }
7
+ }
8
+ }