@labacacia/nps-sdk 1.0.0-alpha.6 → 1.0.0-alpha.7

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 (365) hide show
  1. package/CHANGELOG.cn.md +115 -0
  2. package/CHANGELOG.md +124 -0
  3. package/README.cn.md +3 -1
  4. package/README.md +3 -1
  5. package/dist/core/anchor-cache.d.ts +42 -0
  6. package/dist/core/anchor-cache.d.ts.map +1 -0
  7. package/dist/core/anchor-cache.js +104 -0
  8. package/dist/core/anchor-cache.js.map +1 -0
  9. package/dist/core/cache.d.ts +14 -0
  10. package/dist/core/cache.d.ts.map +1 -0
  11. package/dist/core/cache.js +80 -0
  12. package/dist/core/cache.js.map +1 -0
  13. package/dist/core/canonical-json.d.ts +12 -0
  14. package/dist/core/canonical-json.d.ts.map +1 -0
  15. package/dist/core/canonical-json.js +44 -0
  16. package/dist/core/canonical-json.js.map +1 -0
  17. package/dist/core/codec.d.ts +32 -0
  18. package/dist/core/codec.d.ts.map +1 -0
  19. package/dist/core/codec.js +119 -0
  20. package/dist/core/codec.js.map +1 -0
  21. package/dist/core/codecs/index.d.ts +4 -0
  22. package/dist/core/codecs/index.d.ts.map +1 -0
  23. package/{src/core/codecs/index.ts → dist/core/codecs/index.js} +1 -0
  24. package/dist/core/codecs/index.js.map +1 -0
  25. package/dist/core/codecs/ncp-codec.d.ts +39 -0
  26. package/dist/core/codecs/ncp-codec.d.ts.map +1 -0
  27. package/dist/core/codecs/ncp-codec.js +93 -0
  28. package/dist/core/codecs/ncp-codec.js.map +1 -0
  29. package/dist/core/codecs/tier1-json-codec.d.ts +10 -0
  30. package/dist/core/codecs/tier1-json-codec.d.ts.map +1 -0
  31. package/{src/core/codecs/tier1-json-codec.ts → dist/core/codecs/tier1-json-codec.js} +11 -16
  32. package/dist/core/codecs/tier1-json-codec.js.map +1 -0
  33. package/dist/core/codecs/tier2-msgpack-codec.d.ts +10 -0
  34. package/dist/core/codecs/tier2-msgpack-codec.d.ts.map +1 -0
  35. package/{src/core/codecs/tier2-msgpack-codec.ts → dist/core/codecs/tier2-msgpack-codec.js} +10 -14
  36. package/dist/core/codecs/tier2-msgpack-codec.js.map +1 -0
  37. package/dist/core/crypto-provider.d.ts +31 -0
  38. package/dist/core/crypto-provider.d.ts.map +1 -0
  39. package/dist/core/crypto-provider.js +10 -0
  40. package/dist/core/crypto-provider.js.map +1 -0
  41. package/dist/core/exceptions.d.ts +27 -0
  42. package/dist/core/exceptions.d.ts.map +1 -0
  43. package/dist/core/exceptions.js +52 -0
  44. package/dist/core/exceptions.js.map +1 -0
  45. package/dist/core/frame-header.d.ts +87 -0
  46. package/dist/core/frame-header.d.ts.map +1 -0
  47. package/dist/core/frame-header.js +185 -0
  48. package/dist/core/frame-header.js.map +1 -0
  49. package/dist/core/frame-registry.d.ts +35 -0
  50. package/dist/core/frame-registry.d.ts.map +1 -0
  51. package/dist/core/frame-registry.js +63 -0
  52. package/dist/core/frame-registry.js.map +1 -0
  53. package/dist/core/frames.d.ts +81 -0
  54. package/dist/core/frames.d.ts.map +1 -0
  55. package/dist/core/frames.js +154 -0
  56. package/dist/core/frames.js.map +1 -0
  57. package/dist/core/index.d.ts +11 -0
  58. package/dist/core/index.d.ts.map +1 -0
  59. package/{src/core/index.ts → dist/core/index.js} +3 -23
  60. package/dist/core/index.js.map +1 -0
  61. package/dist/core/registry.d.ts +11 -0
  62. package/dist/core/registry.d.ts.map +1 -0
  63. package/dist/core/registry.js +17 -0
  64. package/dist/core/registry.js.map +1 -0
  65. package/dist/core/status-codes.d.ts +29 -0
  66. package/dist/core/status-codes.d.ts.map +1 -0
  67. package/dist/core/status-codes.js +39 -0
  68. package/dist/core/status-codes.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/{src/index.ts → dist/index.js} +1 -1
  72. package/dist/index.js.map +1 -0
  73. package/dist/ncp/frames/anchor-frame.d.ts +29 -0
  74. package/dist/ncp/frames/anchor-frame.d.ts.map +1 -0
  75. package/dist/ncp/frames/anchor-frame.js +54 -0
  76. package/dist/ncp/frames/anchor-frame.js.map +1 -0
  77. package/dist/ncp/frames/caps-frame.d.ts +29 -0
  78. package/dist/ncp/frames/caps-frame.d.ts.map +1 -0
  79. package/dist/ncp/frames/caps-frame.js +29 -0
  80. package/dist/ncp/frames/caps-frame.js.map +1 -0
  81. package/dist/ncp/frames/diff-frame.d.ts +32 -0
  82. package/dist/ncp/frames/diff-frame.d.ts.map +1 -0
  83. package/dist/ncp/frames/diff-frame.js +37 -0
  84. package/dist/ncp/frames/diff-frame.js.map +1 -0
  85. package/dist/ncp/frames/error-frame.d.ts +16 -0
  86. package/dist/ncp/frames/error-frame.d.ts.map +1 -0
  87. package/dist/ncp/frames/error-frame.js +13 -0
  88. package/dist/ncp/frames/error-frame.js.map +1 -0
  89. package/dist/ncp/frames/hello-frame.d.ts +21 -0
  90. package/dist/ncp/frames/hello-frame.d.ts.map +1 -0
  91. package/dist/ncp/frames/hello-frame.js +25 -0
  92. package/dist/ncp/frames/hello-frame.js.map +1 -0
  93. package/dist/ncp/frames/stream-frame.d.ts +16 -0
  94. package/dist/ncp/frames/stream-frame.d.ts.map +1 -0
  95. package/dist/ncp/frames/stream-frame.js +18 -0
  96. package/dist/ncp/frames/stream-frame.js.map +1 -0
  97. package/dist/ncp/frames.d.ts +94 -0
  98. package/dist/ncp/frames.d.ts.map +1 -0
  99. package/dist/ncp/frames.js +192 -0
  100. package/dist/ncp/frames.js.map +1 -0
  101. package/dist/ncp/handshake.d.ts +30 -0
  102. package/dist/ncp/handshake.d.ts.map +1 -0
  103. package/dist/ncp/handshake.js +80 -0
  104. package/dist/ncp/handshake.js.map +1 -0
  105. package/dist/ncp/index.d.ts +12 -0
  106. package/dist/ncp/index.d.ts.map +1 -0
  107. package/{src/ncp/index.ts → dist/ncp/index.js} +1 -0
  108. package/dist/ncp/index.js.map +1 -0
  109. package/dist/ncp/ncp-error-codes.d.ts +23 -0
  110. package/dist/ncp/ncp-error-codes.d.ts.map +1 -0
  111. package/dist/ncp/ncp-error-codes.js +34 -0
  112. package/dist/ncp/ncp-error-codes.js.map +1 -0
  113. package/dist/ncp/ncp-patch-format.d.ts +7 -0
  114. package/dist/ncp/ncp-patch-format.d.ts.map +1 -0
  115. package/dist/ncp/ncp-patch-format.js +13 -0
  116. package/dist/ncp/ncp-patch-format.js.map +1 -0
  117. package/dist/ncp/preamble.d.ts +47 -0
  118. package/dist/ncp/preamble.d.ts.map +1 -0
  119. package/dist/ncp/preamble.js +74 -0
  120. package/dist/ncp/preamble.js.map +1 -0
  121. package/dist/ncp/registry.d.ts +3 -0
  122. package/dist/ncp/registry.d.ts.map +1 -0
  123. package/dist/ncp/registry.js +13 -0
  124. package/dist/ncp/registry.js.map +1 -0
  125. package/dist/ncp/stream-manager.d.ts +57 -0
  126. package/dist/ncp/stream-manager.d.ts.map +1 -0
  127. package/dist/ncp/stream-manager.js +163 -0
  128. package/dist/ncp/stream-manager.js.map +1 -0
  129. package/dist/ndp/dns-txt.d.ts +35 -0
  130. package/dist/ndp/dns-txt.d.ts.map +1 -0
  131. package/dist/ndp/dns-txt.js +67 -0
  132. package/dist/ndp/dns-txt.js.map +1 -0
  133. package/dist/ndp/frames.d.ts +56 -0
  134. package/dist/ndp/frames.d.ts.map +1 -0
  135. package/dist/ndp/frames.js +87 -0
  136. package/dist/ndp/frames.js.map +1 -0
  137. package/dist/ndp/index.d.ts +6 -0
  138. package/dist/ndp/index.d.ts.map +1 -0
  139. package/{src/ndp/index.ts → dist/ndp/index.js} +1 -1
  140. package/dist/ndp/index.js.map +1 -0
  141. package/dist/ndp/ndp-registry.d.ts +13 -0
  142. package/dist/ndp/ndp-registry.d.ts.map +1 -0
  143. package/dist/ndp/ndp-registry.js +104 -0
  144. package/dist/ndp/ndp-registry.js.map +1 -0
  145. package/dist/ndp/registry.d.ts +3 -0
  146. package/dist/ndp/registry.d.ts.map +1 -0
  147. package/dist/ndp/registry.js +10 -0
  148. package/dist/ndp/registry.js.map +1 -0
  149. package/dist/ndp/validator.d.ts +18 -0
  150. package/dist/ndp/validator.d.ts.map +1 -0
  151. package/dist/ndp/validator.js +48 -0
  152. package/dist/ndp/validator.js.map +1 -0
  153. package/dist/nip/acme/client.d.ts +31 -0
  154. package/dist/nip/acme/client.d.ts.map +1 -0
  155. package/dist/nip/acme/client.js +136 -0
  156. package/dist/nip/acme/client.js.map +1 -0
  157. package/dist/nip/acme/index.d.ts +6 -0
  158. package/dist/nip/acme/index.d.ts.map +1 -0
  159. package/{src/nip/acme/index.ts → dist/nip/acme/index.js} +1 -1
  160. package/dist/nip/acme/index.js.map +1 -0
  161. package/dist/nip/acme/jws.d.ts +31 -0
  162. package/dist/nip/acme/jws.d.ts.map +1 -0
  163. package/dist/nip/acme/jws.js +76 -0
  164. package/dist/nip/acme/jws.js.map +1 -0
  165. package/dist/nip/acme/messages.d.ts +71 -0
  166. package/dist/nip/acme/messages.d.ts.map +1 -0
  167. package/dist/nip/acme/messages.js +4 -0
  168. package/dist/nip/acme/messages.js.map +1 -0
  169. package/dist/nip/acme/server.d.ts +41 -0
  170. package/dist/nip/acme/server.d.ts.map +1 -0
  171. package/dist/nip/acme/server.js +458 -0
  172. package/dist/nip/acme/server.js.map +1 -0
  173. package/dist/nip/acme/wire.d.ts +19 -0
  174. package/dist/nip/acme/wire.d.ts.map +1 -0
  175. package/dist/nip/acme/wire.js +21 -0
  176. package/dist/nip/acme/wire.js.map +1 -0
  177. package/dist/nip/assurance-level.d.ts +19 -0
  178. package/dist/nip/assurance-level.d.ts.map +1 -0
  179. package/dist/nip/assurance-level.js +38 -0
  180. package/dist/nip/assurance-level.js.map +1 -0
  181. package/dist/nip/cert-format.d.ts +5 -0
  182. package/dist/nip/cert-format.d.ts.map +1 -0
  183. package/dist/nip/cert-format.js +6 -0
  184. package/dist/nip/cert-format.js.map +1 -0
  185. package/dist/nip/error-codes.d.ts +25 -0
  186. package/dist/nip/error-codes.d.ts.map +1 -0
  187. package/{src/nip/error-codes.ts → dist/nip/error-codes.js} +19 -25
  188. package/dist/nip/error-codes.js.map +1 -0
  189. package/dist/nip/frames.d.ts +53 -0
  190. package/dist/nip/frames.d.ts.map +1 -0
  191. package/dist/nip/frames.js +106 -0
  192. package/dist/nip/frames.js.map +1 -0
  193. package/dist/nip/identity.d.ts +18 -0
  194. package/dist/nip/identity.d.ts.map +1 -0
  195. package/dist/nip/identity.js +94 -0
  196. package/dist/nip/identity.js.map +1 -0
  197. package/dist/nip/index.d.ts +11 -0
  198. package/dist/nip/index.d.ts.map +1 -0
  199. package/{src/nip/index.ts → dist/nip/index.js} +3 -2
  200. package/dist/nip/index.js.map +1 -0
  201. package/dist/nip/registry.d.ts +3 -0
  202. package/dist/nip/registry.d.ts.map +1 -0
  203. package/dist/nip/registry.js +10 -0
  204. package/dist/nip/registry.js.map +1 -0
  205. package/dist/nip/reputation-client.d.ts +116 -0
  206. package/dist/nip/reputation-client.d.ts.map +1 -0
  207. package/dist/nip/reputation-client.js +261 -0
  208. package/dist/nip/reputation-client.js.map +1 -0
  209. package/dist/nip/verifier.d.ts +23 -0
  210. package/dist/nip/verifier.d.ts.map +1 -0
  211. package/dist/nip/verifier.js +90 -0
  212. package/dist/nip/verifier.js.map +1 -0
  213. package/dist/nip/x509/builder.d.ts +35 -0
  214. package/dist/nip/x509/builder.d.ts.map +1 -0
  215. package/dist/nip/x509/builder.js +59 -0
  216. package/dist/nip/x509/builder.js.map +1 -0
  217. package/dist/nip/x509/index.d.ts +4 -0
  218. package/dist/nip/x509/index.d.ts.map +1 -0
  219. package/{src/nip/x509/index.ts → dist/nip/x509/index.js} +1 -1
  220. package/dist/nip/x509/index.js.map +1 -0
  221. package/dist/nip/x509/oids.d.ts +16 -0
  222. package/dist/nip/x509/oids.d.ts.map +1 -0
  223. package/{src/nip/x509/oids.ts → dist/nip/x509/oids.js} +5 -10
  224. package/dist/nip/x509/oids.js.map +1 -0
  225. package/dist/nip/x509/verifier.d.ts +26 -0
  226. package/dist/nip/x509/verifier.d.ts.map +1 -0
  227. package/dist/nip/x509/verifier.js +171 -0
  228. package/dist/nip/x509/verifier.js.map +1 -0
  229. package/dist/nop/client.d.ts +34 -0
  230. package/dist/nop/client.d.ts.map +1 -0
  231. package/dist/nop/client.js +90 -0
  232. package/dist/nop/client.js.map +1 -0
  233. package/dist/nop/frames.d.ts +65 -0
  234. package/dist/nop/frames.d.ts.map +1 -0
  235. package/dist/nop/frames.js +148 -0
  236. package/dist/nop/frames.js.map +1 -0
  237. package/dist/nop/index.d.ts +5 -0
  238. package/dist/nop/index.d.ts.map +1 -0
  239. package/{src/nop/index.ts → dist/nop/index.js} +1 -1
  240. package/dist/nop/index.js.map +1 -0
  241. package/dist/nop/models.d.ts +58 -0
  242. package/dist/nop/models.d.ts.map +1 -0
  243. package/dist/nop/models.js +50 -0
  244. package/dist/nop/models.js.map +1 -0
  245. package/dist/nop/nop-types.d.ts +136 -0
  246. package/dist/nop/nop-types.d.ts.map +1 -0
  247. package/dist/nop/nop-types.js +44 -0
  248. package/dist/nop/nop-types.js.map +1 -0
  249. package/dist/nop/registry.d.ts +3 -0
  250. package/dist/nop/registry.d.ts.map +1 -0
  251. package/dist/nop/registry.js +11 -0
  252. package/dist/nop/registry.js.map +1 -0
  253. package/dist/nwp/anchor-client.d.ts +109 -0
  254. package/dist/nwp/anchor-client.d.ts.map +1 -0
  255. package/dist/nwp/anchor-client.js +279 -0
  256. package/dist/nwp/anchor-client.js.map +1 -0
  257. package/dist/nwp/client.d.ts +22 -0
  258. package/dist/nwp/client.d.ts.map +1 -0
  259. package/dist/nwp/client.js +101 -0
  260. package/dist/nwp/client.js.map +1 -0
  261. package/dist/nwp/frames.d.ts +46 -0
  262. package/dist/nwp/frames.d.ts.map +1 -0
  263. package/dist/nwp/frames.js +81 -0
  264. package/dist/nwp/frames.js.map +1 -0
  265. package/dist/nwp/index.d.ts +5 -0
  266. package/dist/nwp/index.d.ts.map +1 -0
  267. package/{src/nwp/index.ts → dist/nwp/index.js} +2 -1
  268. package/dist/nwp/index.js.map +1 -0
  269. package/dist/nwp/registry.d.ts +3 -0
  270. package/dist/nwp/registry.d.ts.map +1 -0
  271. package/dist/nwp/registry.js +9 -0
  272. package/dist/nwp/registry.js.map +1 -0
  273. package/dist/setup.d.ts +10 -0
  274. package/dist/setup.d.ts.map +1 -0
  275. package/{src/setup.ts → dist/setup.js} +13 -16
  276. package/dist/setup.js.map +1 -0
  277. package/package.json +12 -1
  278. package/CONTRIBUTING.cn.md +0 -35
  279. package/CONTRIBUTING.md +0 -35
  280. package/nip-ca-server/Dockerfile +0 -27
  281. package/nip-ca-server/README.md +0 -45
  282. package/nip-ca-server/db/001_init.sql +0 -25
  283. package/nip-ca-server/docker-compose.yml +0 -29
  284. package/nip-ca-server/package.json +0 -23
  285. package/nip-ca-server/src/ca.ts +0 -155
  286. package/nip-ca-server/src/db.ts +0 -104
  287. package/nip-ca-server/src/index.ts +0 -157
  288. package/nip-ca-server/tsconfig.json +0 -13
  289. package/src/core/anchor-cache.ts +0 -129
  290. package/src/core/cache.ts +0 -93
  291. package/src/core/canonical-json.ts +0 -50
  292. package/src/core/codec.ts +0 -158
  293. package/src/core/codecs/ncp-codec.ts +0 -170
  294. package/src/core/crypto-provider.ts +0 -47
  295. package/src/core/exceptions.ts +0 -57
  296. package/src/core/frame-header.ts +0 -282
  297. package/src/core/frame-registry.ts +0 -91
  298. package/src/core/frames.ts +0 -184
  299. package/src/core/registry.ts +0 -28
  300. package/src/core/status-codes.ts +0 -47
  301. package/src/ncp/frames/anchor-frame.ts +0 -87
  302. package/src/ncp/frames/caps-frame.ts +0 -59
  303. package/src/ncp/frames/diff-frame.ts +0 -69
  304. package/src/ncp/frames/error-frame.ts +0 -26
  305. package/src/ncp/frames/hello-frame.ts +0 -50
  306. package/src/ncp/frames/stream-frame.ts +0 -35
  307. package/src/ncp/frames.ts +0 -251
  308. package/src/ncp/handshake.ts +0 -95
  309. package/src/ncp/ncp-error-codes.ts +0 -36
  310. package/src/ncp/ncp-patch-format.ts +0 -16
  311. package/src/ncp/preamble.ts +0 -79
  312. package/src/ncp/registry.ts +0 -15
  313. package/src/ncp/stream-manager.ts +0 -212
  314. package/src/ndp/dns-txt.ts +0 -86
  315. package/src/ndp/frames.ts +0 -124
  316. package/src/ndp/ndp-registry.ts +0 -116
  317. package/src/ndp/registry.ts +0 -12
  318. package/src/ndp/validator.ts +0 -64
  319. package/src/nip/acme/client.ts +0 -185
  320. package/src/nip/acme/jws.ts +0 -109
  321. package/src/nip/acme/messages.ts +0 -85
  322. package/src/nip/acme/server.ts +0 -480
  323. package/src/nip/acme/wire.ts +0 -24
  324. package/src/nip/assurance-level.ts +0 -40
  325. package/src/nip/cert-format.ts +0 -9
  326. package/src/nip/frames.ts +0 -138
  327. package/src/nip/identity.ts +0 -113
  328. package/src/nip/registry.ts +0 -12
  329. package/src/nip/verifier.ts +0 -122
  330. package/src/nip/x509/builder.ts +0 -91
  331. package/src/nip/x509/verifier.ts +0 -214
  332. package/src/nop/client.ts +0 -103
  333. package/src/nop/frames.ts +0 -181
  334. package/src/nop/models.ts +0 -79
  335. package/src/nop/nop-types.ts +0 -208
  336. package/src/nop/registry.ts +0 -13
  337. package/src/nwp/client.ts +0 -114
  338. package/src/nwp/frames.ts +0 -116
  339. package/src/nwp/registry.ts +0 -11
  340. package/tests/_rfc0002-keys.ts +0 -57
  341. package/tests/core/anchor-cache.test.ts +0 -242
  342. package/tests/core/codec.test.ts +0 -205
  343. package/tests/core/frame-registry.test.ts +0 -46
  344. package/tests/core.test.ts +0 -327
  345. package/tests/ncp/diff-binary-bitset.test.ts +0 -107
  346. package/tests/ncp/e2e-enc-reject.test.ts +0 -93
  347. package/tests/ncp/err-error-frame.test.ts +0 -152
  348. package/tests/ncp/frames.test.ts +0 -359
  349. package/tests/ncp/framing.test.ts +0 -233
  350. package/tests/ncp/hello-frame.test.ts +0 -122
  351. package/tests/ncp/inline-anchor.test.ts +0 -88
  352. package/tests/ncp/preamble.test.ts +0 -93
  353. package/tests/ncp/security.test.ts +0 -184
  354. package/tests/ncp/stream-window.test.ts +0 -167
  355. package/tests/ncp/stream.test.ts +0 -242
  356. package/tests/ncp/version-negotiation.test.ts +0 -123
  357. package/tests/ndp.test.ts +0 -377
  358. package/tests/nip-acme-agent01.test.ts +0 -192
  359. package/tests/nip-x509.test.ts +0 -280
  360. package/tests/nip.test.ts +0 -184
  361. package/tests/nop.test.ts +0 -344
  362. package/tests/nwp.test.ts +0 -237
  363. package/tsconfig.json +0 -20
  364. package/tsup.config.ts +0 -20
  365. package/vitest.config.ts +0 -10
@@ -0,0 +1,171 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Verifies NPS X.509 NID certificate chains per NPS-RFC-0002 §4.
5
+ *
6
+ * Stages (RFC §4.6):
7
+ * 1. Decode chain (base64url DER → @peculiar/x509 X509Certificate).
8
+ * 2. Leaf EKU check — critical, contains agent-identity OR node-identity OID.
9
+ * 3. Subject CN / SAN URI match against asserted NID.
10
+ * 4. Assurance-level extension match against asserted level (if both present).
11
+ * 5. Chain signature verification — leaf → intermediates → trusted root.
12
+ */
13
+ import * as x509 from "@peculiar/x509";
14
+ import { AssuranceLevel } from "../assurance-level.js";
15
+ import * as ec from "../error-codes.js";
16
+ import { EKU_AGENT_IDENTITY, EKU_NODE_IDENTITY, NID_ASSURANCE_LEVEL, OID_EXTENDED_KEY_USAGE, } from "./oids.js";
17
+ x509.cryptoProvider.set(globalThis.crypto);
18
+ function ok(leaf) {
19
+ return { valid: true, leaf };
20
+ }
21
+ function fail(errorCode, message) {
22
+ return { valid: false, errorCode, message };
23
+ }
24
+ export async function verify(opts) {
25
+ // Stage 1: decode chain ─────────────────────────────────────────────────
26
+ if (!opts.certChainBase64UrlDer.length) {
27
+ return fail(ec.CERT_FORMAT_INVALID, "cert_chain is empty");
28
+ }
29
+ let chain;
30
+ try {
31
+ chain = opts.certChainBase64UrlDer.map((s) => new x509.X509Certificate(b64uDecode(s).buffer));
32
+ }
33
+ catch (e) {
34
+ return fail(ec.CERT_FORMAT_INVALID, `DER decode failed: ${e.message}`);
35
+ }
36
+ const leaf = chain[0];
37
+ // Stage 2: EKU check ────────────────────────────────────────────────────
38
+ const ekuResult = checkLeafEku(leaf);
39
+ if (!ekuResult.valid)
40
+ return ekuResult;
41
+ // Stage 3: subject CN / SAN URI match ──────────────────────────────────
42
+ const subjectResult = checkSubjectNid(leaf, opts.assertedNid);
43
+ if (!subjectResult.valid)
44
+ return subjectResult;
45
+ // Stage 4: assurance-level extension ───────────────────────────────────
46
+ const assuranceResult = checkAssuranceLevel(leaf, opts.assertedAssuranceLevel);
47
+ if (!assuranceResult.valid)
48
+ return assuranceResult;
49
+ // Stage 5: chain signature verification ────────────────────────────────
50
+ const chainResult = await checkChainSignature(chain, opts.trustedRootCerts);
51
+ if (!chainResult.valid)
52
+ return chainResult;
53
+ return ok(leaf);
54
+ }
55
+ // ── Stage helpers ──────────────────────────────────────────────────────────
56
+ function checkLeafEku(leaf) {
57
+ const ekuExt = leaf.extensions.find((e) => e.type === OID_EXTENDED_KEY_USAGE);
58
+ if (!ekuExt) {
59
+ return fail(ec.CERT_EKU_MISSING, "leaf has no ExtendedKeyUsage extension");
60
+ }
61
+ if (!ekuExt.critical) {
62
+ return fail(ec.CERT_EKU_MISSING, "ExtendedKeyUsage extension is not marked critical");
63
+ }
64
+ const usages = ekuExt.usages;
65
+ if (!usages.includes(EKU_AGENT_IDENTITY) && !usages.includes(EKU_NODE_IDENTITY)) {
66
+ return fail(ec.CERT_EKU_MISSING, "ExtendedKeyUsage does not contain agent-identity or node-identity OID");
67
+ }
68
+ return ok(leaf);
69
+ }
70
+ function checkSubjectNid(leaf, assertedNid) {
71
+ // @peculiar/x509 parses the subject DN; iterate to find CN.
72
+ const cn = extractCn(leaf.subject);
73
+ if (cn !== assertedNid) {
74
+ return fail(ec.CERT_SUBJECT_NID_MISMATCH, `leaf subject CN (${cn ?? "<missing>"}) does not match asserted NID (${assertedNid})`);
75
+ }
76
+ const sanExt = leaf.getExtension(x509.SubjectAlternativeNameExtension);
77
+ if (!sanExt) {
78
+ return fail(ec.CERT_SUBJECT_NID_MISMATCH, "leaf has no Subject Alternative Name extension");
79
+ }
80
+ // SubjectAlternativeNameExtension exposes general-name objects with `type: "url"` for URIs.
81
+ const uris = sanExt.names
82
+ .toJSON()
83
+ .filter((n) => n.type === "url")
84
+ .map((n) => n.value);
85
+ if (!uris.includes(assertedNid)) {
86
+ return fail(ec.CERT_SUBJECT_NID_MISMATCH, "no SAN URI matches asserted NID");
87
+ }
88
+ return ok(leaf);
89
+ }
90
+ function checkAssuranceLevel(leaf, asserted) {
91
+ if (asserted === null)
92
+ return ok(leaf);
93
+ const ext = leaf.extensions.find((e) => e.type === NID_ASSURANCE_LEVEL);
94
+ if (!ext) {
95
+ // Optional in v0.1 — pass silently.
96
+ return ok(leaf);
97
+ }
98
+ const der = new Uint8Array(ext.value);
99
+ // Decode ASN.1 ENUMERATED: tag=0x0A, len=0x01, content=<rank>.
100
+ if (der.length !== 3 || der[0] !== 0x0A || der[1] !== 0x01) {
101
+ return fail(ec.CERT_FORMAT_INVALID, `malformed assurance-level extension: ${Buffer.from(der).toString("hex")}`);
102
+ }
103
+ const rank = der[2];
104
+ let certLevel;
105
+ try {
106
+ certLevel = AssuranceLevel.fromRank(rank);
107
+ }
108
+ catch {
109
+ return fail(ec.ASSURANCE_UNKNOWN, `assurance-level extension contains unknown value: ${rank}`);
110
+ }
111
+ if (certLevel !== asserted) {
112
+ return fail(ec.ASSURANCE_MISMATCH, `cert assurance-level (${certLevel.wire}) does not match asserted (${asserted.wire})`);
113
+ }
114
+ return ok(leaf);
115
+ }
116
+ async function checkChainSignature(chain, trustedRoots) {
117
+ if (!trustedRoots.length) {
118
+ return fail(ec.CERT_FORMAT_INVALID, "no trusted X.509 roots configured");
119
+ }
120
+ try {
121
+ // Walk leaf → intermediates: each must be signed by its successor.
122
+ for (let i = 0; i < chain.length - 1; i++) {
123
+ const okStep = await chain[i].verify({ publicKey: await chain[i + 1].publicKey.export(), signatureOnly: true });
124
+ if (!okStep) {
125
+ return fail(ec.CERT_FORMAT_INVALID, `chain link ${i} signature did not verify`);
126
+ }
127
+ }
128
+ // The last cert in the chain MUST chain to a trusted root.
129
+ const last = chain[chain.length - 1];
130
+ for (const root of trustedRoots) {
131
+ if (Buffer.from(last.rawData).equals(Buffer.from(root.rawData))) {
132
+ return ok(chain[0]);
133
+ }
134
+ try {
135
+ const okStep = await last.verify({ publicKey: await root.publicKey.export(), signatureOnly: true });
136
+ if (okStep)
137
+ return ok(chain[0]);
138
+ }
139
+ catch {
140
+ /* try next root */
141
+ }
142
+ }
143
+ return fail(ec.CERT_FORMAT_INVALID, "chain does not anchor to any trusted root");
144
+ }
145
+ catch (e) {
146
+ return fail(ec.CERT_FORMAT_INVALID, `chain signature verification error: ${e.message}`);
147
+ }
148
+ }
149
+ // ── helpers ────────────────────────────────────────────────────────────────
150
+ function extractCn(dn) {
151
+ // @peculiar/x509 returns DN strings in RFC 4514 format ("CN=...,O=...").
152
+ for (const rdn of dn.split(",")) {
153
+ const trimmed = rdn.trim();
154
+ if (trimmed.startsWith("CN=")) {
155
+ let value = trimmed.slice(3);
156
+ // Strip surrounding quotes if any.
157
+ if (value.startsWith("\"") && value.endsWith("\"")) {
158
+ value = value.slice(1, -1);
159
+ }
160
+ // Unescape.
161
+ return value.replace(/\\([",+;<>\\])/g, "$1");
162
+ }
163
+ }
164
+ return null;
165
+ }
166
+ function b64uDecode(s) {
167
+ const padded = s + "=".repeat((4 - (s.length % 4)) % 4);
168
+ const std = padded.replace(/-/g, "+").replace(/_/g, "/");
169
+ return new Uint8Array(Buffer.from(std, "base64"));
170
+ }
171
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/nip/x509/verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { EncodingTier } from "../core/frames.js";
2
+ import { FrameRegistry } from "../core/registry.js";
3
+ import { TaskState } from "./models.js";
4
+ import type { TaskFrame } from "./frames.js";
5
+ export declare class NopTaskStatus {
6
+ private readonly _raw;
7
+ constructor(_raw: Record<string, unknown>);
8
+ get taskId(): string;
9
+ get state(): TaskState;
10
+ get isTerminal(): boolean;
11
+ get aggregatedResult(): unknown;
12
+ get errorCode(): string | undefined;
13
+ get errorMessage(): string | undefined;
14
+ get nodeResults(): Record<string, unknown>;
15
+ get raw(): Record<string, unknown>;
16
+ toString(): string;
17
+ }
18
+ export declare class NopClient {
19
+ private readonly _baseUrl;
20
+ private readonly _codec;
21
+ private readonly _tier;
22
+ constructor(baseUrl: string, options?: {
23
+ defaultTier?: EncodingTier;
24
+ registry?: FrameRegistry;
25
+ });
26
+ submit(frame: TaskFrame): Promise<string>;
27
+ getStatus(taskId: string): Promise<NopTaskStatus>;
28
+ cancel(taskId: string): Promise<void>;
29
+ wait(taskId: string, options?: {
30
+ pollIntervalMs?: number;
31
+ timeoutMs?: number;
32
+ }): Promise<NopTaskStatus>;
33
+ }
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/nop/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1D,IAAI,MAAM,IAAc,MAAM,CAAyD;IACvF,IAAI,KAAK,IAAe,SAAS,CAAsD;IACvF,IAAI,UAAU,IAAU,OAAO,CAA6E;IAC5G,IAAI,gBAAgB,IAAI,OAAO,CAAuD;IACtF,IAAI,SAAS,IAAW,MAAM,GAAG,SAAS,CAAwE;IAClH,IAAI,YAAY,IAAQ,MAAM,GAAG,SAAS,CAAwE;IAClH,IAAI,WAAW,IAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAqF;IACpI,IAAI,GAAG,IAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB;IAErE,QAAQ,IAAI,MAAM;CAGnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAGtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;KAAO;IAclE,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQjD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,IAAI,CACR,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC5D,OAAO,CAAC,aAAa,CAAC;CAgB1B"}
@@ -0,0 +1,90 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { NpsFrameCodec } from "../core/codec.js";
4
+ import { EncodingTier } from "../core/frames.js";
5
+ import { FrameRegistry } from "../core/registry.js";
6
+ import { registerNcpFrames } from "../ncp/registry.js";
7
+ import { registerNopFrames } from "./registry.js";
8
+ import { TaskState } from "./models.js";
9
+ const TERMINAL_STATES = new Set([
10
+ TaskState.COMPLETED,
11
+ TaskState.FAILED,
12
+ TaskState.CANCELLED,
13
+ ]);
14
+ export class NopTaskStatus {
15
+ _raw;
16
+ constructor(_raw) {
17
+ this._raw = _raw;
18
+ }
19
+ get taskId() { return this._raw["task_id"]; }
20
+ get state() { return this._raw["state"]; }
21
+ get isTerminal() { return TERMINAL_STATES.has(this._raw["state"]); }
22
+ get aggregatedResult() { return this._raw["aggregated_result"]; }
23
+ get errorCode() { return this._raw["error_code"] ?? undefined; }
24
+ get errorMessage() { return this._raw["error_message"] ?? undefined; }
25
+ get nodeResults() { return this._raw["node_results"] ?? {}; }
26
+ get raw() { return this._raw; }
27
+ toString() {
28
+ return `NopTaskStatus(taskId=${this.taskId}, state=${String(this._raw["state"])})`;
29
+ }
30
+ }
31
+ export class NopClient {
32
+ _baseUrl;
33
+ _codec;
34
+ _tier;
35
+ constructor(baseUrl, options = {}) {
36
+ this._baseUrl = baseUrl.replace(/\/$/, "");
37
+ this._tier = options.defaultTier ?? EncodingTier.MSGPACK;
38
+ const registry = options.registry ?? (() => {
39
+ const r = new FrameRegistry();
40
+ registerNcpFrames(r);
41
+ registerNopFrames(r);
42
+ return r;
43
+ })();
44
+ this._codec = new NpsFrameCodec(registry);
45
+ }
46
+ async submit(frame) {
47
+ const wire = this._codec.encode(frame, { overrideTier: this._tier });
48
+ const res = await fetch(`${this._baseUrl}/task`, {
49
+ method: "POST",
50
+ body: wire,
51
+ headers: { "Content-Type": "application/x-nps-frame", "Accept": "application/json" },
52
+ });
53
+ if (!res.ok)
54
+ throw new Error(`NOP /task failed: HTTP ${res.status}`);
55
+ const data = await res.json();
56
+ return data["task_id"];
57
+ }
58
+ async getStatus(taskId) {
59
+ const res = await fetch(`${this._baseUrl}/task/${taskId}`, {
60
+ headers: { "Accept": "application/json" },
61
+ });
62
+ if (!res.ok)
63
+ throw new Error(`NOP /task/${taskId} failed: HTTP ${res.status}`);
64
+ return new NopTaskStatus(await res.json());
65
+ }
66
+ async cancel(taskId) {
67
+ const res = await fetch(`${this._baseUrl}/task/${taskId}/cancel`, {
68
+ method: "POST",
69
+ headers: { "Accept": "application/json" },
70
+ });
71
+ if (!res.ok)
72
+ throw new Error(`NOP /task/${taskId}/cancel failed: HTTP ${res.status}`);
73
+ }
74
+ async wait(taskId, options = {}) {
75
+ const pollIntervalMs = options.pollIntervalMs ?? 1000;
76
+ const timeoutMs = options.timeoutMs ?? 30_000;
77
+ const deadline = Date.now() + timeoutMs;
78
+ while (true) {
79
+ const status = await this.getStatus(taskId);
80
+ if (status.isTerminal)
81
+ return status;
82
+ const remaining = deadline - Date.now();
83
+ if (remaining <= 0) {
84
+ throw new Error(`Task '${taskId}' did not complete within ${timeoutMs}ms (state: ${String(status.raw["state"])}).`);
85
+ }
86
+ await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, remaining)));
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/nop/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { EncodingTier, FrameType } from "../core/frames.js";
2
+ import type { NpsFrame } from "../core/codec.js";
3
+ import type { AggregateStrategy, TaskContext, TaskDag, TaskPriority } from "./models.js";
4
+ export declare class TaskFrame implements NpsFrame {
5
+ readonly taskId: string;
6
+ readonly dag: TaskDag;
7
+ readonly timeoutMs?: number | undefined;
8
+ readonly callbackUrl?: string | undefined;
9
+ readonly context?: TaskContext | undefined;
10
+ readonly priority?: TaskPriority | undefined;
11
+ readonly depth?: number | undefined;
12
+ readonly frameType = FrameType.TASK;
13
+ readonly preferredTier = EncodingTier.MSGPACK;
14
+ constructor(taskId: string, dag: TaskDag, timeoutMs?: number | undefined, callbackUrl?: string | undefined, context?: TaskContext | undefined, priority?: TaskPriority | undefined, depth?: number | undefined);
15
+ toDict(): Record<string, unknown>;
16
+ static fromDict(data: Record<string, unknown>): TaskFrame;
17
+ }
18
+ export declare class DelegateFrame implements NpsFrame {
19
+ readonly taskId: string;
20
+ readonly subtaskId: string;
21
+ readonly action: string;
22
+ readonly agentNid: string;
23
+ readonly inputs?: Record<string, unknown> | undefined;
24
+ readonly params?: Record<string, unknown> | undefined;
25
+ readonly idempotencyKey?: string | undefined;
26
+ readonly frameType = FrameType.DELEGATE;
27
+ readonly preferredTier = EncodingTier.MSGPACK;
28
+ constructor(taskId: string, subtaskId: string, action: string, agentNid: string, inputs?: Record<string, unknown> | undefined, params?: Record<string, unknown> | undefined, idempotencyKey?: string | undefined);
29
+ toDict(): Record<string, unknown>;
30
+ static fromDict(data: Record<string, unknown>): DelegateFrame;
31
+ }
32
+ export declare class SyncFrame implements NpsFrame {
33
+ readonly taskId: string;
34
+ readonly syncId: string;
35
+ readonly waitFor: readonly string[];
36
+ readonly minRequired: number;
37
+ readonly aggregate: AggregateStrategy | string;
38
+ readonly timeoutMs?: number | undefined;
39
+ readonly frameType = FrameType.SYNC;
40
+ readonly preferredTier = EncodingTier.MSGPACK;
41
+ constructor(taskId: string, syncId: string, waitFor: readonly string[], minRequired?: number, aggregate?: AggregateStrategy | string, timeoutMs?: number | undefined);
42
+ toDict(): Record<string, unknown>;
43
+ static fromDict(data: Record<string, unknown>): SyncFrame;
44
+ }
45
+ export interface StreamError {
46
+ errorCode: string;
47
+ message?: string;
48
+ }
49
+ export declare class AlignStreamFrame implements NpsFrame {
50
+ readonly streamId: string;
51
+ readonly taskId: string;
52
+ readonly subtaskId: string;
53
+ readonly seq: number;
54
+ readonly isFinal: boolean;
55
+ readonly senderNid: string;
56
+ readonly data?: Record<string, unknown> | undefined;
57
+ readonly error?: StreamError | undefined;
58
+ readonly windowSize?: number | undefined;
59
+ readonly frameType = FrameType.ALIGN_STREAM;
60
+ readonly preferredTier = EncodingTier.MSGPACK;
61
+ constructor(streamId: string, taskId: string, subtaskId: string, seq: number, isFinal: boolean, senderNid: string, data?: Record<string, unknown> | undefined, error?: StreamError | undefined, windowSize?: number | undefined);
62
+ toDict(): Record<string, unknown>;
63
+ static fromDict(data: Record<string, unknown>): AlignStreamFrame;
64
+ }
65
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/nop/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { EncodingTier, FrameType } from "../core/frames.js";
4
+ // ── TaskFrame ─────────────────────────────────────────────────────────────────
5
+ export class TaskFrame {
6
+ taskId;
7
+ dag;
8
+ timeoutMs;
9
+ callbackUrl;
10
+ context;
11
+ priority;
12
+ depth;
13
+ frameType = FrameType.TASK;
14
+ preferredTier = EncodingTier.MSGPACK;
15
+ constructor(taskId, dag, timeoutMs, callbackUrl, context, priority, depth) {
16
+ this.taskId = taskId;
17
+ this.dag = dag;
18
+ this.timeoutMs = timeoutMs;
19
+ this.callbackUrl = callbackUrl;
20
+ this.context = context;
21
+ this.priority = priority;
22
+ this.depth = depth;
23
+ }
24
+ toDict() {
25
+ return {
26
+ task_id: this.taskId,
27
+ dag: this.dag,
28
+ timeout_ms: this.timeoutMs ?? null,
29
+ callback_url: this.callbackUrl ?? null,
30
+ context: this.context ?? null,
31
+ priority: this.priority ?? null,
32
+ depth: this.depth ?? null,
33
+ };
34
+ }
35
+ static fromDict(data) {
36
+ return new TaskFrame(data["task_id"], data["dag"], data["timeout_ms"] ?? undefined, data["callback_url"] ?? undefined, data["context"] ?? undefined, data["priority"] ?? undefined, data["depth"] ?? undefined);
37
+ }
38
+ }
39
+ // ── DelegateFrame ─────────────────────────────────────────────────────────────
40
+ export class DelegateFrame {
41
+ taskId;
42
+ subtaskId;
43
+ action;
44
+ agentNid;
45
+ inputs;
46
+ params;
47
+ idempotencyKey;
48
+ frameType = FrameType.DELEGATE;
49
+ preferredTier = EncodingTier.MSGPACK;
50
+ constructor(taskId, subtaskId, action, agentNid, inputs, params, idempotencyKey) {
51
+ this.taskId = taskId;
52
+ this.subtaskId = subtaskId;
53
+ this.action = action;
54
+ this.agentNid = agentNid;
55
+ this.inputs = inputs;
56
+ this.params = params;
57
+ this.idempotencyKey = idempotencyKey;
58
+ }
59
+ toDict() {
60
+ return {
61
+ task_id: this.taskId,
62
+ subtask_id: this.subtaskId,
63
+ action: this.action,
64
+ agent_nid: this.agentNid,
65
+ inputs: this.inputs ?? null,
66
+ params: this.params ?? null,
67
+ idempotency_key: this.idempotencyKey ?? null,
68
+ };
69
+ }
70
+ static fromDict(data) {
71
+ return new DelegateFrame(data["task_id"], data["subtask_id"], data["action"], data["agent_nid"], data["inputs"] ?? undefined, data["params"] ?? undefined, data["idempotency_key"] ?? undefined);
72
+ }
73
+ }
74
+ // ── SyncFrame ─────────────────────────────────────────────────────────────────
75
+ export class SyncFrame {
76
+ taskId;
77
+ syncId;
78
+ waitFor;
79
+ minRequired;
80
+ aggregate;
81
+ timeoutMs;
82
+ frameType = FrameType.SYNC;
83
+ preferredTier = EncodingTier.MSGPACK;
84
+ constructor(taskId, syncId, waitFor, minRequired = 0, aggregate = "merge", timeoutMs) {
85
+ this.taskId = taskId;
86
+ this.syncId = syncId;
87
+ this.waitFor = waitFor;
88
+ this.minRequired = minRequired;
89
+ this.aggregate = aggregate;
90
+ this.timeoutMs = timeoutMs;
91
+ }
92
+ toDict() {
93
+ return {
94
+ task_id: this.taskId,
95
+ sync_id: this.syncId,
96
+ wait_for: this.waitFor,
97
+ min_required: this.minRequired,
98
+ aggregate: this.aggregate,
99
+ timeout_ms: this.timeoutMs ?? null,
100
+ };
101
+ }
102
+ static fromDict(data) {
103
+ return new SyncFrame(data["task_id"], data["sync_id"], data["wait_for"], data["min_required"] ?? 0, data["aggregate"] ?? "merge", data["timeout_ms"] ?? undefined);
104
+ }
105
+ }
106
+ // ── AlignStreamFrame ──────────────────────────────────────────────────────────
107
+ export class AlignStreamFrame {
108
+ streamId;
109
+ taskId;
110
+ subtaskId;
111
+ seq;
112
+ isFinal;
113
+ senderNid;
114
+ data;
115
+ error;
116
+ windowSize;
117
+ frameType = FrameType.ALIGN_STREAM;
118
+ preferredTier = EncodingTier.MSGPACK;
119
+ constructor(streamId, taskId, subtaskId, seq, isFinal, senderNid, data, error, windowSize) {
120
+ this.streamId = streamId;
121
+ this.taskId = taskId;
122
+ this.subtaskId = subtaskId;
123
+ this.seq = seq;
124
+ this.isFinal = isFinal;
125
+ this.senderNid = senderNid;
126
+ this.data = data;
127
+ this.error = error;
128
+ this.windowSize = windowSize;
129
+ }
130
+ toDict() {
131
+ return {
132
+ stream_id: this.streamId,
133
+ task_id: this.taskId,
134
+ subtask_id: this.subtaskId,
135
+ seq: this.seq,
136
+ is_final: this.isFinal,
137
+ sender_nid: this.senderNid,
138
+ data: this.data ?? null,
139
+ error: this.error ? { error_code: this.error.errorCode, message: this.error.message ?? null } : null,
140
+ window_size: this.windowSize ?? null,
141
+ };
142
+ }
143
+ static fromDict(data) {
144
+ const rawError = data["error"];
145
+ return new AlignStreamFrame(data["stream_id"], data["task_id"], data["subtask_id"], data["seq"], data["is_final"], data["sender_nid"], data["data"] ?? undefined, rawError ? { errorCode: rawError.error_code, ...(rawError.message != null ? { message: rawError.message } : {}) } : undefined, data["window_size"] ?? undefined);
146
+ }
147
+ }
148
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/nop/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./models.js";
2
+ export * from "./frames.js";
3
+ export * from "./registry.js";
4
+ export * from "./client.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nop/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 INNO LOTUS PTY LTD
2
2
  // SPDX-License-Identifier: Apache-2.0
3
-
4
3
  export * from "./models.js";
5
4
  export * from "./frames.js";
6
5
  export * from "./registry.js";
7
6
  export * from "./client.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nop/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,58 @@
1
+ export declare enum TaskState {
2
+ PENDING = "pending",
3
+ PREFLIGHT = "preflight",
4
+ RUNNING = "running",
5
+ WAITING_SYNC = "waiting_sync",
6
+ COMPLETED = "completed",
7
+ FAILED = "failed",
8
+ CANCELLED = "cancelled",
9
+ SKIPPED = "skipped"
10
+ }
11
+ export declare enum TaskPriority {
12
+ LOW = "low",
13
+ NORMAL = "normal",
14
+ HIGH = "high"
15
+ }
16
+ export declare enum BackoffStrategy {
17
+ FIXED = "fixed",
18
+ LINEAR = "linear",
19
+ EXPONENTIAL = "exponential"
20
+ }
21
+ export declare enum AggregateStrategy {
22
+ MERGE = "merge",
23
+ FIRST = "first",
24
+ FASTEST_K = "fastest_k",
25
+ ALL = "all"
26
+ }
27
+ export interface RetryPolicy {
28
+ maxRetries: number;
29
+ backoff: BackoffStrategy;
30
+ baseDelayMs?: number;
31
+ maxDelayMs?: number;
32
+ }
33
+ export declare function computeDelayMs(policy: RetryPolicy, attempt: number): number;
34
+ export interface TaskContext {
35
+ sessionKey?: string;
36
+ requesterNid?: string;
37
+ traceId?: string;
38
+ }
39
+ export interface DagNode {
40
+ id: string;
41
+ action: string;
42
+ agent: string;
43
+ inputFrom?: readonly string[];
44
+ inputMapping?: Record<string, string>;
45
+ timeoutMs?: number;
46
+ retryPolicy?: RetryPolicy;
47
+ condition?: string;
48
+ minRequired?: number;
49
+ }
50
+ export interface DagEdge {
51
+ from: string;
52
+ to: string;
53
+ }
54
+ export interface TaskDag {
55
+ nodes: readonly DagNode[];
56
+ edges: readonly DagEdge[];
57
+ }
58
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/nop/models.ts"],"names":[],"mappings":"AAGA,oBAAY,SAAS;IACnB,OAAO,YAAkB;IACzB,SAAS,cAAkB;IAC3B,OAAO,YAAkB;IACzB,YAAY,iBAAkB;IAC9B,SAAS,cAAkB;IAC3B,MAAM,WAAkB;IACxB,SAAS,cAAkB;IAC3B,OAAO,YAAkB;CAC1B;AAED,oBAAY,YAAY;IACtB,GAAG,QAAW;IACd,MAAM,WAAW;IACjB,IAAI,SAAW;CAChB;AAED,oBAAY,eAAe;IACzB,KAAK,UAAgB;IACrB,MAAM,WAAgB;IACtB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,iBAAiB;IAC3B,KAAK,UAAe;IACpB,KAAK,UAAe;IACpB,SAAS,cAAe;IACxB,GAAG,QAAe;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAI,MAAM,CAAC;IACrB,OAAO,EAAO,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAG,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAU3E;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAK,MAAM,CAAC;IACvB,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAQ,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAc,MAAM,CAAC;IACvB,MAAM,EAAU,MAAM,CAAC;IACvB,KAAK,EAAW,MAAM,CAAC;IACvB,SAAS,CAAC,EAAM,SAAS,MAAM,EAAE,CAAC;IAClC,YAAY,CAAC,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,WAAW,CAAC,EAAI,WAAW,CAAC;IAC5B,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,WAAW,CAAC,EAAI,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAI,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;CAC3B"}